<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;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Yes, sub-classing (in JavaScript) would be OK.  I would have to think about how do that in Java.  Hmm.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>My understanding of the USE field is to create multiple parents.  setUSE() would have a similar purpose.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Which is why I would consider a third option of creating multiple parents in SAI (scenegraph), not DOM.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>If we use DOM, then your solutions would likely work.</p><p class=MsoNormal><br>I think we may need more concrete uses.  The HelloWorldProgram.java program in the <a href="http://www.web3d.org/x3d/stylesheets/java/examples">www.web3d.org/x3d/stylesheets/java/examples</a> (on sourceforge) has some uses of setUSE we could look at.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>It’s likely we really need to concentrate on, indeed, what exactly setUSE is supposed to do.   Does it merely set a field, or is there some more internal actions going on?</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>Monday, May 6, 2019 6:17 PM<br><b>To: </b><a href="mailto:x3d-public@web3d.org">x3d-public@web3d.org</a><br><b>Subject: </b>Re: [x3d-public] questions on X3DJSAIL usage.</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 guess I am not sure what setUSE is suppose to do. I my world of 3D graphics (note that this is not X3D), a node may only have a single parent. If the intent of setUse is to duplicate the content tree starting with another node, I would need to decide if that is better done as a deep copy (independent content) or the DEF node is to be sub-classed. Also note that for me, SAI === DOM + some 3D interfaces.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='color:black'>A deep copy would need to copy the node and attribute structure and content starting with the identified node. I would need to modify the ID attribute values so there were no duplicates, probably defining a unique suffix at the start of the copy operation and appending that to each ID value from the original tree. Note that the copy operation needs to avoid copying any non-DOM-tree objects. I would likely first consider converting the DOM-tree from the source ID to an HTML string, then parse that into a DOM-tree not connected (yet) to the document. At that point, updating the IDs is easier. Once the copying is complete and the DOM updated, there is no relationship between the original source nodes and the new nodes. There are situations where this works well, and there are times when it doesn't really work at all.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='color:black'>The other choice is more programmatic in nature. It would create 3D objects/structure, but not directly include those objects in the DOM-tree. It would probably be easier to established the original nodes as a (non-X3D) prototype that is not directly instantiated. "USE" references references would sub-class the prototype and instantiate the sub-class, potentially overriding some "methods" or "data". Changes to the prototype would be propagated to all of the sub-classes. This method is more complex, and I have not thought it out as well (and deeply).<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='color:black'>I am not sure if this answers your question/request.<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='color:black'>Leonard Daly<o:p></o:p></span></p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></p></div><div><p class=MsoNormal><span style='color:black'><o:p> </o:p></span></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'>Leonard, can you explain for us how we can write an SAI program avoiding setUSE()?  Apparently, my explanations aren’t getting through.<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'>John<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'>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='color:black'>From: </span></b><span style='color:black'><a href="mailto:brutzman@nps.edu">Brutzman, Donald (Don) (CIV)</a><br><b>Sent: </b>Monday, May 6, 2019 2:18 AM<br><b>To: </b><a href="mailto:yottzumm@gmail.com">John Carlson</a>; <a href="mailto:aono@tut.jp">aono@tut.jp</a><br><b>Cc: </b><a href="mailto:x3d-public@web3d.org">X3D Graphics public mailing list</a><br><b>Subject: </b>Re: questions on X3DJSAIL usage.<o:p></o:p></span></p></div><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>On 5/4/2019 4:15 PM, John Carlson wrote:<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>> I’m waiting for a response on whether I should stop using setUSE() (except in cases where > 1 fields are used in a node) in programs using X3DJSAIL.<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'>> Thanks!<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'>> John<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'>Hmmm, perhaps I'm not understanding your question... but here is an attempt at a simple answer.  Plus some additional syntactic sugar.<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'>1. I think a programmer utilizes setUSE() whenever you need to set a USE value on a node.<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'>Example excerpts:<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'><a href="http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter01TechnicalOverview">http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter01TechnicalOverview</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'>HelloWorld.x3d<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'>       <Transform translation='0 -2 0'><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>         <Shape><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>           <Text DEF='TextMessage' string='"Hello" "world!"'><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>             <FontStyle justify='"MIDDLE" "MIDDLE"'/><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>           </Text><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>           <Appearance><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>             <Material USE='MaterialLightBlue'/><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>           </Appearance><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>         </Shape><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>       </Transform><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'>HelloWorld.java<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'>       .addChild(new TransformObject().setTranslation(0.0f,-2.0f,0.0f)<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>         .addChild(new ShapeObject()<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>           .setGeometry(new TextObject("TextMessage").setString(new MFStringObject("\"Hello\" \"world!\""))<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>             .setFontStyle(new FontStyleObject().setJustify(FontStyleObject.JUSTIFY_MIDDLE_MIDDLE)))<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>           .setAppearance(new AppearanceObject()<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>             .setMaterial(new MaterialObject().setUSE("MaterialLightBlue")))))));<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'>HelloWorld.py<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'>      .addChild(Transform() \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>       .setTranslation(SFVec3f([0,-2,0])) \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>       .addChild(Shape() \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>        .setGeometry(Text() \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>         .setDEF(SFString("TextMessage")) \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>         .setString(MFString(["Hello","world!"])) \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>         .setFontStyle(FontStyle() \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>          .setJustify(MFString(["MIDDLE","MIDDLE"])) \<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'>        .setAppearance(Appearance() \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>         .setMaterial(Material() \<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>          .setUSE(SFString("MaterialLightBlue")) \<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'>       ) \<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'>2. Note that if we start putting field adjustments on the same line, the structure for .java and .py are nearly identical.<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'>Other syntax tightening is further possible in .py version:<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>- no apparent need to wrap SFString() in python syntax<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>- I suspect that MFString() wrapping is also superfluous, hopefully we can just use ["Hello","world!"]<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>- Similarly might try replacing SFVec3f([0,-2,0]) with [0,-2,0] - we're getting more Pythonic now!<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>- indenting with two space characters makes scene-graph structure more evident.<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'>3. Spent the day refactoring the X3D Examples Archive projects from Netbeans plain-old freeform projects to Netbeans Java freeform projects.  This doesn't limit any functionality but it does make Java experimentation much simpler... menu items now include Compile/Run/Debug options.<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'>4. Am further noticing from above that the following single-string .java construct<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'>                .setString(new MFStringObject("\"Hello\" \"world!\""))<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 more readable as a String array instead:<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'>                .setString(new MFStringObject(new String[] {"Hello","world!"}))<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'>or even more simply as:<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'>                .setString(new String[] {"Hello","world!"})<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'>Have improved X3dToJava.xslt conversions to simplify accordingly.  Will rerun all java conversions tonight and hopefully redeploy Web3D example archives tomorrow.  Then retest python build tomorrow night.<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'>Also will redeploy X3DJSAIL with this improvement tonight.  Have also added initial PointProperties validation for X3Dv4, included source in full.jar for IDE javadoc/debugging, and fixed a number of X3DLoaderDOM geospatial errors.<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'>all the best, Don<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 Brutzman  Naval Postgraduate School, Code USW/Br       <a href="mailto:brutzman@nps.edu">brutzman@nps.edu</a><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   +1.831.656.2149<o:p></o:p></span></p><p class=MsoNormal><span style='color:black'>X3D graphics, virtual worlds, navy robotics <a href="http://faculty.nps.edu/brutzman">http://faculty.nps.edu/brutzman</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'><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>