[x3d-public] Next, in Python news...
John Carlson
yottzumm at gmail.com
Sun Aug 22 05:44:46 PDT 2021
Oops, failing send.
Try again!
John
On 8/22/21 7:44 AM, John Carlson wrote:
> Here is the file with DOS/Windows line endings.
>
> My apologies.
>
> John
>
> On 8/22/21 7:33 AM, John Carlson wrote:
>> Don, attached is the python, with slight changes that does not
>> produce XML. Indeed, it errors out in ProtoBody setter in ??? class.
>>
>> I tried to patch x3d.py, but ran into other issues.
>>
>> There might be an issue with Linux linefeeds?
>>
>> I can convert if you can't. I recommend WordPad instead of NotePad.
>>
>> John
>>
>>
>> On 8/21/21 11:57 PM, Brutzman, Donald (Don) (CIV) wrote:
>>> Hi John, am trying to follow your message.
>>>
>>> We have pylint but recent upgrade to python caused a gap, not
>>> resolved yet.
>>>
>>> Meanwhile python evaluates everything building the scene graph quite
>>> strictly, primarily through setters when creating values. I'm not
>>> sure it is possible to create invalid XML, VRML or JSON from x3d.py
>>> package. If such a case is found, let's fix the bug it indicates.
>>>
>>> If you have an example python program/snippet that does _not_
>>> produce valid XML, VRML or JSON, please advise.
>>>
>>> v/r Don
>>>
>>>
>>> -----Original Message-----
>>> From: x3d-public <x3d-public-bounces at web3d.org> On Behalf Of John
>>> Carlson
>>> Sent: Saturday, August 21, 2021 3:10 AM
>>> To: X3D Graphics public mailing list <x3d-public at web3d.org>
>>> Subject: [x3d-public] Next, in Python news...
>>>
>>> I've been converting JSON schema to pure python validators (no
>>> separate JSON schema file required) with a python package (not
>>> mine). If I could convert X3DUOM to Python and get a free XML,
>>> VRML, and JSON schema validation in Python, that would WOW me. BTW,
>>> I see that you don't use an XML parser in Python yet? May I
>>> recommend the popular ElementTree built-in package. Here's a simple
>>> pattern (in python):
>>>
>>> import xml.etree.ElementTree
>>> soup =
>>> xml.etree.ElementTree.parse(open("../../specifications/X3dUnifiedObjectModel-4.0.xml")).getroot()
>>>
>>>
>>> So, Don should look at pylint output in the logs, perhaps? Me too!
>>> I just found out about pylint! I can find bugs in Python while Don
>>> works on Python-creating XSLT? That would seem a better division
>>> of labor. I just ran ```ant pylint```. I can do that and search for
>>> bugs in x3d.py. I see that my changes are 1.53/10 worse, so I'm
>>> backing the changes that I made to X3duomToX3dPythonPackage.xslt.
>>> Please revisit this email, or look at code I pasted below. The
>>> problem is around isinstance. I could be misunderstanding duck
>>> typing. To me, 2 ProtoBody's inside the isinstance parameters
>>> spells trouble, but I'm unsure of a fix at this point. I have a
>>> backup of my changes should we need to recover. Perhaps a step
>>> forward is better than a step backwards?
>>>
>>> @ProtoBody.setter
>>> def ProtoBody(self, ProtoBody):
>>> if ProtoBody is None:
>>> ProtoBody = None # default
>>> assertValidSFNode(ProtoBody)
>>> if not ProtoBody is None and not
>>> isinstance(ProtoBody,(ProtoBody,ProtoInstance)):
>>> # print(flush=True)
>>> raise X3DTypeError(str(ProtoBody) + ' does not match
>>> required node type (ProtoBody,ProtoInstance) and is invalid')
>>> self.__ProtoBody = ProtoBody
>>>
>>>
>>> _______________________________________________
>>> x3d-public mailing list
>>> x3d-public at web3d.org
>>> http://web3d.org/mailman/listinfo/x3d-public_web3d.org
-------------- next part --------------
###############################################
#
# Now available: developmental python x3d.py package on PyPi for import.
# This approach greatly simplifies Python X3D deployment and use.
# https://pypi.org/project/x3d
#
# Installation:
# pip install x3d
# or
# python -m pip install x3d
#
# Developer options for loading x3d package:
#
# from x3d import * # preferred approach, terser source that avoids x3d.* class prefixes
#
# or
# import x3d # traditional way to subclass x3d package, all classes require x3d.* prefix
# # but python source is very verbose, for example x3d.Material x3d.Shape etc.
# # X3dToPython.xslt stylesheet insertPackagePrefix=true supports this option.
from x3d import *
###############################################
newModel=X3D(profile='Immersive',version='3.3',
head=head(
children=[
meta(name='title',content='rubik.x3d'),
meta(name='creator',content='John Carlson'),
meta(name='generator',content='manual'),
meta(name='identifier',content='https://coderextreme.net/X3DJSONLD/rubik.x3d'),
meta(name='description',content='a kind of rubik cube with spheres')]),
Scene=Scene(
children=[
NavigationInfo(type=["EXAMINE"]),
Viewpoint(description='Rubiks Cube',position=(0,0,12)),
ProtoDeclare(name='sphereproto',
ProtoInterface=ProtoInterface(
field=[
field(name='xtranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
ProtoBody=ProtoBody(
children=[
Transform(
IS=IS(
connect=[
connect(nodeField='translation',protoField='xtranslation')]),
children=[
Shape(
geometry=Sphere(),
appearance=Appearance(
material=Material(diffuseColor=(1,1,1))))])])),
ProtoDeclare(name='three',
ProtoInterface=ProtoInterface(
field=[
field(name='ytranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
ProtoBody=ProtoBody(
children=[
Transform(
IS=IS(
connect=[
connect(nodeField='translation',protoField='ytranslation')]),
children=[
ProtoInstance(name='sphereproto',
fieldValue=[
fieldValue(name='xtranslation',value=(0,0,0))]),
ProtoInstance(name='sphereproto',
fieldValue=[
fieldValue(name='xtranslation',value=(2,0,0))]),
ProtoInstance(name='sphereproto',
fieldValue=[
fieldValue(name='xtranslation',value=(-2,0,0))])])])),
ProtoDeclare(name='nine',
ProtoInterface=ProtoInterface(
field=[
field(name='ztranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
ProtoBody=ProtoBody(
children=[
Transform(
IS=IS(
connect=[
connect(nodeField='translation',protoField='ztranslation')]),
children=[
ProtoInstance(name='three',
fieldValue=[
fieldValue(name='ytranslation',value=(0,0,0))]),
ProtoInstance(name='three',
fieldValue=[
fieldValue(name='ytranslation',value=(0,2,0))]),
ProtoInstance(name='three',
fieldValue=[
fieldValue(name='ytranslation',value=(0,-2,0))])])])),
ProtoDeclare(name='twentyseven',
ProtoInterface=ProtoInterface(
field=[
field(name='ttranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
ProtoBody=ProtoBody(
children=[
Transform(
IS=IS(
connect=[
connect(nodeField='translation',protoField='ttranslation')]),
children=[
ProtoInstance(name='nine',
fieldValue=[
fieldValue(name='ztranslation',value=(0,0,0))]),
ProtoInstance(name='nine',
fieldValue=[
fieldValue(name='ztranslation',value=(0,0,2))]),
ProtoInstance(name='nine',
fieldValue=[
fieldValue(name='ztranslation',value=(0,0,-2))])])])),
ProtoInstance(name='twentyseven',
fieldValue=[
fieldValue(name='ttranslation',value=(0,0,0))])])
) # X3D model complete
###############################################
# Self-test diagnostics
###############################################
if metaDiagnostics(newModel): # built-in utility method in X3D class
print(metaDiagnostics(newModel))
print('check newModel.XML() serialization...')
newModelXML = newModel.XML() # test export method XML() for exceptions
print(newModelXML) # debug
print ("python x3d.py load successful for rubik.py")
More information about the x3d-public
mailing list