<div style="color:rgb(0,0,0);font-family:arial,sans-serif;font-size:12pt"><p style="margin: 0.1rem 0; line-height: 1.0;">I don't know if this helps, but just from memory, every loader I have ever seen that deep into will assign a unique def if a DEFable field does not have a DEF. I think a DEF always helps the runtime. The SAI can discover the assignment if you need it. </p>
<p style="margin: 0.1rem 0; line-height: 1.0;">Joe</p>
<p style="margin: 0.1rem 0; line-height: 1.0;"> </p>
</div>
<div class="elnk-inline-message-container" style="border-left: 1px solid #aaa; box-sizing: border-box; padding: 10px 0 10px 15px; margin: 0;">
<p>-----Original Message-----<br>From: GPU Group <gpugroup@gmail.com><br>Sent: Oct 16, 2023 2:36 PM<br>To: Brutzman, Donald (Don) (CIV) <brutzman@nps.edu><br>Cc: John Carlson <yottzumm@gmail.com>, Joe D Williams <joedwil@earthlink.net>, Peitso, Loren (CIV) <lepeitso@nps.edu>, X3D Graphics public mailing list <x3d-public@web3d.org><br>Subject: Re: Thoughts for x3d.py str() calls</p>
<p style="margin: 0.1rem 0; line-height: 1.0;"> </p>
<div dir="ltr">Don,
<div>Q1. Do you acknowledge x3d.py makes no attempt to conjugate DEF and USE of the same name?</div>
<div>Q2. Do you acknowledge some nodes in x3d can have multiple fields using the same node?</div>
<div>Q3. Do you acknowledge x3d.py controls the order fields of a node are exported?</div>
<div>Q4. Do you acknowledge there may be use-cases when a script using x3d.py will instance DEF and USE x3d.py nodes of the same name in a different order than x3d.py may export?</div>
<div>In HAnimHumanoid 2 fields take the same Coordinate node: a) .coordinate b) .skin (in descendent nodes)</div>
<div>The blender exporter traverses the blender scenegraph in a systematic order convenient to that script. The first time it encounters the Coordinate node it instances an x3d.py Coordinate node with a DEF. The subsequent times it encounters the same node it instances an x3d.py node with a USE of the same name.</div>
<div>x3d.py exports the HAnimHumanoid.coordinate field before .skin. That's a different order than the user script visits blender nodes.</div>
<div>That 2-field-same-node scenario may not occur frequently in web3d, or a using-script may be lucky in its case to instance the DEF and USE in the same order as x3d.py happens to export. So many successful Examples don't help this case.</div>
<div>-Doug</div>
<div> </div>
</div>
<br>
<div class="gmail_quote">
<div class="gmail_attr" dir="ltr">On Mon, Oct 16, 2023 at 2:47 PM Brutzman, Donald (Don) (CIV) <<a href="mailto:brutzman@nps.edu">brutzman@nps.edu</a>> wrote:</div>
<blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left: 1px solid #cccccc; padding-left: 1ex;">
<div class="msg4098376508645506299">
<div lang="EN-US" style="overflow-wrap: break-word;">
<div class="m_4098376508645506299WordSection1">
<p class="MsoNormal">The x3d.py makes no effort to correct author errors. That is up to the author. Trying to “fix” things further can lead to further problems and a corrupted model.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">There are a great many models in X3D Examples with DEF and USE which run properly in unit tests.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">There are several diagnostics built in for reporting errors. Have you tested your erroneous scene to see what you get? If a further error diagnostic is needed, we can add it to the X3DPSAIL TODO list. If you write a python method to do that, we can test it further and possibly integrate it.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<ul style="margin-top: 0in;" type="disc">
<li class="m_4098376508645506299MsoListParagraph" style="margin-left: 0in;">X3D Python Scene Access Interface Library (X3DPSAIL), TODO<u></u><u></u></li>
<li class="m_4098376508645506299MsoListParagraph" style="margin-left: 0in;"><a href="https://www.web3d.org/x3d/stylesheets/python/python.html#TODO" target="_blank" rel="noopener">https://www.web3d.org/x3d/stylesheets/python/python.html#TODO</a><u></u><u></u></li>
</ul>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">If a correct model is getting exported into another form incorrectly, then we can diagnose and fix the conversion. As ever, use-case examples of such errors are essential to continuing progress.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks for all efforts with X3D Python.<u></u><u></u></p>
<div>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 'Courier New';"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 'Courier New';">all the best, Don<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 'Courier New';">-- <u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 'Courier New';">Don Brutzman Naval Postgraduate School, Code USW/Br <a href="mailto:brutzman@nps.edu" target="_blank" rel="noopener">brutzman@nps.edu</a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 'Courier New';">Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 'Courier New';">X3D graphics, virtual worlds, navy robotics <a href="https://faculty.nps.edu/brutzman" target="_blank" rel="noopener">https://faculty.nps.edu/brutzman</a><u></u><u></u></span></p>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div style="border-right: none; border-bottom: none; border-left: none; border-top: 1pt solid #e1e1e1; padding: 3pt 0in 0in;">
<p class="MsoNormal"><strong>From:</strong> GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noopener">gpugroup@gmail.com</a>> <br><strong>Sent:</strong> Monday, October 16, 2023 9:49 AM<br><strong>To:</strong> John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank" rel="noopener">yottzumm@gmail.com</a>><br><strong>Cc:</strong> Brutzman, Donald (Don) (CIV) <<a href="mailto:brutzman@nps.edu" target="_blank" rel="noopener">brutzman@nps.edu</a>>; Joe D Williams <<a href="mailto:joedwil@earthlink.net" target="_blank" rel="noopener">joedwil@earthlink.net</a>>; Peitso, Loren (CIV) <<a href="mailto:lepeitso@nps.edu" target="_blank" rel="noopener">lepeitso@nps.edu</a>>; X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org" target="_blank" rel="noopener">x3d-public@web3d.org</a>><br><strong>Subject:</strong> Re: Thoughts for x3d.py str() calls<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<div>
<p class="MsoNormal">correction first output is <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal"> <Scene><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Group DEF='A'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Transform DEF='C'/><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Group><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Group DEF='B'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Transform DEF='C'/><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Group><u></u><u></u></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Mon, Oct 16, 2023 at 10:32 AM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noopener">gpugroup@gmail.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top: none; border-right: none; border-bottom: none; border-left: 1pt solid #cccccc; padding: 0in 0in 0in 6pt; margin-left: 4.8pt; margin-right: 0in;">
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">That may relate to the DEF USE issue with X3D.py: <u></u><u></u></p>
<div>
<p class="MsoNormal">x x3d.py makes no effort to conjugate DEF and USE and properly order DEF before USE in its export stream<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">- not a common problem unless a node has 2 fields that take the same node (directly SF or indirectly in MFNode descendent field)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">x it's a problem with HAnimHumanoid which has coordinate and skin fields, which typically involve the same Coordinate node<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">- tinkering can be done in the blender exporter, to do a USE before a DEF, but with inconvenience and messy code<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">If a call can be made in x3d.py before exporting a DEF or USE, then that function can be over-ridden to take responsibility for DEF USE conjugation and correct output ordering something like this:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">node = getDefOrUse(node, node.DEF, node.USE)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">and for the x3d.py default it would just return the same element (or node), and overrides can do something more sophisticated.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">more..<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">DEF USE NON-CONJUGATION IN X3D.PY<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">test_def.py<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">x3d = X3D()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">scene = Scene()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">x3d.Scene = scene<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpa = Group(DEF='A')<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpb = Group(DEF='B')<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">scene.children.append(grpa)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">scene.children.append(grpb)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">trans = Transform(DEF='C')<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpb.children.append(trans)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpa.children.append(trans)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">blob = x3d.XML()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">fp = open("dump.x3d","w+")<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">fp.write(blob)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">fp.close()<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">output:<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal"><?xml version="1.0" encoding="UTF-8"?><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "<a href="https://www.web3d.org/specifications/x3d-4.0.dtd" target="_blank" rel="noopener">https://www.web3d.org/specifications/x3d-4.0.dtd</a>"><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><X3D profile='Full' version='4.0' xmlns:xsd='<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance&data=05%7C01%7Cbrutzman%40nps.edu%7C5c09532fc6784acf636108dbce67ceb2%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638330717470356414%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=yglIKBZsT6BoJS9%2BDnaKptd%2FEdy4pnjHp4KFFEuFFLQ%3D&reserved=0" target="_blank" rel="noopener">http://www.w3.org/2001/XMLSchema-instance</a>' xsd:noNamespaceSchemaLocation='<a href="https://www.web3d.org/specifications/x3d-4.0.xsd" target="_blank" rel="noopener">https://www.web3d.org/specifications/x3d-4.0.xsd</a>'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Scene><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Group DEF='A'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Transform USE='C'/><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Group><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Group DEF='B'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Transform DEF='C'/><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Group><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Scene><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"></X3D><u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">test_def_use.py<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">from x3d import *<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">x3d = X3D()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">scene = Scene()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">x3d.Scene = scene<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpa = Group(DEF='A')<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpb = Group(DEF='B')<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">scene.children.append(grpa)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">scene.children.append(grpb)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">trans = Transform(DEF='C')<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpb.children.append(trans)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">grpa.children.append(trans)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">blob = x3d.XML()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">fp = open("dump.x3d","w+")<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">fp.write(blob)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">fp.close()<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">output:<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal"><?xml version="1.0" encoding="UTF-8"?><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "<a href="https://www.web3d.org/specifications/x3d-4.0.dtd" target="_blank" rel="noopener">https://www.web3d.org/specifications/x3d-4.0.dtd</a>"><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><X3D profile='Full' version='4.0' xmlns:xsd='<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance&data=05%7C01%7Cbrutzman%40nps.edu%7C5c09532fc6784acf636108dbce67ceb2%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638330717470512654%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=C1CiwnRN22BrRL7097t92ojvanIkKyb8xlQeolJXaGc%3D&reserved=0" target="_blank" rel="noopener">http://www.w3.org/2001/XMLSchema-instance</a>' xsd:noNamespaceSchemaLocation='<a href="https://www.web3d.org/specifications/x3d-4.0.xsd" target="_blank" rel="noopener">https://www.web3d.org/specifications/x3d-4.0.xsd</a>'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Scene><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Group DEF='A'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Transform USE='C'/><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Group><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Group DEF='B'><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <Transform DEF='C'/><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Group><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> </Scene><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"></X3D><u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Mon, Oct 16, 2023 at 10:09 AM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank" rel="noopener">gpugroup@gmail.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top: none; border-right: none; border-bottom: none; border-left: 1pt solid #cccccc; padding: 0in 0in 0in 6pt; margin-left: 4.8pt; margin-right: 0in;">
<div>
<div>
<p class="MsoNormal">It seems possible to override functions in python, if there are just a few to override. <u></u><u></u></p>
<div>
<p class="MsoNormal">And one suggestion for x3d.py imperfections is to apply fixes at runtime in some initialization function.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">- that assumes/requires just a few target functions, not 480 functions that need to be repaired<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">- so for some fixes it may be helpful to change the upstream x3d.py to call a function that can be easily replaced.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">-Doug<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Example:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">file myclass.py <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">class Wonky:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> def __init__(self):<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> self.color = "Red"<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> def func1(self, color :str) -> bool:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> if color == self.color:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> return True<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> return False<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">file override.py<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">from myclass import *<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">mc = Wonky()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">print("match with Blue? "+str(mc.func1("Blue")))<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">def func2(self, color: str) -> bool:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> if self.color != color:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> return True<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> return False<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Wonky.func1 = func2 # <<<<<<<<<<<< OVERRIDE<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">print("don't match with Blue? "+str(mc.func1("Blue")))<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">output:<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">match with Blue? False<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">don't match with Blue? True<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal">-Doug<u></u><u></u></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">On Mon, Oct 16, 2023 at 9:55 AM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank" rel="noopener">yottzumm@gmail.com</a>> wrote:<u></u><u></u></p>
</div>
<blockquote style="border-top: none; border-right: none; border-bottom: none; border-left: 1pt solid #cccccc; padding: 0in 0in 0in 6pt; margin-left: 4.8pt; margin-right: 0in;">
<p class="MsoNormal">Instead of calling str() to print out a value, call a function that does precision floating point formatting on floats according to a user’s wishes. If the value is a list, call the function recursively with a list comprehension, otherwise, call str. <u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I think this is doable by mere humans.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">John<u></u><u></u></p>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
<p style="margin: 0.1rem 0; line-height: 1.0;"> </p>