[x3d-public] questions on X3DJSAIL usage.
John Carlson
yottzumm at gmail.com
Wed May 8 15:51:48 PDT 2019
Leonard, can you repost the link to the standard where it talks about the
multiparent (not parent reference) situation when setting the USE field.
I do feel we can serialize a multiparent tree using a symbol table
https://en.m.wikipedia.org/wiki/Symbol_table
. I have been discussing potential solutions in my emails, as has
Leonard. We have 3-4 solutions, where a symbol table is preferred for
JavaScript translator programs. I am not sure about import/export and
stylesheets as I have not looked into those. Leonard suggested 1) a deep
copy and 2) subclassing the USE node from the DEF node.
According to your SAI code, setUSE can only take a string, not a node,
hence my suggestion to (nearly) obliviate setUSE, if indeed we support
multiparent.
Another option is to set a flag somewhere when you write out a DEF, so the
next time you reach the DEF node, you will print out a USE. Again, I am
not sure if stylesheets handle these.
On Wed, May 8, 2019 at 5:16 PM John Carlson <yottzumm at gmail.com> wrote:
> Leonard pointed out that setting USE according to the standard created a
> multiparent situation. I was merely trying to respond to that. Perhaps
> the standard needs changing?
>
> On Wed, May 8, 2019 at 11:25 AM Brutzman, Donald (Don) (CIV) <
> brutzman at nps.edu> wrote:
>
>> OK thanks John, I now see where you are going on this.
>>
>> The existing .setUse(someDefString) method simply applies a string to the
>> scene graph.
>>
>> Next: I am renaming your DEF label to avoid ambiguity. For your
>> constructs
>>
>> MaterialLightBlue = None;
>> ...
>> .setMaterial(MaterialLightBlue =
>> Material().setDEF("MaterialLightBlueLabel").setDiffuseColor([0.1,0.5,1])
>> ...
>> .setAppearance(Appearance().setMaterial(MaterialLightBlue)
>> ...
>>
>> the third line could be rewritten today as
>>
>>
>> .setAppearance(Appearance().setMaterial(Material().setUSE(MaterialLightBlue.getDEF())
>>
>> Programming hint: the key to thinking about any scene graph you construct
>> programmatically is to consider how it will serialize out to the .x3d or
>> .x3dv file encoding. That is how I disambiguate mysterious cases.
>>
>> Looking forward: the approach you describe is pretty interesting. I
>> think the way you have written it, each occurrence of MaterialLightBlue
>> would be written out explicitly and the results would have the DEF value of
>> MaterialLightBlueLabel recurring multiple times (thus causing a duplicate
>> DEF error in the .x3d file). Might other utility methods be possible? Not
>> yet clear... So it is not clear that a further approach is yet achievable
>> but certainly worth thinking about. Thanks.
>>
>>
>> On 5/6/2019 3:23 PM, John Carlson wrote:
>> > Here’s a an example removing setUSE(). See uses of MaterialLightBlue.
>> >
>> > import classpath
>> >
>> > from org.web3d.x3d.jsail.Core.X3DObject import X3DObject as X3D
>> >
>> > from org.web3d.x3d.jsail.fields.SFStringObject import SFStringObject as
>> SFString
>> >
>> > from org.web3d.x3d.jsail.Core.headObject import headObject as head
>> >
>> > from org.web3d.x3d.jsail.Core.metaObject import metaObject as meta
>> >
>> > from org.web3d.x3d.jsail.Core.SceneObject import SceneObject as Scene
>> >
>> > from org.web3d.x3d.jsail.Grouping.GroupObject import GroupObject as
>> Group
>> >
>> > from org.web3d.x3d.jsail.Navigation.ViewpointObject import
>> ViewpointObject as Viewpoint
>> >
>> > from org.web3d.x3d.jsail.fields.SFVec3fObject import SFVec3fObject as
>> SFVec3f
>> >
>> > from org.web3d.x3d.jsail.Grouping.TransformObject import
>> TransformObject as Transform
>> >
>> > from org.web3d.x3d.jsail.fields.SFRotationObject import
>> SFRotationObject as SFRotation
>> >
>> > from org.web3d.x3d.jsail.Shape.ShapeObject import ShapeObject as Shape
>> >
>> > from org.web3d.x3d.jsail.Geometry3D.SphereObject import SphereObject as
>> Sphere
>> >
>> > from org.web3d.x3d.jsail.Shape.AppearanceObject import AppearanceObject
>> as Appearance
>> >
>> > from org.web3d.x3d.jsail.Shape.MaterialObject import MaterialObject as
>> Material
>> >
>> > from org.web3d.x3d.jsail.fields.SFColorObject import SFColorObject as
>> SFColor
>> >
>> > from org.web3d.x3d.jsail.Texturing.ImageTextureObject import
>> ImageTextureObject as ImageTexture
>> >
>> > from org.web3d.x3d.jsail.fields.MFStringObject import MFStringObject as
>> MFString
>> >
>> > from org.web3d.x3d.jsail.Text.TextObject import TextObject as Text
>> >
>> > from org.web3d.x3d.jsail.Text.FontStyleObject import FontStyleObject as
>> FontStyle
>> >
>> > MaterialLightBlue = None;
>> >
>> > X3D0 = X3D() \
>> >
>> > .setProfile("Immersive") \
>> >
>> > .setVersion("3.3") \
>> >
>> > .setHead(head() \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("HelloWorld.x3d") \
>> >
>> > .setName("title") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("Simple X3D scene example: Hello World!") \
>> >
>> > .setName("description") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("30 October 2000") \
>> >
>> > .setName("created") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("28 July 2015") \
>> >
>> > .setName("modified") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("Don Brutzman") \
>> >
>> > .setName("creator") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("HelloWorld.tall.png") \
>> >
>> > .setName("Image") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("http://en.wikipedia.org/wiki/Hello_world") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("
>> https://en.wikipedia.org/wiki/Hello#.22Hello.2C_World.22_computer_program")
>> \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("https://en.wikipedia.org/wiki/\"Hello,_World!\"_program")
>> \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("
>> http://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world")
>> \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("http://www.HelloWorldExample.net") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("http://www.web3D.org") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("
>> http://www.web3d.org/realtime-3d/news/internationalization-x3d") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("
>> http://www.web3d.org/x3d/content/examples/HelloWorld.x3d") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("
>> http://X3dGraphics.com/examples/X3dForAdvancedModeling/HelloWorldScenes")
>> \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("
>> http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d")
>> \
>> >
>> > .setName("identifier") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("
>> http://www.web3d.org/x3d/content/examples/license.html") \
>> >
>> > .setName("license") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit") \
>> >
>> > .setName("generator") \
>> >
>> > ) \
>> >
>> > # Alternate encodings: VRML97, X3D ClassicVRML Encoding, X3D Compressed
>> Binary Encoding (CBE), X3DOM, JSON
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("HelloWorld.wrl") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("HelloWorld.x3dv") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("HelloWorld.x3db") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("HelloWorld.xhtml") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > .addMeta(meta() \
>> >
>> > .setContent("HelloWorld.json") \
>> >
>> > .setName("reference") \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > .setScene(Scene() \
>> >
>> > # Example scene to illustrate X3D nodes and fields (XML elements and
>> attributes)
>> >
>> > .addChild(Group() \
>> >
>> > .addChild(Viewpoint() \
>> >
>> > .setDEF("ViewUpClose") \
>> >
>> > .setCenterOfRotation([0,-1,0]) \
>> >
>> > .setDescription("Hello world!") \
>> >
>> > .setPosition([0,-1,7]) \
>> >
>> > ) \
>> >
>> > .addChild(Transform() \
>> >
>> > .setRotation([0,1,0,3]) \
>> >
>> > .addChild(Shape() \
>> >
>> > .setGeometry(Sphere() \
>> >
>> > ) \
>> >
>> > .setAppearance(Appearance() \
>> >
>> > .setMaterial(MaterialLightBlue = Material() \
>> >
>> > .setDEF("MaterialLightBlue") \
>> >
>> > .setDiffuseColor([0.1,0.5,1]) \
>> >
>> > ) \
>> >
>> > .setTexture(ImageTexture() \
>> >
>> > .setDEF("ImageCloudlessEarth") \
>> >
>> >
>> .setUrl(["earth-topo.png","earth-topo.jpg","earth-topo-small.gif","
>> http://www.web3d.org/x3d/content/examples/Basic/earth-topo.png","
>> http://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg","
>> http://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif"]) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > .addChild(Transform() \
>> >
>> > .setTranslation([0,-2,0]) \
>> >
>> > .addChild(Shape() \
>> >
>> > .setGeometry(Text() \
>> >
>> > .setDEF("TextMessage") \
>> >
>> > .setString(["Hello","world!"]) \
>> >
>> > .setFontStyle(FontStyle() \
>> >
>> > .setJustify(["MIDDLE","MIDDLE"]) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > .setAppearance(Appearance() \
>> >
>> > .setMaterial(MaterialLightBlue)
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > X3D0.toFileX3D("HelloWorld_RoundTrip.x3d")
>> >
>> > Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for
>> Windows 10
>> >
>> > *From: *John Carlson <mailto:yottzumm at gmail.com>
>> > *Sent: *Monday, May 6, 2019 4:52 PM
>> > *To: *Brutzman, Donald (Don) (CIV) <mailto:brutzman at nps.edu>;
>> aono at tut.jp <mailto:aono at tut.jp>; Leonard Daly <mailto:
>> Leonard.Daly at realism.com>
>> > *Cc: *X3D Graphics public mailing list <mailto:x3d-public at web3d.org>
>> > *Subject: *RE: questions on X3DJSAIL usage.
>> >
>> > Leonard, can you explain for us how we can write an SAI program
>> avoiding setUSE()? Apparently, my explanations aren’t getting through.
>> >
>> > John
>> >
>> > Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for
>> Windows 10
>> >
>> > *From: *Brutzman, Donald (Don) (CIV) <mailto:brutzman at nps.edu>
>> > *Sent: *Monday, May 6, 2019 2:18 AM
>> > *To: *John Carlson <mailto:yottzumm at gmail.com>; aono at tut.jp <mailto:
>> aono at tut.jp>
>> > *Cc: *X3D Graphics public mailing list <mailto:x3d-public at web3d.org>
>> > *Subject: *Re: questions on X3DJSAIL usage.
>> >
>> > On 5/4/2019 4:15 PM, John Carlson wrote:
>> >
>> > > I’m waiting for a response on whether I should stop using setUSE()
>> (except in cases where > 1 fields are used in a node) in programs using
>> X3DJSAIL.
>> >
>> > >
>> >
>> > > Thanks!
>> >
>> > >
>> >
>> > > John
>> >
>> > Hmmm, perhaps I'm not understanding your question... but here is an
>> attempt at a simple answer. Plus some additional syntactic sugar.
>> >
>> > 1. I think a programmer utilizes setUSE() whenever you need to set a
>> USE value on a node.
>> >
>> > Example excerpts:
>> >
>> >
>> http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter01TechnicalOverview
>> >
>> > HelloWorld.x3d
>> >
>> > <Transform translation='0 -2 0'>
>> >
>> > <Shape>
>> >
>> > <Text DEF='TextMessage' string='"Hello" "world!"'>
>> >
>> > <FontStyle justify='"MIDDLE" "MIDDLE"'/>
>> >
>> > </Text>
>> >
>> > <Appearance>
>> >
>> > <Material USE='MaterialLightBlue'/>
>> >
>> > </Appearance>
>> >
>> > </Shape>
>> >
>> > </Transform>
>> >
>> > HelloWorld.java
>> >
>> > .addChild(new TransformObject().setTranslation(0.0f,-2.0f,0.0f)
>> >
>> > .addChild(new ShapeObject()
>> >
>> > .setGeometry(new TextObject("TextMessage").setString(new
>> MFStringObject("\"Hello\" \"world!\""))
>> >
>> > .setFontStyle(new
>> FontStyleObject().setJustify(FontStyleObject.JUSTIFY_MIDDLE_MIDDLE)))
>> >
>> > .setAppearance(new AppearanceObject()
>> >
>> > .setMaterial(new
>> MaterialObject().setUSE("MaterialLightBlue")))))));
>> >
>> > HelloWorld.py
>> >
>> > .addChild(Transform() \
>> >
>> > .setTranslation(SFVec3f([0,-2,0])) \
>> >
>> > .addChild(Shape() \
>> >
>> > .setGeometry(Text() \
>> >
>> > .setDEF(SFString("TextMessage")) \
>> >
>> > .setString(MFString(["Hello","world!"])) \
>> >
>> > .setFontStyle(FontStyle() \
>> >
>> > .setJustify(MFString(["MIDDLE","MIDDLE"])) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > .setAppearance(Appearance() \
>> >
>> > .setMaterial(Material() \
>> >
>> > .setUSE(SFString("MaterialLightBlue")) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > ) \
>> >
>> > )
>> >
>> > 2. Note that if we start putting field adjustments on the same line,
>> the structure for .java and .py are nearly identical.
>> >
>> > Other syntax tightening is further possible in .py version:
>> >
>> > - no apparent need to wrap SFString() in python syntax
>> >
>> > - I suspect that MFString() wrapping is also superfluous, hopefully we
>> can just use ["Hello","world!"]
>> >
>> > - Similarly might try replacing SFVec3f([0,-2,0]) with [0,-2,0] - we're
>> getting more Pythonic now!
>> >
>> > - indenting with two space characters makes scene-graph structure more
>> evident.
>> >
>> > 3. Spent the day refactoring the X3D Examples Archive projects from
>> Netbeans plain-old freeform projects to Netbeans Java freeform projects.
>> This doesn't limit any functionality but it does make Java experimentation
>> much simpler... menu items now include Compile/Run/Debug options.
>> >
>> > 4. Am further noticing from above that the following single-string
>> .java construct
>> >
>> > .setString(new MFStringObject("\"Hello\" \"world!\""))
>> >
>> > is more readable as a String array instead:
>> >
>> > .setString(new MFStringObject(new String[]
>> {"Hello","world!"}))
>> >
>> > or even more simply as:
>> >
>> > .setString(new String[] {"Hello","world!"})
>> >
>> > Have improved X3dToJava.xslt conversions to simplify accordingly. Will
>> rerun all java conversions tonight and hopefully redeploy Web3D example
>> archives tomorrow. Then retest python build tomorrow night.
>> >
>> > Also will redeploy X3DJSAIL with this improvement tonight. Have also
>> added initial PointProperties validation for X3Dv4, included source in
>> full.jar for IDE javadoc/debugging, and fixed a number of X3DLoaderDOM
>> geospatial errors.
>> >
>> > 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
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20190508/f93f3d97/attachment-0001.html>
More information about the x3d-public
mailing list