<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:632636882;
        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>Jeff, stop work, I think the X3D Program -> DOM problem is solved with Jupyter notebook. We just need to write or find a kernel for Jupyter notebook. Kernels are found here: <a href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels">https://github.com/jupyter/jupyter/wiki/Jupyter-kernels</a> Jupyter is very cool.  Alexander, can you install a JavaScript and Java kernels in our Jupyter, along with the Python?  Sheesh, I am behind the times.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Leonard if that doesn’t satisfy you, I think you were focused on following:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>To handle multi-parenting in languages that don’t support multi-parenting, I will use DEF/USE as an attribute/property/field/slot, or duplicate that portion of the tree.  I believe I am conforming to how X3D XML is handled. For languages that have multi-parents, I should be handling that, and generating multi-parents and multiple variables (sigh).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>For example, in  JSON -> STL, that would be an issue.</p><p class=MsoNormal><br>I believe for JSON -> STL,  I search backwards through previously processed nodes, looking for DEFs, and keep a transform stack, so I generate unique data for each DEF/USE in a different transform.  I forget the details.  You’re welcome to look at the code:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>https://github.com/coderextreme/<span style='color:black'>X3DJSONLD/src/main/node/convertJsonToStl.js<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>It would likely be possible to do multi-parenting based on using something like what JSON -> STL does, looking up DEFs.  That would mess up my and Don’s pretty indented trees though!  I have solved a similar before by separating out ProtoInstance(just one tag) into separate variables (in my Java serializer, I think).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>If you have some suggestions for changing my serializers to use more than one variable (some already do use more than one variable, and they can be changed, I would welcome that.  That is, I would do, .addChild(variable) instead of .addChild(constructor().setUSE(…), In many cases, it would just be  matter of finding or keeping track of the DEFs, then inserting the variable associate with that DEF into the children list. TODO.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks for the attention. I have not been trying to solve the scenegraph issue in DOM. It’s very possible to solve it with JavaScript, Java and Python (not DOM, XML, EXI, PLY, STL or JSON) by using a DEF value to variable map.  Did I answer your question?  I think your question had more to do with translating to DOM. I believe I would have variable names or DEFs from the source syntax to use for DEFs.  Note that I don’t translate from JavaScript, Java or Python yet to DOM (and probably won’t), I use the X3DJSAIL API for those languages, which translates to XML first.  </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b>Don, might the same issue Leonard brings up be in the stylesheet conversion to Java?  Do you solve it there?<o:p></o:p></b></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Leonard, I believe you were addressing this:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>“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.”</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This work has been cancelled (above), in favor of Jupyter notebook.  Is there a remaining action when a Program (not data) is the target of a serializer or stylesheet?  Should I (and maybe Don) follow through on the above multiparenting with our serializers to Java, JavaScript and Python (and probably later in C/C#/C++)?</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Don, can you run X3DJSAIL inside Jupyter?  Jupyter is inside Anaconda, and I think you can install kernels with pip.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks,</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>