[x3d-public] Fwd: x3d.py ProtoBody setter?

John Carlson yottzumm at gmail.com
Sun Aug 22 05:23:46 PDT 2021


Don, here is message with ProtoBody setter issue I found.  What I did in
the setter is was add xx in front of the ProtoBody parameter, and I got
past the error.

I haven’t looked for the enclosing class yet.   I’m guessing that the
ProtoDeclare creation is not compliant with SAI standards, which require
XML or VRML encodings of Protos?  Afaict.   This would require an XML or
VRML parser which I haven’t spotted in x3d.py yet.  I just looked at the
examples in the standards, some time ago when I was working with VRMLScript.

See python attached.

John

---------- Forwarded message ---------
From: John Carlson <yottzumm at gmail.com>
Date: Thu, Aug 19, 2021 at 3:46 AM
Subject: x3d.py ProtoBody setter?
To: Don Brutzman <brutzman at nps.edu>, X3D Graphics public mailing list <
x3d-public at web3d.org>


    Fixing these bugs will give me a lot more confidence in x3d.py.  I
hope there's a 4.0.42 version soon!


Existing pattern, finding errors:

    @ProtoBody.setter
     def ProtoBody(self, ProtoBody):
         if  ProtoBody is None:
             ProtoBody = None # default
         assertValidSFNode(ProtoBody)
         if not ProtoBody is None and not
