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

John Carlson yottzumm at gmail.com
Mon Oct 16 19:52:19 PDT 2023


Please validate your example with X3D-Edit 4.0

Thanks!

Johm

On Mon, Oct 16, 2023 at 9:38 PM Joe D Williams <joedwil at earthlink.net>
wrote:

> > Can nodes really contain both a DEF and a USE?
>
>
>
>   <Transform translation='0.5 0.01 0' scale='1 1.5 1'>
>     <Shape DEF='Example3' USE='FlowerCenter'/>
>
>
>
> Joe
>
>
>
>
>
> -----Original Message-----
> From: John Carlson <yottzumm at gmail.com>
> Sent: Oct 16, 2023 6:31 PM
> To: Joe D Williams <joedwil at earthlink.net>
> Cc: Brutzman Donald (Don) (CIV) <brutzman at nps.edu>, GPU Group <
> gpugroup at gmail.com>, 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
>
>
> Can nodes really contain both a DEF and a USE?
>
> John
> On Mon, Oct 16, 2023 at 8:27 PM Joe D Williams <joedwil at earthlink.net>
> wrote:
>
>> > Is the author doing the wrong thing?How can you tell right or wrong
>> from that example? If building a scene, why not use X3D SAI features. If
>> you are simply inventing away to build good user code, then this should
>> fail. In general, why invent an append, and what is this supposed to
>> append. Please check x3d SAI for this type of functionality.
>>
>> trans = Transform(DEF='C')  # probably need to set other fields
>>
>> grpb.children.append(Transform(DEF='D' USE='C')
>>
>> grpa.children.append(Transform(DEF='E' USE='C')
>>
>>
>>
>> or something, but look at SAI for this kind of stuff
>> Joe
>>
>> -----Original Message-----
>> From: John Carlson <yottzumm at gmail.com>
>> Sent: Oct 16, 2023 5:41 PM
>> To: Joe D Williams <joedwil at earthlink.net>
>> Cc: Brutzman Donald (Don) (CIV) <brutzman at nps.edu>, GPU Group <
>> gpugroup at gmail.com>, 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
>>
>>
>> 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/66b23950/attachment-0001.html>


More information about the x3d-public mailing list