[x3d-public] Thoughts for x3d.py str() calls

John Carlson yottzumm at gmail.com
Mon Oct 16 17:41:33 PDT 2023


Here’s a python example from Doug:


trans = Transform(DEF='C')
grpb.children.append(trans)
grpa.children.append(trans)

Is the author doing the wrong thing?

John

On Mon, Oct 16, 2023 at 7:37 PM John Carlson <yottzumm at gmail.com> wrote:

> If we keep a reference around to place in both skin coordinate and
> skinCoord, will x3d.py be smart enough to output DEF in the first case and
> USE in the second case, or will it just output whatever DEF or USE is
> currently stored for the node?  Will it gladly print out both USE and DEF
> plus all the fields along with USE and DEF?  A simple python example would
> use a a reference more than once.  I don’t have that yet, but it should be
> easy to create one.
>
> No, I don’t want to override the str function, because my new function
> will use it.
>
> On Mon, Oct 16, 2023 at 5:32 PM Joe D Williams <joedwil at earthlink.net>
> wrote:
>
>> 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.
>>
>> Joe
>>
>>
>>
>> -----Original Message-----
>> From: GPU Group <gpugroup at gmail.com>
>> Sent: Oct 16, 2023 2:36 PM
>> To: Brutzman, Donald (Don) (CIV) <brutzman at nps.edu>
>> Cc: John Carlson <yottzumm at gmail.com>, Joe D Williams <
>> joedwil at earthlink.net>, Peitso, Loren (CIV) <lepeitso at nps.edu>, X3D
>> Graphics public mailing list <x3d-public at web3d.org>
>> Subject: Re: Thoughts for x3d.py str() calls
>>
>>
>> Don,
>> Q1. Do you acknowledge x3d.py makes no attempt to conjugate DEF and USE
>> of the same name?
>> Q2. Do you acknowledge some nodes in x3d can have multiple fields using
>> the same node?
>> Q3. Do you acknowledge x3d.py controls the order fields of a node are
>> exported?
>> 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?
>> In HAnimHumanoid 2 fields take the same Coordinate node: a) .coordinate
>> b) .skin (in descendent nodes)
>> 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.
>> x3d.py exports the HAnimHumanoid.coordinate field before .skin. That's a
>> different order than the user script visits blender nodes.
>> 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.
>> -Doug
>>
>>
>> On Mon, Oct 16, 2023 at 2:47 PM Brutzman, Donald (Don) (CIV) <
>> brutzman at nps.edu> wrote:
>>
>>> 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.
>>>
>>>
>>>
>>> There are a great many models in X3D Examples with DEF and USE which run
>>> properly in unit tests.
>>>
>>>
>>>
>>> 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.
>>>
>>>
>>>
>>>    - X3D Python Scene Access Interface Library (X3DPSAIL), TODO
>>>    - https://www.web3d.org/x3d/stylesheets/python/python.html#TODO
>>>
>>>
>>>
>>> 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.
>>>
>>>
>>>
>>> Thanks for all efforts with X3D Python.
>>>
>>>
>>>
>>> all the best, Don
>>>
>>> --
>>>
>>> Don Brutzman  Naval Postgraduate School, Code USW/Br
>>> brutzman at nps.edu
>>>
>>> Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA
>>> +1.831.656.2149
>>>
>>> X3D graphics, virtual worlds, navy robotics
>>> https://faculty.nps.edu/brutzman
>>>
>>>
>>>
>>> *From:* GPU Group <gpugroup at gmail.com>
>>> *Sent:* Monday, October 16, 2023 9:49 AM
>>> *To:* John Carlson <yottzumm at gmail.com>
>>> *Cc:* Brutzman, Donald (Don) (CIV) <brutzman at nps.edu>; Joe D Williams <
>>> joedwil at earthlink.net>; Peitso, Loren (CIV) <lepeitso at nps.edu>; X3D
>>> Graphics public mailing list <x3d-public at web3d.org>
>>> *Subject:* Re: Thoughts for x3d.py str() calls
>>>
>>>
>>>
>>> correction first output is
>>>
>>>   <Scene>
>>>
>>>     <Group DEF='A'>
>>>
>>>       <Transform DEF='C'/>
>>>
>>>     </Group>
>>>
>>>     <Group DEF='B'>
>>>
>>>       <Transform DEF='C'/>
>>>
>>>     </Group>
>>>
>>>
>>>
>>> On Mon, Oct 16, 2023 at 10:32 AM GPU Group <gpugroup at gmail.com> wrote:
>>>
>>> That may relate to the DEF USE issue with X3D.py:
>>>
>>> x x3d.py makes no effort to conjugate DEF and USE and properly order DEF
>>> before USE in its export stream
>>>
>>> - not a common problem unless a node has 2 fields that take the same
>>> node (directly SF or indirectly in MFNode descendent field)
>>>
>>> x it's a problem with HAnimHumanoid which has coordinate and skin
>>> fields, which typically involve the same Coordinate node
>>>
>>> - tinkering can be done in the blender exporter, to do a USE before a
>>> DEF,  but with inconvenience and messy code
>>>
>>> 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:
>>>
>>> node = getDefOrUse(node, node.DEF, node.USE)
>>>
>>> and for the x3d.py default it would just return the same element (or
>>> node), and overrides can do something more sophisticated.
>>>
>>>
>>>
>>> more..
>>>
>>> DEF USE NON-CONJUGATION IN X3D.PY
>>>
>>> test_def.py
>>>
>>> x3d = X3D()
>>>
>>> scene = Scene()
>>>
>>> x3d.Scene = scene
>>>
>>> grpa = Group(DEF='A')
>>>
>>> grpb = Group(DEF='B')
>>>
>>> scene.children.append(grpa)
>>>
>>> scene.children.append(grpb)
>>>
>>> trans = Transform(DEF='C')
>>>
>>> grpb.children.append(trans)
>>>
>>> grpa.children.append(trans)
>>>
>>> blob = x3d.XML()
>>>
>>> fp = open("dump.x3d","w+")
>>>
>>> fp.write(blob)
>>>
>>> fp.close()
>>>
>>>
>>>
>>> output:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "
>>> https://www.web3d.org/specifications/x3d-4.0.dtd">
>>>
>>> <X3D profile='Full' version='4.0' xmlns:xsd='
>>> http://www.w3.org/2001/XMLSchema-instance
>>> <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>'
>>> xsd:noNamespaceSchemaLocation='
>>> https://www.web3d.org/specifications/x3d-4.0.xsd'>
>>>
>>>   <Scene>
>>>
>>>     <Group DEF='A'>
>>>
>>>       <Transform USE='C'/>
>>>
>>>     </Group>
>>>
>>>     <Group DEF='B'>
>>>
>>>       <Transform DEF='C'/>
>>>
>>>     </Group>
>>>
>>>   </Scene>
>>>
>>> </X3D>
>>>
>>>
>>>
>>> test_def_use.py
>>>
>>> from x3d import *
>>>
>>>
>>>
>>> x3d = X3D()
>>>
>>> scene = Scene()
>>>
>>> x3d.Scene = scene
>>>
>>> grpa = Group(DEF='A')
>>>
>>> grpb = Group(DEF='B')
>>>
>>> scene.children.append(grpa)
>>>
>>> scene.children.append(grpb)
>>>
>>> trans = Transform(DEF='C')
>>>
>>> grpb.children.append(trans)
>>>
>>> grpa.children.append(trans)
>>>
>>> blob = x3d.XML()
>>>
>>> fp = open("dump.x3d","w+")
>>>
>>> fp.write(blob)
>>>
>>> fp.close()
>>>
>>>
>>>
>>> output:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "
>>> https://www.web3d.org/specifications/x3d-4.0.dtd">
>>>
>>> <X3D profile='Full' version='4.0' xmlns:xsd='
>>> http://www.w3.org/2001/XMLSchema-instance
>>> <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>'
>>> xsd:noNamespaceSchemaLocation='
>>> https://www.web3d.org/specifications/x3d-4.0.xsd'>
>>>
>>>   <Scene>
>>>
>>>     <Group DEF='A'>
>>>
>>>       <Transform USE='C'/>
>>>
>>>     </Group>
>>>
>>>     <Group DEF='B'>
>>>
>>>       <Transform DEF='C'/>
>>>
>>>     </Group>
>>>
>>>   </Scene>
>>>
>>> </X3D>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Mon, Oct 16, 2023 at 10:09 AM GPU Group <gpugroup at gmail.com> wrote:
>>>
>>> It seems possible to override functions in python, if there are just a
>>> few to override.
>>>
>>> And one suggestion for x3d.py imperfections is to apply fixes at runtime
>>> in some initialization function.
>>>
>>> - that assumes/requires just a few target functions, not 480 functions
>>> that need to be repaired
>>>
>>> - so for some fixes it may be helpful to change the upstream x3d.py to
>>> call a function that can be easily replaced.
>>>
>>> -Doug
>>>
>>> Example:
>>>
>>> file myclass.py
>>>
>>> class Wonky:
>>>
>>>   def __init__(self):
>>>
>>>     self.color = "Red"
>>>
>>>   def func1(self, color :str) -> bool:
>>>
>>>     if color == self.color:
>>>
>>>       return True
>>>
>>>     return False
>>>
>>>
>>>
>>> file override.py
>>>
>>> from myclass import *
>>>
>>>
>>>
>>> mc = Wonky()
>>>
>>> print("match with Blue? "+str(mc.func1("Blue")))
>>>
>>>
>>>
>>> def func2(self, color: str) -> bool:
>>>
>>>   if self.color != color:
>>>
>>>     return True
>>>
>>>   return False
>>>
>>> Wonky.func1 = func2 # <<<<<<<<<<<< OVERRIDE
>>>
>>> print("don't match with Blue? "+str(mc.func1("Blue")))
>>>
>>>
>>>
>>> output:
>>>
>>> match with Blue? False
>>>
>>> don't match with Blue? True
>>>
>>> -Doug
>>>
>>>
>>>
>>> On Mon, Oct 16, 2023 at 9:55 AM John Carlson <yottzumm at gmail.com> wrote:
>>>
>>> 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.
>>>
>>>
>>>
>>> I think this is doable by mere humans.
>>>
>>>
>>>
>>> Thanks,
>>>
>>>
>>>
>>> John
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20231016/4ba0430b/attachment-0001.html>


More information about the x3d-public mailing list