[x3d-public] example x3d.py python code using numpy library

Brutzman, Donald (Don) (CIV) brutzman at nps.edu
Mon Feb 28 09:27:04 PST 2022


Based on the elegant list-comprehension expressions in the following two
lines

 

*	coord = Coordinate( point = [ tuple(pt) for pt in point_coordinates]
),

 

*	color = Color( color = [tuple(c) for c in point_colors])

 

These types of expressions could certainly be added to MFVec3f, MFColor,
etc. which would continue flexibility of current duck typing across full
diversity of X3D field types.

 

Presumably the key precondition for applying them will be  proper detection
of type, e.g.

 

*	if isinstance(value, np.array) # and further checking that elements
of arrays are tuples

 

I will eventually be able to fumble around and get something hacked
together, putting it into the fieldtype value setter. (Or keep them as a
separate utility if numpy dependency needs to be avoided.)

 

If you can help with type checking to avoid numpy GIGO problems, please toss
me an example.  Presumably if we can get numpy working then we can support
other lists of tuples as well.

 

FWIW, example target excerpted from package x3d.py follows.  (The
triple-hash ### blocks were form used prior to latest refactoring, they'll
get deleted once confirmed that all functionality is handled in new code.)

 

===========================

class MFVec3f(_X3DArrayField):

    """

    Field type MFVec3f is an array of SFVec3f values. Individual singleton
SFVec3f array values are optionally separated by commas in XML syntax.

    """

# [.snip.]

 

    @property # getter - - - - - - - - - -

    def value(self):

        """ Provide typed value of this field instance. """

        return self.__value

    @value.setter

    def value(self, value):

        """ The value setter only allows correctly typed values. """

        if isinstance(value,SFVec3f):

            value = value.value # dereference

        elif value is None:

            value = MFVec3f.DEFAULT_VALUE()

            # if _DEBUG: print('...DEBUG... set value to
MFVec3f.DEFAULT_VALUE()=' + str(MFVec3f.DEFAULT_VALUE()))

        elif isinstance(value, list):

            for each in value: # check that elements are not tuples

                if isinstance(each, tuple):

                    break

            else: # no tuples found, create 3-tuples

                value = [(x, y, z) for x, y, z in value]

    ###     elif not isinstance(value, list) and isValidSFVec3f(value):

    ###         print(' upcast to MF type', value)

    ###         value = MFVec3f(SFVec3f(value))

        elif isinstance(value, list):

            if not value is None and not (isinstance(value,list) and
len(value) == 0):

                _newValue = []

                for each in value:

                    _newValue.append(SFVec3f(each).value)

                # if _DEBUG: print('...DEBUG... assign list, value=' +
str(value), ', type=' + str(type(value)), ', _newValue=' +
str(_newValue),flush=True)

                value = _newValue

        elif isinstance(value, str):

            value = [ float(value) ]

        self.__value = value

 

# and

 

    def append(self, value=None):

        """ Add to existing value list, first ensuring that a correctly
typed value is applied. """

        if  not value is None:

 

            # if _DEBUG: print('...DEBUG... append to list, value=' +
str(self.__value), ', type=' + str(type(self.__value)), ', value=' +
str(value),flush=True)

            if isinstance(value,SFVec3f):

                self.__value.append(value.value) # dereference

            elif not isinstance(value,list) and not
isinstance(value,MFVec3f):

                self.__value.append(SFVec3f(value).value) # checks validity

            elif (isinstance(value,list) and len(value) > 0) or
isinstance(value,MFVec3f):

                for each in value:

                    self.__value.append(SFVec3f(each).value) # checks
validity

            elif isinstance(value,str):

                self.__value.append(SFVec3f(value).value) # checks validity

    ###     if  not value is None:

    ###         if isValidSFVec3f(value):

    ###             if isinstance(value, SFVec3f):

    ###                 value = SFVec3f(value).value # dereference value
from base type

    ###             self.__value.append(value)

    ###         elif isValidMFVec3f(value):

    ###             for each in value:

    ###                 while isinstance(each, list) and len(each) == 1:

    ###                     each = each[0] # dereference

    ###                 if isinstance(each, SFVec3f):

    ###                     each = each.value # dereference

    ###                 self.__value.append(each)

    ###         else:

    ###             assertValidMFVec3f(value) # report type failure

    def __bool__(self):

        if not isinstance(self.__value,list):

 

            print('*** x3d.py internal error, MFVec3f self.__value type=' +
str(type(self.__value)) + ' is not a list', flush=True)

        return len(self.__value) > 0

# [.snip.]

===========================

 

all the best, Don

-- 

Don Brutzman  Naval Postgraduate School, Code USW/Br        brutzman at nps.edu

Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149

X3D graphics, virtual worlds, Navy robotics https://
faculty.nps.edu/brutzman

 

-----Original Message-----
From: Brutzman, Donald (Don) (CIV) <brutzman at nps.edu> 
Sent: Sunday, February 27, 2022 7:42 AM
To: vmarchetti at kshell.com
Cc: X3D Public Mailing List (x3d-public at web3d.org) <x3d-public at web3d.org>;
Hans Moritz Guenther <hgunther at mit.edu>; Brutzman, Donald (Don) (CIV)
<brutzman at nps.edu>
Subject: RE: example python code using numpy library

 

