<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>I’m now having problems with “set Proxy” called twice in generated python scenegraph.  Checked in:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.assign.py:Collision54 = Collision()</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.assign.py:Collision54.proxy = Shape55</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.assign.py:Collision54.proxy = Group59</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.assign.py:Scene17.addChildren([Collision54])</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.kwargs.py:    Collision54 = Collision(     Shape55 = Shape(      # note that Collision proxy Shape is not rendered</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.serial.py:Collision54 = Collision()</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.serial.py:Shape55 = Shape(proxy = Collision54)</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.serial.py:Collision54.setProxy(Shape55)</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.serial.py:Collision54.setProxy(Group59)</p><p class=MsoNormal>data/X3dHeaderPrototypeSyntaxExamples.serial.py:Scene17.addChildren(Collision54)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:yottzumm@gmail.com">John Carlson</a><br><b>Sent: </b>Wednesday, June 26, 2019 7:39 AM<br><b>To: </b><a href="mailto:brutzman@nps.edu">Brutzman, Donald (Don) (CIV)</a><br><b>Cc: </b><a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a>; <a href="mailto:lepeitso@nps.edu">Peitso, Loren (CIV)</a><br><b>Subject: </b>RE: updates to X3DJSAIL, plus python and java versions ofX3DExamples,X3DPSAIL; let Python be Python</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Don, read this.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>My response:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>1 a) mapToMethod.js is overridden by mapToMethod2.js.   You need to study JavaScript objects, and how values are written over by keys and values appearing later in a file.   Two equal keys ends up as a single key, and the last value that appears in order in the file takes.<o:p></o:p></p><p class=MsoNormal>I know this isn’t ideal, which is why I created mapToMethod2.js for a fallback.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>For example, print out this object:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>{ " a": 1, " a"  : 2 }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>As far as I know, the mapToMethod*.js files only affect the Serializers.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The best way to think of JavaScript Objects is as arrays with a non whole number indexes and interned keys (a la Java) I think.  Now you *<b>will</b>* understand that there are no double entries left once the whole file is read in the JavaScript?  You can also combine an array with an object in JavaScript, last I’ve heard (probably not a good idea).<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>We can easily remove the abstract classes by modifying what gets sent to the ClassPrinter in packagemaker.py and avoiding going up the hierarchy into interfaces and abstract classes. (Search for Abstract to begin)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I don’t have a good methods for fixing this yet, and I have tried different things in mapToMethod.py, like not traversing to parents or children, but haven’t found a good solution.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>b) We can remove abstract classes, unless there some implementation in the abstract class we need to access???  I didn’t know whether I should follow the parent chain up the inheritance hierarchy or not?   Are there concrete classes which inherit from concrete classes?  Show me an example of a Python file where the translation from XML was wrong, and we can work on an example.  I don’t want to work without an example at this point, unless you want me to get rid of the interfaces and abstract classes.  Since we’re converting to Python from X3D scenegraphs, there won’t be interfaces or abstract classes in the generated Python, because they aren’t in X3D XML scenegraphs.  If we’re talking methods that are abstract, that’s a different story.  Those shouldn’t appear in mapToMethod.js, so the methods won’t be used in the generated scenegraph in Python.  The key is to find out what method should be used, and put that in mapToMethod2.js in the short term. Ideally, we’d have a single file with correct entries.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>c) I’m waiting for you to show me something that has fewer errors than using the wrappers, like use a different serializer.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>2) Welcome aboard.   We can leave the pyjnius version available to Java programmers who want to use a “Java-like” syntax for ease of porting, but we should get to X3DJSAIL production of Python scenegraphs soon. I suggest using PythonSerializer.js output, if it’s in good shape for the  “set API” so we don’t get a bunch of errors.  Let’s toss Pipelining/Chaining altogether, then the user can make a choice as to what they want to program, instead of us ruling what they have to do.  They are better to decide how to work around the error, but we can make suggestions, like don’t use Pipelining.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>That said, there are 3 left over styles we can use instead of the pipelining.  Examples of different styles can be found in the data folder under pythonapi on sourceforge.  I suggest using the PythonAssignSerializer.js.   But we may need to do something for initializeOnly, in which case, I recommend the Kwargs serializer.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>3) A word:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><a href="https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/src/python/pythonapi/packagemaker.py">https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/src/python/pythonapi/packagemaker.py</a><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>created the X3DPackage.py file, so probably the packagemaker.py file would be a good launching point.  No need to make your changes to X3DPackage.py file if they’re going to be overwritten in the next build.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I am thinking we need a RDF to X3DPackage.py converter?  Is that the mad science Loren was talking about?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Here’s where I gave up on the pythonapi.  I was able to generate classes from X3DUOM, but I was unable to generate XML from the generated classes.  Perhaps that’s the best place to start on the new effort.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I think the best thing we can do is work with RDF to generate the appropriate classes that generate XML during run-time.   But we will need to generate documentation for these “shadow” classes that don’t appear in any source code.  Perhaps Loren has a solution?  Hmm!  My brain is foggy.  I will get a frappe and take a nap.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From: </b><a href="mailto:brutzman@nps.edu">Brutzman, Donald (Don) (CIV)</a><br><b>Sent: </b>Tuesday, June 25, 2019 9:39 PM<br><b>To: </b><a href="mailto:yottzumm@gmail.com">John Carlson</a><br><b>Cc: </b><a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a>; <a href="mailto:lepeitso@nps.edu">Peitso, Loren (CIV)</a><br><b>Subject: </b>Re: updates to X3DJSAIL, plus python and java versions ofX3DExamples, X3DPSAIL; let Python be Python<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Hi John, hope you are well.  Am busy for the next week but here is some more detail for you.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>1. Found some possible problems with X3DPSAIL that might be provoking the problem with incorrect node types.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>a. mapToMethod.js has a lot of duplication in it in the left-hand side of the associative arrays.  This is probably confusing the heck out of the Java reflection methodology inside pyjnius.   For example, note the repeated entries of "X3DMetadataObject" in the first example, then multiple duplications in the second example:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>////////////////////////////<o:p></o:p></p><p class=MsoNormal>"X3DNode" : {<o:p></o:p></p><p class=MsoNormal>                "X3DMetadataObject" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataBoolean" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataDouble" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataFloat" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataInteger" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataSet" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataString" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "X3DMetadataObject" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>},<o:p></o:p></p><p class=MsoNormal>////////////////////////////<o:p></o:p></p><p class=MsoNormal>"Appearance" : {<o:p></o:p></p><p class=MsoNormal>                "FillProperties" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "FillProperties" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DConcreteNode" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DChildNode" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DAppearanceChildNode" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setFillProperties",<o:p></o:p></p><p class=MsoNormal>                "LineProperties" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "LineProperties" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DConcreteNode" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DChildNode" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DAppearanceChildNode" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setLineProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DMaterialNode" : "setMaterial",<o:p></o:p></p><p class=MsoNormal>                "Material" : "setMaterial",<o:p></o:p></p><p class=MsoNormal>                "TwoSidedMaterial" : "setMaterial",<o:p></o:p></p><p class=MsoNormal>                "X3DMaterialNode" : "setMaterial",<o:p></o:p></p><p class=MsoNormal>                "X3DAppearanceChildNode" : "setMaterial",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setMaterial",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setMaterial",<o:p></o:p></p><p class=MsoNormal>                "X3DMetadataObject" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataBoolean" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataDouble" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataFloat" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataInteger" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataSet" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "MetadataString" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "X3DMetadataObject" : "setMetadata",<o:p></o:p></p><p class=MsoNormal>                "PointProperties" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "PointProperties" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DConcreteNode" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DChildNode" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DAppearanceChildNode" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setPointProperties",<o:p></o:p></p><p class=MsoNormal>                "X3DShaderNode" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "ComposedShader" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "PackagedShader" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "ProgramShader" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "X3DShaderNode" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "X3DAppearanceChildNode" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "addShaders",<o:p></o:p></p><p class=MsoNormal>                "X3DTextureNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DEnvironmentTextureNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "ComposedCubeMapTexture" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "GeneratedCubeMapTexture" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "ImageCubeMapTexture" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DTexture2DNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "ImageTexture" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "MovieTexture" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "PixelTexture" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DTexture3DNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "ComposedTexture3D" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "ImageTexture3D" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "PixelTexture3D" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "MultiTexture" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DTextureNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DAppearanceChildNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setTexture",<o:p></o:p></p><p class=MsoNormal>                "X3DTextureTransformNode" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "MultiTextureTransform" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "TextureTransform" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "TextureTransform3D" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "TextureTransformMatrix3D" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "X3DTextureTransformNode" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "X3DAppearanceChildNode" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>                "X3DNode" : "setTextureTransform",<o:p></o:p></p><p class=MsoNormal>},<o:p></o:p></p><p class=MsoNormal>////////////////////////////<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I believe you create this via mapToMethodGenerator.js - might you be able to filter duplicates?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>------<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>b. Additionally, *all of the X3D node types on the left-hand side above are suspect* because X3DJSAIL only uses node types as a Java-based shorthand.  I am wondering if all are eliminated completely, that might force Pyjnius into only using methods for concrete nodes, as we wish.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>------<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>c.  Python describes how we can "import as" to change package names when appropriate.  This capability is in most Python books too.  Reference:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Python Language Reference, 7.11. The import statement<o:p></o:p></p><p class=MsoNormal>https://docs.python.org/3/reference/simple_stmts.html#the-import-statement<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Also note that simple Python data types are supported by X3DJSAIL, so we don't have to wrap non-node values with SFString SFFloat etc.  I think this might let us change our file syntax as follows:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>http://x3dgraphics.com/examples/X3dForAdvancedModeling/HelloWorldScenes/HelloWorld.py<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>============================================================<o:p></o:p></p><p class=MsoNormal>import x3dpsail<o:p></o:p></p><p class=MsoNormal>X3D0 = (x3dpsail.X3D().setProfile(x3dpsail.SFString("Immersive")).setVersion(x3dpsail.SFString("3.3"))<o:p></o:p></p><p class=MsoNormal>       .setHead(x3dpsail.head() # etc.<o:p></o:p></p><p class=MsoNormal>============================================================<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>to<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>============================================================<o:p></o:p></p><p class=MsoNormal>import x3dpsail as x3d<o:p></o:p></p><p class=MsoNormal>X3D0 = (x3d.X3D().setProfile("Immersive").setVersion("3.3")<o:p></o:p></p><p class=MsoNormal>      .setHead(x3d.head() # etc.<o:p></o:p></p><p class=MsoNormal>============================================================<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Nodes would need the "x3d." prefix so that they were package specific and not clobbered by user-defined name collisions.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>2.  Looking ahead.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>So far our strategy has been to implement X3D Python via pyjnius and X3DJSAIL, expecting to work on a C-based Cython implementation in the future when the C-based SAI open source is available.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Not a bad plan, but maybe we can make things much easier.  Loren, Jakub and I spent three hours tearing everything apart and putting it back together last week.  We came to the realization that we were working awfully hard and still having difficulties getting different languages aligned... when a much simpler approach was possible.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>We might do far better by implementing an X3D package for python in python.  That would make X3D support independent of any other language bindings.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This would enable us to be far more "pythonic" and mainstream in all our constructs, rather than worrying about other programming-language implementation dependencies.  In other words, let Python be Python!<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Looks like you might have already been hard at work on such an alternative:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>https://sourceforge.net/p/x3d/code/HEAD/tree/www.web3d.org/x3d/stylesheets/java/src/python/pythonapi/X3Dpackage.py<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Next week, Loren and I will take a clean white board and attempt to design a type-aware X3D package that allows careful terse construction of correct X3D scene graphs.  We will simply apply X3D data model to best Python package practices.  No doubt Loren will banish "set" and "get" from our lexicon, and other java/javascript idioms will be avoided.  We'll then compare diffs with yours X3Dpackage.py, should be interesting.  Onward we go.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>all the best, Don<o:p></o:p></p><p class=MsoNormal>-- <o:p></o:p></p><p class=MsoNormal>Don Brutzman  Naval Postgraduate School, Code USW/Br       brutzman@nps.edu<o:p></o:p></p><p class=MsoNormal>Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   +1.831.656.2149<o:p></o:p></p><p class=MsoNormal>X3D graphics, virtual worlds, navy robotics http://faculty.nps.edu/brutzman<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>