<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;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";
        color:black;}
.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;}
/* List Definitions */
@list l0
        {mso-list-id:936911063;
        mso-list-template-ids:-1;}
@list l0:level1
        {mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Leonard, I saw your message.  To get an idea of how I would solve the multi-parenting issue when translating to Java/JavaScript/Python/C/C#/C++ (DOM -> program, in my case, not scenegraph -> program, and not JSON to STL), take a look at the attached Java code generated by my serializer (serializer link below). I don’t actually have multiple parents, just ProtoInstance variables, but you might get an idea of my approach to solving the issue. If there’s a better approach to serializing from DOM, let me know.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><a href="https://github.com/coderextreme/X3DJSONLD/blob/master/src/main/node/JavaSerializer.js">https://github.com/coderextreme/X3DJSONLD/blob/master/src/main/node/JavaSerializer.js</a></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The question is, should we do this?  Note all these programs use the X3DJSAIL API, except for some that currently don’t do anything, or generate some buggy XML.  Does X3DJSAIL handle what’s next?  Would it be useful for programs using X3DJSAIL to not supply USE attributes, only DEF attributes? Currently Don uses setUSE in his HelloWorldProgram.java with either a node or a string variable. Should I do something similar, use an variable pointed to a DEF’ed object, a DEF value, or?   Should I keep a flag in JavaScript for when an object has been serialized, and then not write out attributes except for USE when the object is revisited?  Is setUSE useful?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Will using separate, but equal strings for DEF and USE work with X3DJSAIL to create multiparenting?   Do we need setUSE, or can we merely specify a variable instead of another constructor?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Note that Don’s X3dToJava.xslt does generate separate objects, and uses setUSE with equal, but different strings from the DEF, so we’ll have to update the X3dToJava.xslt stylesheet as well, if X3DJSAIL doesn’t handle it.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks for a sharp eye, Leonard! Looking forward to advice on how to best use X3DJSAIL!</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Note that we’re generating DOM, JSON and XML output from these programs, so we’ll have to have USE in that output.  Also, X3DJSONLD.js/.java generates DOM output, so no action there.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>Don, let me know how you’re solving this for Java output from X3dToJava.xslt, if at all.  Is this a non-action?  Thanks,<o:p></o:p></b></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>It seems like the issue may be limited to DOM -> Java/JavaScript/Python generating serializers and X3dToJava.xslt at this point, with a potential issue with X3DJSAIL.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>My tendency would be to toss the whole thing in Don’s lap, if he’s going to write/modify the Java, JavaScript and Python generating stylesheets.  But perhaps this problem is better solved without XSLT?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Also note that it’s likely that this issue only affects *<b>generated</b>* programs, not handwritten programs.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>Note that the Java SAI only supports setUSE(String).</b>   X3DJSAIL supports passing a node.  So we probably can’t pass a node to setUSE if we want to use a standard API. Thus we are limited to passing a reference to the object to the outer method, or constructing a new object, and calling setUSE with a string, not a node.  I vote for constructing a new object, similar to how Don’s X3dToJava.xslt does, then the work for multiparenting will all be centralized in X3DJSAIL, instead of not supporting setUSE at all. (<b>why is setUSE in the SAI???</b>)</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>So my vote is to support multiple objects in X3DJSAIL with the same DEF/USE value (no action, or fixing bugs in X3DJSAIL), or remove setUSE from the SAI (standards action), or not use setUSE, except in a few cases, where more fields than USE are allowed.  We will need some way to look up a DEF’ed node (findNode? querySelector?) in SAI if not already there.<o:p></o:p></b></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sorry, </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John</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:Leonard.Daly@realism.com">Leonard Daly</a><br><b>Sent: </b>Wednesday, May 1, 2019 8:24 PM<br><b>To: </b><a href="mailto:x3d-public@web3d.org">x3d-public@web3d.org</a><br><b>Subject: </b>Re: [x3d-public] Report on X3DJSONLD, X3DJSAIL conversion work. PLYSTL <-> JSON conversions. Future plans. Program -> DOM</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='color:black'>John,<o:p></o:p></span></p><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='color:black'>I presume that this is a conversion of X3D content between these various formats. In which case, how can anything convert to DOM because<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><div><ol start=1 type=1><li class=MsoNormal style='color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'>DOM is a language-neutral interface (see <a href="https://www.w3.org/DOM/#what"><span style='color:#0563C1'>https://www.w3.org/DOM/#what</span></a>)<o:p></o:p></li><li class=MsoNormal style='color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1'>DOM does not support elements with multiple parents. Each element can have at most one parent (see second paragraph at <a href="https://dom.spec.whatwg.org/#trees"><span style='color:#0563C1'>https://dom.spec.whatwg.org/#trees</span></a> or if you don't want the living spec then use <a href="https://www.w3.org/TR/dom/#trees"><span style='color:#0563C1'>https://www.w3.org/TR/dom/#trees</span></a>).<o:p></o:p></li></ol><p>X3D explicitly allows multi-parenting (through the use of DEF/USE). How does this application resolve the conflict?</p><p><o:p> </o:p></p><p>Leonard Daly</p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal><span style='color:black'>X3DJSONLD does the following conversions:<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                JSON->DOM<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                DOM->XML (borrowed)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                XML->DOM (borrowed)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                DOM->JSON<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                DOM->Java<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                DOM->Python<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                DOM->JavaScript<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                PLY->JSON<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                STL->JSON<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                JSON->STL (not done, not always triangles, needs someone who wants to do tessellation, or can provide a JavaScript library)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                JSON->EXI<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                EXI->JSON<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>XD3JSAIL/SourceForge X3D does the following conversions that were added by me<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                JSON->DOM (Java version of X3DJSONLD)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->JavaScript <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                DOM->Python (X3DPSAIL)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                DOM->Python (Pure Python—doesn’t do anything)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>X3DJSAIL does:<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->XML<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->JSON<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->X3D<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->ClassicVRML<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->VRML97<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->HTML<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->Java<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->ModelMetaMarkdown<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->X3dTidy<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->X3DOM<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->X_ITE<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->Cobweb<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->EXI<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->GZIP<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                X3DJSAIL->ZIP<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Don will likely add toFileJavaScript (replacing my work—I think there may already be a start on a stylesheet) and toFilePython stylesheet conversions to X3DJSAIL.  Is that OK, Don?<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Probably I will retain maintenance of all JSON->DOM conversions (JavaScript, Java, C++, X3DJSAIL, X3DOM, X_ITE). (Don uses a stylesheet or strings to generate XML).  I am open to developing JSON->DOM for other languages and improving the C++ version if people are interested.  You should be willing to provide example JSON files (possibly converted with X3D-Edit).   Recommend you use Everit or Ajv for JSON Schema validation, if not X3DJSONLD’s validator (based on Ajv).<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Ideally I think, Don will take over all serializers, except my DOM->JSON serializer.  I also use a javascript serializer on my web page.<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>================================================================================================================<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>What X3DJSONLD could provide for X3DJSAIL and X3DPSAIL (JavaScript)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                PLY->JSON<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                STL->JSON<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                JSON->STL<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>These conversions are stored under ~/X3DJSONLD/src/main/node:<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>convertJsonToStl.js<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>convertPlyToJson.js<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>convertStlToJson.js<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>The JSON to STL conversion looks at the following X3D JSON indexes<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>               IndexedFaceSet : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                Group : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                Shape : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                Box : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                IndexedTriangleSet : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                IndexedTriangleStripSet : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                IndexedTriangleFanSet : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                IndexedLineSet : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                Normal : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                Coordinate : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                Transform : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@scale" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@rotation" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@translation" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@normalPerVertex" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@size" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@vector" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@point" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@normalIndex" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@coordIndex" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>                "@index" : function(obj, LDNode) {<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Note:  There are no colors or textures.<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Note:  Sometimes I create more complex polygons than triangles.  This is not in the STL “specification”<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Suggestions for additional shapes to translate are welcome:<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Arc2D ArcClose2D Circle2D Disk2D Polyline2D Polypoint2D Rectangle2D TriangleSet2D<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Cone, Cylinder, ElevationGrid,Extrusion,Sphere,Text,GeoElevationGrid (why?),QuadSet,IndexedQuadSet<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>LineSet PointSet TriangleFanSet TriangleSet TriangleStripSet HAnim<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>I won’t translate the 2D geometry, I think.  I will not translate Points or Lines<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>I don’t yet know how to translate Cone, Cylinder,*ElevationGrid,Extrusion,Sphere,Text,HAnim (will the standard help?) Help! I can probably handle the other ones. Volunteers are welcome!  Pull requests are welcome!  Suggestions for JavaScript libraries accepted.<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:#548235'>The ones I can handle, I think are QuadSet, IndexedQuadSet, TriangleFanSet, TriangleSet and TriangleStripSet.</span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Would it be better to take a scenegraph from X3DOM or X_ITE?   Is there documentation for the scenegraphs?<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>The STL to JSON creates a single IndexedFaceSet for all polygons found in the STL file.  No color is handled from the STL file<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>The PLY to JSON file creates IndexedFaceSets and IndexedLineSets.  Any more suggestions or PLY files you want translated?<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Is there any requirement for JSON -> PLY?<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Note: I just discovered <a href="https://cadexchanger.com/x3d"><span style='color:#0563C1'>https://cadexchanger.com/x3d</span></a>  for X3D to STL conversions.   Add to X3D resources?   I haven’t tried it yet. CADExchanger already mentioned here: <a href="http://www.web3d.org/wiki/index.php/STEP_X3D_Translation#Open_Cascade_and_PythonOCC"><span style='color:#0563C1'>http://www.web3d.org/wiki/index.php/STEP_X3D_Translation#Open_Cascade_and_PythonOCC</span></a><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Is there any need for STL conversion beyond CADExchanger (And others)?  I will delete my STL conversions.<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>For my JSON->DOM converter, should I create a python version.<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>I believe I will start work (we probably already have) on Java->DOM, Python->DOM, C/C#/C++->DOM and JavaScript->DOM transpilers. For people who don’t want a full weight of X3DJSAIL or X3DPSAIL.  This will be a valuable addition to X3DJSAIL, should it choose to accept it.  I will call it “PRESAIL”  for now.<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'><br><br><o:p></o:p></span></p><pre>_______________________________________________</pre><pre>x3d-public mailing list</pre><pre><a href="mailto:x3d-public@web3d.org">x3d-public@web3d.org</a></pre><pre><a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org">http://web3d.org/mailman/listinfo/x3d-public_web3d.org</a></pre></blockquote><p><o:p> </o:p></p><p class=MsoNormal><span style='color:black'>-- <br></span><b><span style='font-size:13.5pt;color:#333366'>Leonard Daly</span></b><span style='color:#333366'><br>3D Systems & Cloud Consultant<br>LA ACM SIGGRAPH Past Chair<br>President, Daly Realism - <i>Creating the Future</i> </span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div></body></html>