[x3d-public] x3d.py error; fixed and deployed updates to X3D Schema, X3DUOM, X3DJSAIL, X3D Ontology and x3d.py X3DPSAIL

John Carlson yottzumm at gmail.com
Mon May 4 08:49:55 PDT 2020


SVG/Observable may provide some hints:
https://stackoverflow.com/questions/43488464/how-to-output-svg-in-a-jupyter-notebook-using-jsdom-d3-and-ijavascript


On Mon, May 4, 2020 at 10:23 AM John Carlson <yottzumm at gmail.com> wrote:

> No one said is was going to be easy!  I suggested actually trying to do
> the same thing the IPython HTML function is doing, but in our own code!
> Perhaps Loren P. can help?  I'm trying to do the same thing (but will
> follow your or Loren's lead) in JavaScript so I can create a JavaScript
> based notebook without python!  Which reminds me, I can do searches!
>
>
> John
>
> On Mon, May 4, 2020 at 9:24 AM John Carlson <yottzumm at gmail.com> wrote:
>
>> I'm looking or the half that takes the XML and "renders" it, that is,
>> puts it in the jupyter results as scene, not as XML.
>>
>> Can you present an example invocation, so we can understand better?
>>
>> I am interested in a JavaScript function (but you can do it in Python for
>> an example), something like replaceWorld(), but the same as HTML() in
>> IPython.display.
>>
>> Something like how HTML() is used here:
>>
>>
>> https://hub.gke.mybinder.org/user/coderextreme-conda-wl8qfw7x/notebooks/es6.ipynb
>>
>>
>>
>> Thanks,
>>
>> John
>>
>> On Mon, May 4, 2020 at 1:33 AM Don Brutzman <brutzman at nps.edu> wrote:
>>
>>> Tonight's update adds several methods to x3d.py
>>>
>>>     .XML()         gives VRML  syntax for any node
>>>     .HTML5()       gives HTML5 syntax for any node (no singleton
>>> self-closing elements)
>>>     .VRML()        gives VRML  syntax for any node
>>> X3D.VRML97()      gives VRML  syntax for a model, suitable for .wrl
>>> X3D.ClassicVRML() gives VRML  syntax for a model, suitable for .x3dv
>>> X3D.X3DOM()       gives HTML with X3DOM prefix/suffix invocation and
>>> X3D.HTML5() inside, suitable for .html
>>>
>>> These have only been tested with smoke tests - but so far so good.  Bug
>>> reports welcome.
>>>
>>> *
>>> https://www.web3d.org/x3d/stylesheets/python/examples/PythonX3dSmokeTests.py
>>> * https://www.web3d.org/x3d/stylesheets/python/build.examples.log.txt
>>>
>>> Excerpts for .XML() .HTML5() and .VRML() follow.  Hope this helps the
>>> Jupyter notebook work to continue forward progress.
>>>
>>> ===================
>>>      (default) XML(syntax="XML") allows self-closing singleton elements
>>>      modelTest.XML(syntax="XML") =
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "
>>> http://www.web3d.org/specifications/x3d-4.0.dtd">
>>> <X3D profile='Immersive' version='4.0' xmlns:xsd='
>>> http://www.w3.org/2001/XMLSchema-instance'
>>> xsd:noNamespaceSchemaLocation='
>>> http://www.web3d.org/specifications/x3d-4.0.xsd'>
>>>    <head>
>>>      <component level='2' name='Grouping'/>
>>>      <unit category='length' conversionFactor='0.001' name='MILLIMETER'/>
>>>      <meta content='name-value pair' name='description'/>
>>>      <meta content='diagnostic test 1' name='info'/>
>>>      <meta content='diagnostic test 2' name='hint'/>
>>>      <meta content='diagnostic test 3' name='warning'/>
>>>      <meta content='diagnostic test 4' name='error'/>
>>>    </head>
>>>    <Scene>
>>>      <WorldInfo DEF='TestWorldInfo' title='modelTest sample scene'/>
>>>      <WorldInfo USE='TestWorldInfo'/>
>>>      <NavigationInfo type='"EXAMINE" "FLY" "ANY"'/>
>>>      <Group DEF='TestGroup' bboxSize='1 2 3'/>
>>>      <Shape DEF='TestShape'>
>>>        <Appearance DEF='TestAppearance'>
>>>          <Material DEF='TestMaterial' diffuseColor='0.4 0.6 0.8'
>>> transparency='0.5'/>
>>>        </Appearance>
>>>        <Box DEF='TestBox'/>
>>>      </Shape>
>>>      <!-- note that comment objects are persistent -->
>>>      <Inline url='"HelloWorld.x3d" "
>>> https://www.web3d.org/x3d/content/examples/HelloWorld.x3d"'/>
>>>    </Scene>
>>> </X3D>
>>>
>>> ===================
>>>      alternate HTML5() produces closing elements, invokes
>>> XML(syntax="HTML5")
>>>      modelTest.HTML5() =
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 4.0//EN" "
>>> http://www.web3d.org/specifications/x3d-4.0.dtd">
>>> <X3D profile='Immersive' version='4.0' xmlns:xsd='
>>> http://www.w3.org/2001/XMLSchema-instance'
>>> xsd:noNamespaceSchemaLocation='
>>> http://www.web3d.org/specifications/x3d-4.0.xsd'>
>>>    <head>
>>>      <component level='2' name='Grouping'></component>
>>>      <unit category='length' conversionFactor='0.001'
>>> name='MILLIMETER'></unit>
>>>      <meta content='name-value pair' name='description'></meta>
>>>      <meta content='diagnostic test 1' name='info'></meta>
>>>      <meta content='diagnostic test 2' name='hint'></meta>
>>>      <meta content='diagnostic test 3' name='warning'></meta>
>>>      <meta content='diagnostic test 4' name='error'></meta>
>>>    </head>
>>>    <Scene>
>>>      <WorldInfo DEF='TestWorldInfo' title='modelTest sample
>>> scene'></WorldInfo>
>>>      <WorldInfo USE='TestWorldInfo'></WorldInfo>
>>>      <NavigationInfo type='"EXAMINE" "FLY" "ANY"'></NavigationInfo>
>>>      <Group DEF='TestGroup' bboxSize='1 2 3'></Group>
>>>      <Shape DEF='TestShape'>
>>>        <Appearance DEF='TestAppearance'>
>>>          <Material DEF='TestMaterial' diffuseColor='0.4 0.6 0.8'
>>> transparency='0.5'></Material>
>>>        </Appearance>
>>>        <Box DEF='TestBox'></Box>
>>>      </Shape>
>>>      <!-- note that comment objects are persistent -->
>>>      <Inline url='"HelloWorld.x3d" "
>>> https://www.web3d.org/x3d/content/examples/HelloWorld.x3d"'></Inline>
>>>    </Scene>
>>> </X3D>
>>>
>>> ===================
>>>                VRML() produces Virtual Reality Modeling Language syntax
>>>      modelTest.VRML() =
>>> #VRML V4.0 utf8
>>> # X3D-to-ClassicVRML serialization autogenerated by X3DPSAIL x3d.py
>>>
>>> PROFILE Immersive
>>> COMPONENT Grouping:2
>>> UNIT length MILLIMETER 0.001
>>> META "description" "name-value pair"
>>> META "info" "diagnostic test 1"
>>> META "hint" "diagnostic test 2"
>>> META "warning" "diagnostic test 3"
>>> META "error" "diagnostic test 4"
>>>
>>> DEF TestWorldInfo WorldInfo { title "modelTest sample scene" }
>>> USE TestWorldInfo
>>> NavigationInfo { type ["EXAMINE" "FLY" "ANY"] }
>>> DEF TestGroup Group { bboxSize 1 2 3 }
>>> DEF TestShape Shape {
>>>    appearance DEF TestAppearance Appearance {
>>>      material DEF TestMaterial Material { diffuseColor 0.4 0.6 0.8
>>> transparency 0.5 } }
>>>    geometry DEF TestBox Box { } }
>>> # note that comment objects are persistent
>>> Inline { url ["HelloWorld.x3d" "
>>> https://www.web3d.org/x3d/content/examples/HelloWorld.x3d"] }
>>>
>>> ===================
>>>
>>>
>>>
>>> On 4/30/2020 9:34 PM, Don Brutzman wrote:
>>> > Thanks for tracking this down Andreas, very useful.  Also agreed that
>>> it is a good idea to put parameters in the .XML() function signature.
>>> >
>>> > The syntax.html restrictions you quote are all part of Chapter 8, HTML
>>> syntax.
>>> >
>>> > XML rules appear in Chapter 9, XML Syntax.  Once you subtract warnings
>>> about Processing Instructions and DOCTYPES in DOM Document, which are never
>>> used within X3D scene graphs anyway, this chapter seems very short and just
>>> like... plain old XML.
>>> >
>>> > There used to be a Quirks mode in HTML5 that allowed mismatched tags,
>>> matching tags, etc.  Looks like it was removed it as browsers matured.
>>> Seems like HTML parser writers instead went out of their way to enforce
>>> void tags and no singleton tags in "HTML syntax", effectively guaranteeing
>>> XML incompatibility.
>>> >
>>> > So our first python .XML() parameter would seem to be (default)
>>> syntax="HTML" with "XML" alternative, each with corresponding strict
>>> compliance to all requirements in HTML5.2 Recommendation.
>>> >
>>> > Next parameter: hmmm, the precision requirements for different data in
>>> a scene can vary.  For example, significant digits for points and normals
>>> and colors and angles and transparency each have varying perceptual
>>> sensitivity.  One thing for sure is that default precision=None should have
>>> no effect since digital signature or round-trip testing might be involved
>>> (First Do No Harm).  Not sure how we should express this parameter.
>>> >
>>> > Another conceivable parameter is verbose=False though not sure why
>>> anyone would want default attribute values as an output... perhaps as a
>>> learning or authoring assist.  Not hard to include if desired...
>>> >
>>> > Are there any other .XML() parameter options that a python programmer
>>> (or Jupyter notebook author) might want?
>>> >
>>> >
>>> > On 4/29/2020 1:03 PM, Andreas Plesch wrote:
>>> >> I suppose the example notebooks are getting sufficiently useful to
>>> >> start to clean them up and then better organize in a more permanent
>>> >> place.
>>> >>
>>> >> .XML() as a function does not seem unusual and would allow for
>>> >> parameters. In addition to a short_empty_elements=False option,
>>> >> controlling the precision (and perhaps format) of output of numerical
>>> >> fields could be also very useful.
>>> >>
>>> >> With regards to singletons my understanding is that HTML5 generally
>>> >> does not allow them. The exception is a well defined list of 14
>>> >> elements which are called void or empty elements, for example the
>>> >> <area> element. For those 14 elements closing tags are actually
>>> >> invalid (although most browsers do not mind them). In addition, the
>>> >> preferred syntax for empty elements is without the solidus(/) : <area>
>>> >> . However, <area /> is also allowed.
>>> >> Since all of the X3D tag names are not on this list of empty elements,
>>> >> they all need the closing tag. Note, that all this is only true for
>>> >> the HTML encoding of HTML5 which is not XML. XHTML is xml and all the
>>> >> XML rules apply.
>>> >>
>>> >> Ok. I looked up relevant sections in the HTML5 spec.:
>>> >>
>>> >> https://www.w3.org/TR/html52/syntax.html#void-elements : lists the
>>> 14 elements
>>> >>
>>> >> "Void elements only have a start tag; end tags must not be specified
>>> >> for void elements."
>>> >>
>>> >> Further, X3D tag names are (currently) considered "Unknown Elements"
>>> >> since they are not part of HTML. Unknown elements are classified as
>>> >> "Normal Elements:
>>> >> https://www.w3.org/TR/html52/single-page.html#elements-in-the-dom.
>>> >> Normal elements have a closing tag since they are not known void
>>> >> elements and may have text or other content:
>>> >>
>>> https://www.w3.org/TR/html52/syntax.html#writing-html-documents-elements
>>> >> "  normal elements have a start tag to indicate where they begin, and
>>> >> an end tag to indicate where they end."
>>> >>
>>> >> There are also Foreign Elements which are elements from the MathML
>>> >> namespace and the SVG namespace. These are defined elsewhere and
>>> >> include singletons. HTML recognizes this and allows the short
>>> >> self-closing syntax </> for those: " Foreign elements must either have
>>> >> a start tag and an end tag, or a start tag that is marked as
>>> >> self-closing, in which case they must not have an end tag."
>>> >>
>>> >> https://www.w3.org/TR/html52/syntax.html#start-tags
>>> >>
>>> >> item 6. explains the self-closing syntax:
>>> >>
>>> >> " Start tags must have the following format:
>>> >> ...
>>> >> 6. Then, if the element is one of the void elements, or if the element
>>> >> is a foreign element, then there may be a single U+002F SOLIDUS
>>> >> character (/). This character has no effect on void elements, but on
>>> >> foreign elements it marks the start tag as self-closing.
>>> >>
>>> >> 7.  Finally, start tags must be closed by a U+003E GREATER-THAN SIGN
>>> >> character (>)."
>>> >>
>>> >> There are also Custom Elements. Since custom elements are not in the
>>> >> list of 14 void elements, they also have an end tag.
>>> >>
>>> >> -Andreas
>>> >>
>>> >>
>>> >> On Wed, Apr 29, 2020 at 2:28 AM Don Brutzman <brutzman at nps.edu>
>>> wrote:
>>> >>>
>>> >>> Thanks for confirm Andreas.  Your example keeps getting better!
>>> (Suggested backing out viewpoints to more distant perspective if possible;
>>> also typo "baseed").
>>> >>>
>>> >>> Given the state of browser support, yes that makes sense to add
>>> option for adding closing tags rather than singletons.  My understanding is
>>> that this is a limitation of some HTML browsers... any idea why, have you
>>> found any rationale or documentation about it?  Wondering if there is a
>>> reason (or maybe they are just unreconstructed HTML4 quirk worshippers).
>>> >>>
>>> >>> I will work on a property and also persistent configuration
>>> settings, if possible.  Further can ensure consistent capabilities in
>>> X3dToX3dom/X3dToX_ITE stylesheet switches and also X3DJSAIL.
>>> >>>
>>> >>> Also hoping to omit the () function suffix from .XML() method.
>>> Response will be less rapid this time (actually have a day job too).
>>> >>>
>>> >>> Am planning to get full regression testing of export working before
>>> adding similar capabilty for .VRML encoding so that any latent errors are
>>> detected and fully ironed out.  Of note is that x3d.py binary is only 277K,
>>> much less than source (which is over 1MB now).  As a result I won't worry
>>> about trying to refactor output serializations in an object-oriented way,
>>> that can only cause errors and grief when compared to the easily inspected
>>> serialization code already in place.  Efficiency already seems great so
>>> we'll reserve effort for what actually adds value.
>>> >>>
>>> >>> On 4/27/2020 1:15 PM, Andreas Plesch wrote:
>>> >>>> Hi Don,
>>> >>>>
>>> >>>> thanks for the quick response. I can confirm that 0.0.28 now
>>> properly
>>> >>>> generates XML for MF values (arrays), and SF vectors (sequences).
>>> >>>>
>>> >>>>
>>> https://nbviewer.jupyter.org/github/andreasplesch/OCCToX3D/blob/conda2/notebooks/stp_x3d_with_vp4.ipynb
>>> >>>>
>>> >>>> has an example at the end where I used x3d.py for generating Text
>>> and
>>> >>>> Inline nodes.
>>> >>>>
>>> >>>> For HTML purposes it would be useful to have an option for .XML() to
>>> >>>> generate a full end tag. Inline().XML(short_empty_elements=False)
>>> >>>> would then generate
>>> >>>>
>>> >>>> <Inline></Inline>
>>> >>>>
>>> >>>> I know this is a bit out of scope of x3d.py but perhaps possible to
>>> >>>> add to the autogeneration.
>>> >>>>
>>> >>>> Currently, I use the standard, python included ElementTree module to
>>> >>>> do this but including it in x3d.py would save parsing and
>>> reexporting
>>> >>>> the XML.
>>> >>>>
>>> >>>> thanks again, Andreas
>>> >>>>
>>> >>>> On Mon, Apr 27, 2020 at 2:32 AM Don Brutzman <brutzman at nps.edu>
>>> wrote:
>>> >>>>>
>>> >>>>> Did a lot of work this weekend, all interrelated and
>>> cross-checked.  Uploads in progress.
>>> >>>>>
>>> >>>>> Test logs are themselves maintained in version control so that (a)
>>> output changes are evident during development, and (b) other developers can
>>> see what is expected.
>>> >>>>>
>>> >>>>> a. X3D Schema and X3DUOM
>>> >>>>>      http://web3d.org/specifications
>>> >>>>> - annotation appinfo added to a number of String enumeration
>>> values, which can be either strict choices or optional values in X3D spec.
>>> >>>>> - X3DUOM updated to indicate simpleType as well as baseType for
>>> each field when appropriate, giving fuller expression to object model.
>>> >>>>> - X3DUOM name attributes now appear first for readability.
>>> >>>>> - These changes supported the follow-on library improvements,
>>> additional work also applied.
>>> >>>>>
>>> >>>>> -------
>>> >>>>>
>>> >>>>> b. X3DJSAIL
>>> >>>>>      X3D Java Scene Access Interface Library (X3DJSAIL)
>>> >>>>>      https://www.web3d.org/specifications/java/X3DJSAIL.html
>>> >>>>> - Corresponding update applied to X3DJSAIL with only minor tweaks.
>>> >>>>>
>>> >>>>> -------
>>> >>>>>
>>> >>>>> c. X3D Ontology
>>> >>>>>      https://www.web3d.org/x3d/content/semantics/semantics.html
>>> >>>>> - simple-type enumeration lists added, excerpt follows
>>> >>>>> - typing of fields now reflects these simple types
>>> >>>>> - name attribute typing is also stricter, e.g. some names are
>>> NMTOKEN
>>> >>>>> - found feature in protege for diagnosing error lines in turtle
>>> .ttl
>>> >>>>> - ready for further work on accessType representations, continuing
>>> prior efforts
>>> >>>>>
>>> >>>>> :closureTypeChoices rdf:type rdfs:Datatype ;
>>> >>>>>      rdfs:label "closureTypeChoices" ;
>>> >>>>>      dc:description "closureTypeChoices are strictly allowed
>>> enumeration values for ArcClose2D closureType field" ;
>>> >>>>>      rdfs:range xs:NMTOKEN ;
>>> >>>>>      rdfs:domain [ owl:unionOf ( 'PIE' 'CHORD' ) ] .
>>> >>>>> # PIE "Connects arc endpoints to center, forming a pie wedge"
>>> >>>>> # CHORD "Connects arc endpoints directly to each other, as in
>>> chord on a circle"
>>> >>>>>
>>> >>>>> -------
>>> >>>>>
>>> >>>>> d. x3d.py X3DPSAIL package
>>> >>>>>      https://www.web3d.org/x3d/stylesheets/python/python.html
>>> >>>>> - renamed toXML() as XML(), added XML() export methods to all X3D
>>> types
>>> >>>>> - used these for export output for all field values for consistency
>>> >>>>> - added unit tests for all types, tests successful
>>> >>>>>
>>> https://www.web3d.org/x3d/stylesheets/python/examples/PythonX3dSmokeTests.py
>>> >>>>>
>>> https://www.web3d.org/x3d/stylesheets/python/build.examples.log.txt
>>> >>>>>
>>> >>>>> example excerpts:
>>> >>>>> - - - - - - - - - -
>>> >>>>> SFString test       = 'test setter'
>>> >>>>> SFString test.value = test setter
>>> >>>>> SFString test.XML() = test setter
>>> >>>>> SFString     isValidSFString(test)=True
>>> >>>>> SFString assertValidSFString(test)
>>> >>>>> MFString test       = [test, setters and getters]
>>> >>>>> MFString test.value = ['test', 'setters and getters']
>>> >>>>> MFString test.XML() = "test" "setters and getters"
>>> >>>>> MFString     isValidMFString(test)=True
>>> >>>>> MFString assertValidMFString(test)
>>> >>>>> downcasting by dereferencing simple-list value=[one], type=<class
>>> 'x3d.MFString'> as one
>>> >>>>> SFString test downcast legal singleton:
>>> SFString(MFString("one"))='one', type=<class 'x3d.SFString'>
>>> >>>>> MFString test   upcast legal SF value:
>>> MFString(SFString("two"))=['two'], type=<class 'x3d.MFString'>
>>> >>>>> - - - - - - - - - -
>>> >>>>> MFNode test.XML()             =
>>> >>>>> <Group DEF='B'/>
>>> >>>>> <Shape DEF='C'>
>>> >>>>>      <Appearance DEF='D'>
>>> >>>>>        <Material DEF='E'/>
>>> >>>>>      </Appearance>
>>> >>>>> </Shape>
>>> >>>>> <WorldInfo DEF='F'/>
>>> >>>>> - - - - - - - - - -
>>> >>>>> - simple-type enumeration lists added, excerpt follows
>>> >>>>> - added assertion methods to check enumeration values valid,
>>> throws exception otherwise
>>> >>>>>
>>> >>>>> CLOSURETYPECHOICES = (
>>> >>>>>        # strict set of allowed values follow, no other values are
>>> valid
>>> >>>>>        'PIE', # Connects arc endpoints to center, forming a pie
>>> wedge
>>> >>>>>        'CHORD' # Connects arc endpoints directly to each other, as
>>> in chord on a circle
>>> >>>>> )
>>> >>>>> def assertValidClosureType(fieldName, value):
>>> >>>>>        """
>>> >>>>>        Utility function to assert type validity of
>>> closureTypeChoices value, otherwise raise X3DTypeError with diagnostic
>>> message.
>>> >>>>>        Note MFString enumeration values are provided in XML
>>> syntax, so check accordingly.
>>> >>>>>        """
>>> >>>>>        if  not value:
>>> >>>>>            return True # no failure on empty defaults
>>> >>>>>        if  isinstance(value,SFString) or isinstance(value,str):
>>> >>>>>            if str(value) in CLOSURETYPECHOICES:
>>> >>>>>                return True
>>> >>>>>            raise X3DTypeError(fieldName + ' value=' + value + '
>>> does not match allowed enumerations in CLOSURETYPECHOICES=' +
>>> str(CLOSURETYPECHOICES))
>>> >>>>>        if  isinstance(value,MFString):
>>> >>>>>            if MFString(value).XML() in CLOSURETYPECHOICES:
>>> >>>>>                return True
>>> >>>>>            raise X3DTypeError(fieldName + ' value=' +
>>> MFString(value).XML() + ' does not match allowed enumerations in
>>> CLOSURETYPECHOICES=' + str(CLOSURETYPECHOICES))
>>> >>>>>
>>> >>>>> class ArcClose2D(_X3DGeometryNode):
>>> >>>>> # ...
>>> >>>>>        @property # getter - - - - - - - - - -
>>> >>>>>        def closureType(self):
>>> >>>>>            """Defines whether pair of line segments connect to
>>> center (PIE), or single line-segment chord connects arc endpoints
>>> (CHORD)."""
>>> >>>>>            return self.__closureType
>>> >>>>>        @closureType.setter
>>> >>>>>        def closureType(self, closureType=None):
>>> >>>>>            if  closureType is None:
>>> >>>>>                closureType = SFString.DEFAULT_VALUE
>>> >>>>>            assertValidSFString(closureType)
>>> >>>>>            assertValidClosureType('closureType', closureType)
>>> >>>>>            self.__closureType = closureType
>>> >>>>>
>>> >>>>> -------
>>> >>>>>
>>> >>>>> So Andreas hopefully this should give you everything you might
>>> need and expect for .XML() export.
>>> >>>>>
>>> >>>>> Am hoping Loren can help me with incantation so that all we need
>>> syntactically is .XML export.
>>> >>>>>
>>> >>>>> It will be straightforward to add .VRML export (.X3DV and .WRL
>>> methods perhaps) once we are satisfied with .XML for .x3d files/strings.
>>> >>>>>
>>> >>>>> I like how Python usually fails bitterly until you get things
>>> exactly right.
>>> >>>>>
>>> >>>>> Didn't have time to check anything with python packaging yet.
>>> >>>>>
>>> >>>>> Feedback welcome.
>>> >>>>>
>>> >>>>> On 4/23/2020 12:14 PM, Don Brutzman wrote:
>>> >>>>>> Thanks for trouble report.  This was similar to error a few days
>>> ago, common cause was incorrect handling of MFString fields by toXML()
>>> method.
>>> >>>>>>
>>> >>>>>> Now fixed and deployed.  I've performed regression tests on about
>>> 4000 models, have ~30 Traceback errors to continue diagnosis on.  So...
>>> toXML() is pretty much implemented now!
>>> >>>>>>
>>> >>>>>> * Python X3D Package x3d.py
>>> >>>>>>      X3D Python Scene Access Interface Library (X3DPSAIL)
>>> >>>>>>      https://www.web3d.org/x3d/stylesheets/python/python.html
>>> >>>>>>
>>> >>>>>> * pip install x3d; Python package x3d
>>> >>>>>>      https://pypi.org/project/x3d
>>> >>>>>>
>>> >>>>>> Further improvement suggestions and bug reports welcome.  Hoping
>>> to complement other work, today's Design Printing Scanning demo was great -
>>> thanks very much.
>>> >>>>>>
>>> >>>>>> Have fun with X3D Python!
>>> >>>>>>
>>> >>>>>> On 4/23/2020 3:55 AM, Andreas Plesch wrote:
>>> >>>>>>> When I try this:
>>> >>>>>>>
>>> >>>>>>> inline=Inline(url=["Vent.x3d"])
>>> >>>>>>>
>>> >>>>>>> toXML() generates an error:
>>> >>>>>>>
>>> >>>>>>> inline.toXML()
>>> >>>>>>>
>>> >>>>>>>
>>> ---------------------------------------------------------------------------
>>> >>>>>>> TypeError                                 Traceback (most recent
>>> call last)
>>> >>>>>>> <ipython-input-26-2e0e2ed2e4db> in <module>
>>> >>>>>>> ----> 1 inline.toXML()
>>> >>>>>>>
>>> >>>>>>> ~/x3d.py in toXML(self, indentLevel)
>>> >>>>>>>      22341             result += " load='" + str(self.load) + "'"
>>> >>>>>>>      22342         if self.url != list():
>>> >>>>>>>> 22343             result += " url='" + self.url + "'"
>>> >>>>>>>      22344         if self.visible != True:
>>> >>>>>>>      22345             result += " visible='" +
>>> str(self.visible) + "'"
>>> >>>>>>>
>>> >>>>>>> TypeError: can only concatenate str (not "list") to str
>>> >>>>>>>
>>> >>>>>>> This is the x3d.py linked from the web3d web page.
>>> >>>>>>>
>>> >>>>>>> Do I need to do something different?
>>> >>>>>>>
>>> >>>>>>> -Andreas
>>> >>>>> 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
>>> http://faculty.nps.edu/brutzman
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>
>>> >>> 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
>>> http://faculty.nps.edu/brutzman
>>> >>
>>> >>
>>> >>
>>> >
>>> > all the best, Don
>>>
>>> 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
>>> http://faculty.nps.edu/brutzman
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20200504/c653b904/attachment-0001.html>


More information about the x3d-public mailing list