[cc: Moritz]

 

Looks like our enterprise mail server (configured by Microsoft in a cloud)

scrubs all .py attachments.

 

I was able to retrieve your example by going to the Web3D-archived version

at

 

*
<http://web3d.org/pipermail/x3d-public_web3d.org/2022-February/016818.html>
http://web3d.org/pipermail/x3d-public_web3d.org/2022-February/016818.html

 

and then saving attachment.bin as NumpyExample.py

 

Thank you Vince, looks interesting.  Am also copying source here in case

anyone has further retrieval difficulties.

 

NumpyExample.py

======================================

"""

Script to demonstrate setting the values of the coordinates, colors (by

vertex), and index arrays defining

an IndexedTriangleSet from data values in numpy arrays.

Tested Feb 24 2022 with x3d version 4.0.51   installed with pip

Vince Marchetti 24 Feb 2022

license :  <https://creativecommons.org/licenses/by/4.0/>
https://creativecommons.org/licenses/by/4.0/

"""

from x3d.x3d import *

import numpy as np

def colored_tetrahedron( radius ):

    """

    returns (3,) tuple of numpy arrays

    points_coordinate : a (N,3) array of vertex coordinates

    points_colors : (N,3) array of colors

    face_indices : (K,3) array of integer indices into points_* arrays

    

    where N = number of vertices in mesh (N=4 for this tetrahedron)

          K = number of triangle faces in mesh (K=5 for tetrahedron)

          

    defines a mesh for a tetrahedron inscribed in sphere of with radius

specified by argument

    centered at origin

    """

    point_coordinates = np.array([

        ( 0.000,  1.000,   0.000),

        (-0.816, -0.344,   0.471),

        ( 0.816, -0.344,   0.471),

        ( 0.000, -0.344,  -0.942),

    ]) * radius

    

    point_colors = np.array([

        (1.00,1.00,0.40),

        (0.70,0.40,1.00),

        (0.00,0.80,0.00),

        (1.00,0.80,0.90),

    ])

    face_indices = np.array([

        (0,1,2),

        (0,2,3),

        (0,3,1),

       (3,2,1)

    ])

    

    return point_coordinates,point_colors,face_indices

    

    

point_coordinates,point_colors,face_indices = colored_tetrahedron( 2.0 )

newModel=X3D(profile='Immersive',version='3.3',

  head=head(

    children=[

    meta(content='NumpyExample.x3d',name='title'),

    meta(content='example of using Numpy library to generate coordinate

geometry and color',name='description'),

    meta(content='24 Feb 2022',name='created'),

    meta(content='Vince Marchetti',name='creator'),

meta(content='https://www.web3d.org/x3d/content/examples/license.html',name=

'license')

  ]),

  Scene=Scene(

    

    children=[

    WorldInfo(title='NumpyExample.x3d'),

    Viewpoint(DEF='ViewUpClose', description='Initial Viewpoint'),

    Shape(geometry=IndexedTriangleSet(

                # following code converts rank-2 numpy array of integers

into a python list for setting value of index field

                index = list( face_indices.flatten() ),

                

                # following code converts rank-2 numpy array of float values

into a Python list of Python tuples of floats

                # to set x3d values of type MFVec3f and MFColor

                coord = Coordinate( point = [ tuple(pt) for pt in

point_coordinates] ),

                color = Color( color = [tuple(c) for c in point_colors])

                )

          )

   ])

) 

newModelXML= newModel.XML() 

print(newModelXML)

======================================

 

all the best, Don

-- 

Don Brutzman  Naval Postgraduate School, Code USW/Br
<mailto:brutzman at nps.edu> brutzman at nps.edu

Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149

X3D graphics, virtual worlds, Navy robotics
<https://faculty.nps.edu/brutzman> https://faculty.nps.edu/brutzman

 

-----Original Message-----

From:  <mailto:vmarchetti at kshell.com> vmarchetti at kshell.com <
<mailto:vmarchetti at kshell.com> vmarchetti at kshell.com> 

Sent: Friday, February 25, 2022 3:50 AM

To: X3D-Public < <mailto:x3d-public at web3d.org> x3d-public at web3d.org>;
Brutzman, Donald (Don) (CIV)

< <mailto:brutzman at nps.edu> brutzman at nps.edu>

Subject: example python code using numpy library

 

Attached is a Python script that defines the coordinates, colors, and face

indices for a tetrahedron as numpy rank-2 arrays, then converts those values

in order to initialize the field values for an x3d IndexedTriangleSet node.

 

This may serve as a demonstration example for using numpy together with the
x3d package.

 

This script runs with the pip installation of x3d and was tested at version
4.0.51

 

Vince Marchetti

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20220228/d28f2f0c/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5353 bytes
Desc: not available
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20220228/d28f2f0c/attachment-0001.p7s>


More information about the x3d-public mailing list