[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