isinstance(ProtoBody,(ProtoBody,ProtoInstance)):
             # print(flush=True)
             raise X3DTypeError(str(ProtoBody) + ' does not match
required node type (ProtoBody,ProtoInstance) and is invalid')
         self.__ProtoBody = ProtoBody


===========================

Exception (file attached will probably be rejected).   There are many
files with this error.   Could it be a python 3.8 issue?  I'm guessing
that ProtoBody is not a type as in the arg 2 tuple, rather it's a
parameter? (see above)

$ python3 rubik.py

x3d.py package loaded, have fun with X3D Graphics!
Traceback (most recent call last):
   File "rubik.py", line 37, in <module>
     ProtoDeclare(name='sphereproto',
   File
"/home/coderextreme/X3DJSONLD/src/main/python/net/x3djsonld/data/x3d.py",
line 10239, in __init__
     self.ProtoBody = ProtoBody
   File
"/home/coderextreme/X3DJSONLD/src/main/python/net/x3djsonld/data/x3d.py",
line 10282, in ProtoBody
     if not ProtoBody is None and not
isinstance(ProtoBody,(ProtoBody,ProtoInstance)):
TypeError: isinstance() arg 2 must be a type or tuple of types

=================================

Perhaps this would be a better pattern?  Please look over this
carefully! (the two str() functions are different).

     def ProtoBody(self, xxProtoBody):
         if  xxProtoBody is None:
             xxProtoBody = None # default
         assertValidSFNode(xxProtoBody)
         if not xxProtoBody is None and not
isinstance(xxProtoBody,(ProtoBody,ProtoInstance)):
             # print(flush=True)
             raise X3DTypeError(str(xxProtoBody) + ' does not match
required node type (ProtoBody,ProtoInstance) and is invalid')
         self.__ProtoBody = xxProtoBody

also:

     @ProtoInterface.setter
     def ProtoInterface(self, xxProtoInterface):
         if  xxProtoInterface is None:
             xxProtoInterface = None # default
         assertValidSFNode(xxProtoInterface)
         if not xxProtoInterface is None and not
isinstance(xxProtoInterface,(ProtoInterface,ProtoInstance)):
             # print(flush=True)
             raise X3DTypeError(str(ProtoInterface) + ' does not match
required node type (ProtoInterface,ProtoInstance) and is invalid')
         self.__ProtoInterface = xxProtoInterface


========================================================

Possible patch like above, but there's errors in ```ant examples``` and
```ant examples.SmokeTests```, so please look over this carefully, or
provide your own implementation of setters. This just got past the two
"problems" above. There's more to do here.


$ svn diff X3duomToX3dPythonPackage.xslt
Index: X3duomToX3dPythonPackage.xslt
===================================================================
--- X3duomToX3dPythonPackage.xslt       (revision 32361)
+++ X3duomToX3dPythonPackage.xslt       (working copy)
@@ -2727,17 +2727,9 @@
                  <xsl:text>
      def </xsl:text><!-- setter -->
                  <xsl:value-of select="$fieldName"/>
-                <xsl:text>(self, </xsl:text>
-                <xsl:value-of select="$fieldName"/>
-                <!-- =None is omitted; note that setter NEVER needs a
default argument, it is only EVER called if attribute is being assigned
with RHS passed as single argument -->
-                <xsl:text>):
-        if  </xsl:text>
-                <xsl:value-of select="$fieldName"/>
-                <xsl:text> is None:
-            </xsl:text>
-                <xsl:value-of select="$fieldName"/>
-                <xsl:text> = </xsl:text>
-                <xsl:choose>
+                <xsl:text>(self, xx</xsl:text><xsl:value-of
select="$fieldName"/><!-- =None is omitted; note that setter NEVER needs
a default argument, it is only EVER called if attribute is being
assigned with RHS passed as single argument --><xsl:text>):
+        if  </xsl:text>xx<xsl:value-of select="$fieldName"/><xsl:text>
is None:</xsl:text>
+                xx<xsl:value-of select="$fieldName"/><xsl:text> =
</xsl:text><xsl:choose>
                      <xsl:when test="(string-length(@default) > 0)">
                          <xsl:value-of select="$defaultValue"/>
                          <xsl:text> # default</xsl:text>
@@ -2798,9 +2790,7 @@
                  <xsl:text>
          assertValid</xsl:text>
                  <xsl:value-of select="@type"/>
-                <xsl:text>(</xsl:text>
-                <xsl:value-of select="$fieldName"/>
-                <xsl:text>)</xsl:text>
+ <xsl:text>(</xsl:text>xx<xsl:value-of
select="$fieldName"/><xsl:text>)</xsl:text>
                  <xsl:call-template name="valueRestrictionCheck">
                      <xsl:with-param name="fieldName" select="$fieldName"/>
                      <xsl:with-param name="indent"><xsl:text>
</xsl:text></xsl:with-param>
@@ -2814,13 +2804,7 @@
                  <xsl:choose>
                      <xsl:when test="(@type = 'SFNode') and
(string-length($acceptableNodeTypes) > 0)">
                          <xsl:text>
-        if not </xsl:text>
-                        <xsl:value-of select="$fieldName"/>
-                        <xsl:text> is None and not isinstance(</xsl:text>
-                        <xsl:value-of select="$fieldName"/>
-                        <xsl:text>,</xsl:text>
-                        <xsl:value-of select="$acceptableNodeTypes"/>
-                        <xsl:text>):
+        if not </xsl:text>xx<xsl:value-of
select="$fieldName"/><xsl:text> is None and not
isinstance(</xsl:text>xx<xsl:value-of
select="$fieldName"/><xsl:text>,</xsl:text><xsl:value-of
select="$acceptableNodeTypes"/><xsl:text>):
              # print(flush=True)
              raise X3DTypeError(str(</xsl:text>
                          <xsl:value-of select="$fieldName"/>
@@ -2838,8 +2822,7 @@
                  <xsl:text>
          self.__</xsl:text>
                  <xsl:value-of select="$fieldName"/>
-                <xsl:text> = </xsl:text>
-                <xsl:value-of select="$fieldName"/>
+                <xsl:text> = </xsl:text>xx<xsl:value-of
select="$fieldName"/>
              </xsl:if>

          </xsl:for-each>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20210822/c2daa768/attachment-0001.html>
-------------- next part --------------
###############################################
#
# Now available: developmental python x3d.py package on PyPi for import.
#   This approach greatly simplifies Python X3D deployment and use.
#   https://pypi.org/project/x3d
#
# Installation:
#       pip install x3d
# or
#       python -m pip install x3d
#
# Developer options for loading x3d package:
#
#    from x3d import *  # preferred approach, terser source that avoids x3d.* class prefixes
#
# or
#    import x3d         # traditional way to subclass x3d package, all classes require x3d.* prefix
#                       # but python source is very verbose, for example x3d.Material x3d.Shape etc.
#                       # X3dToPython.xslt stylesheet insertPackagePrefix=true supports this option.

from x3d import *

###############################################

newModel=X3D(profile='Immersive',version='3.3',
  head=head(
    children=[
    meta(name='title',content='rubik.x3d'),
    meta(name='creator',content='John Carlson'),
    meta(name='generator',content='manual'),
    meta(name='identifier',content='https://coderextreme.net/X3DJSONLD/rubik.x3d'),
    meta(name='description',content='a kind of rubik cube with spheres')]),
  Scene=Scene(
    children=[
    NavigationInfo(type=["EXAMINE"]),
    Viewpoint(description='Rubiks Cube',position=(0,0,12)),
    ProtoDeclare(name='sphereproto',
      ProtoInterface=ProtoInterface(
        field=[
        field(name='xtranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
      ProtoBody=ProtoBody(
        children=[
        Transform(
          IS=IS(
            connect=[
            connect(nodeField='translation',protoField='xtranslation')]),
          children=[
          Shape(
            geometry=Sphere(),
            appearance=Appearance(
              material=Material(diffuseColor=(1,1,1))))])])),
    ProtoDeclare(name='three',
      ProtoInterface=ProtoInterface(
        field=[
        field(name='ytranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
      ProtoBody=ProtoBody(
        children=[
        Transform(
          IS=IS(
            connect=[
            connect(nodeField='translation',protoField='ytranslation')]),
          children=[
          ProtoInstance(name='sphereproto',
            fieldValue=[
            fieldValue(name='xtranslation',value=(0,0,0))]),
          ProtoInstance(name='sphereproto',
            fieldValue=[
            fieldValue(name='xtranslation',value=(2,0,0))]),
          ProtoInstance(name='sphereproto',
            fieldValue=[
            fieldValue(name='xtranslation',value=(-2,0,0))])])])),
    ProtoDeclare(name='nine',
      ProtoInterface=ProtoInterface(
        field=[
        field(name='ztranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
      ProtoBody=ProtoBody(
        children=[
        Transform(
          IS=IS(
            connect=[
            connect(nodeField='translation',protoField='ztranslation')]),
          children=[
          ProtoInstance(name='three',
            fieldValue=[
            fieldValue(name='ytranslation',value=(0,0,0))]),
          ProtoInstance(name='three',
            fieldValue=[
            fieldValue(name='ytranslation',value=(0,2,0))]),
          ProtoInstance(name='three',
            fieldValue=[
            fieldValue(name='ytranslation',value=(0,-2,0))])])])),
    ProtoDeclare(name='twentyseven',
      ProtoInterface=ProtoInterface(
        field=[
        field(name='ttranslation',accessType='inputOutput',type='SFVec3f',value=(0.0,0.0,0.0))]),
      ProtoBody=ProtoBody(
        children=[
        Transform(
          IS=IS(
            connect=[
            connect(nodeField='translation',protoField='ttranslation')]),
          children=[
          ProtoInstance(name='nine',
            fieldValue=[
            fieldValue(name='ztranslation',value=(0,0,0))]),
          ProtoInstance(name='nine',
            fieldValue=[
            fieldValue(name='ztranslation',value=(0,0,2))]),
          ProtoInstance(name='nine',
            fieldValue=[
            fieldValue(name='ztranslation',value=(0,0,-2))])])])),
    ProtoInstance(name='twentyseven',
      fieldValue=[
      fieldValue(name='ttranslation',value=(0,0,0))])])
) # X3D model complete

###############################################
# Self-test diagnostics
###############################################

if        metaDiagnostics(newModel): # built-in utility method in X3D class
    print(metaDiagnostics(newModel))
print('check  newModel.XML() serialization...')
newModelXML = newModel.XML() # test export method XML() for exceptions
# print(newModelXML) # debug

print ("python x3d.py load successful for rubik.py")


More information about the x3d-public mailing list