<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-ligatures:standardcontextual;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-ligatures:standardcontextual;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-ligatures:standardcontextual;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:110169208;
        mso-list-template-ids:672700078;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:"Courier New";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l1
        {mso-list-id:165707747;
        mso-list-type:hybrid;
        mso-list-template-ids:290255526 2066774680 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l1:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:.75in;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman";}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:1.25in;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:1.75in;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:2.25in;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:2.75in;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:3.25in;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:3.75in;
        text-indent:-.25in;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:4.25in;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:4.75in;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l2
        {mso-list-id:1210216877;
        mso-list-type:hybrid;
        mso-list-template-ids:-950136832 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l2:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:.25in;
        text-indent:-.25in;}
@list l2:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:.75in;
        text-indent:-.25in;}
@list l2:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:1.25in;
        text-indent:-9.0pt;}
@list l2:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:1.75in;
        text-indent:-.25in;}
@list l2:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:2.25in;
        text-indent:-.25in;}
@list l2:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:2.75in;
        text-indent:-9.0pt;}
@list l2:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:3.25in;
        text-indent:-.25in;}
@list l2:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:3.75in;
        text-indent:-.25in;}
@list l2:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:4.25in;
        text-indent:-9.0pt;}
@list l3
        {mso-list-id:1607809126;
        mso-list-type:hybrid;
        mso-list-template-ids:-2071554174 2066774680 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l3:level1
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman";}
@list l3:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l3:level3
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l3:level4
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l3:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l3:level6
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l3:level7
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l3:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l3:level9
        {mso-level-number-format:bullet;
        mso-level-text:;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72" style='word-wrap:break-word'><div class=WordSection1><p class=MsoPlainText>All useful thoughts, thanks Andreas and Doug.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>I have been down this design path too.  Thanks to several years of X3D Working Group development and discussion on this x3d-public list, here is where we have currently landed.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=1 type=1><li class=MsoPlainText style='margin-left:-.25in;mso-list:l2 level1 lfo1'><b>X3D Statements</b> are defined by the X3D Architecture specification.  We use that, and of course will not be changing that in the foreseeable future.  The spec sayeth:<o:p></o:p></li></ol><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='mso-list:l3 level1 lfo2'>X3D 4.0 Architecture, clause 7 Core component, 7.2.5 Abstract X3D structure, 7.2.5.1 Organization<o:p></o:p></li><li class=MsoPlainText style='mso-list:l3 level1 lfo2'>https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/components/core.html#AbstractX3DStructure<o:p></o:p></li></ul><div style='mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=MsoPlainText style='border:none;padding:0in'><o:p> </o:p></p></div><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText style='margin-left:.25in'>An X3D world is conceptually defined as a sequence of nodes and statements organized as a file. The first item in the file is the Header statement. The second item in the file is the PROFILE statement. The PROFILE statement may be optionally followed by one or more COMPONENT, UNIT and/or META statements in that order. There may be multiple of each of the COMPONENT, UNIT, and/or META statements. The remainder of the file consists of the other elements (nodes and statements) defined in this document .<o:p></o:p></p><p class=MsoPlainText style='margin-left:.25in'><o:p> </o:p></p><p class=MsoPlainText style='margin-left:.25in'>X3D statements include the following:<o:p></o:p></p><p class=MsoPlainText style='margin-left:.25in'><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>Header,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>PROFILE,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>COMPONENT,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>META,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>UNIT,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>ROUTE,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>PROTO declare,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>EXTERNPROTO declare,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>PROTO interface,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>PROTO body,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>IS,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>connect,<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>IMPORT, and<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>EXPORT<o:p></o:p></li></ul><div style='mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=MsoPlainText style='border:none;padding:0in'><o:p> </o:p></p></div><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>As one explores the specification, it is pretty clear that each of these statements is handled differently.  There are no “abstract types for statements” provided in the specification.  Also please note that none of the statements can be a root node, since statements are not nodes, but several of the statements are allowed to appear next to root nodes.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=2 type=1><li class=MsoPlainText style='margin-left:-.25in;mso-list:l2 level1 lfo1'><b>Next</b>.  One can find all of the X3D statements defined in X3D XML Schema (for scene validation).  For example,<o:p></o:p></li></ol><p class=MsoPlainText style='margin-left:.25in'><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>X3D Specifications: Schema and DOCTYPE Validation<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/<o:p></o:p></li><li class=MsoNormal style='color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:.25in;mso-list:l1 level1 lfo3;background:#CCFFFF'><span style='font-size:13.5pt;font-family:"Times New Roman",serif'>X3D XML Schema x3d-4.0.xsd and documentation (latest)<o:p></o:p></span></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_X3D.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_component.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_unit.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_meta.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_ROUTE.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>etc.<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Because statements vary widely in where they can appear, the parent-child relationships (aka content model) also varies widely.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Due to XML Schema expressiveness sometimes resulting in combinatoric explosion, it was only generally only practical/possible to allow ROUTE to appear either at the top of a Scene or within an X3DGroupingNode.  So, for example, let’s check those closely.  Please look at those parent-child relationship diagrams that include ROUTE:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_Scene.html (wow, a lot of possibilities)<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>down towards bottom:  ChildContentModelSceneGraphStructure<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><img width=430 height=167 style='width:4.4791in;height:1.7416in' id="Picture_x0020_2" src="cid:image001.png@01DA0F4A.04E87270"><o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>and<o:p></o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_X3DGroupingNode.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>again towards bottom, can find ChildContentModelSceneGraphStructure<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_ChildContentModelSceneGraphStructure.html<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>You can also ponder the X3D XML Schema source directly if you prefer.  The documentation is generated from that, so we have good confidence that it all works.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=3 type=1><li class=MsoPlainText style='margin-left:-.25in;mso-list:l2 level1 lfo1'><b>So far so good…</b>  Next, these hierarchical object-oriented XML Schema definitions are then transformed and applied to create flatter, more readable X3DUOM.<o:p></o:p></li></ol><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Let’s look in detail at how the statements got collected in X3DUOM.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>X3D Unified Object Model (X3DUOM)<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3DUOM.html<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3dUnifiedObjectModel-4.0.xml<o:p></o:p></li></ul><div style='mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=MsoPlainText style='border:none;padding:0in'><o:p> </o:p></p></div><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>Overall structure (screen snippet using Chrome)<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><img width=906 height=270 style='width:9.4375in;height:2.8125in' id="Picture_x0020_1" src="cid:image002.png@01DA0F4A.04E87270"><o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>Under <span style='font-size:9.0pt;font-family:"Courier New"'><Statements></span> have excerpted the X3DUOM definition for the ROUTE statement on line 42832 (currently).  (The appinfo documentation originates from the X3D Tooltips.)<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><Statement name="ROUTE"><o:p></o:p></p><p class=MsoPlainText>   <InterfaceDefinition specificationUrl=https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/concepts.html#ModifyingObjectsRoutes<o:p></o:p></p><p class=MsoPlainText>                         appinfo="ROUTE connects output fields of event-producing nodes to input fields of event-consuming nodes."><o:p></o:p></p><p class=MsoPlainText>      <componentInfo name="Core" level="1"/><o:p></o:p></p><p class=MsoPlainText>      <field name="class"<o:p></o:p></p><p class=MsoPlainText>              type="SFString"<o:p></o:p></p><p class=MsoPlainText>              accessType="inputOutput"<o:p></o:p></p><p class=MsoPlainText>              inheritedFrom="X3DStatement"<o:p></o:p></p><p class=MsoPlainText>              baseType="xs:NMTOKENS"<o:p></o:p></p><p class=MsoPlainText>              description="The class attribute on each X3D node and statement is a space-separated list of classes, reserved for use by Cascading Style Sheets (CSS) and XML stylesheets."/><o:p></o:p></p><p class=MsoPlainText>      <field name="fromField"<o:p></o:p></p><p class=MsoPlainText>              type="SFString"<o:p></o:p></p><p class=MsoPlainText>              accessType="inputOutput"<o:p></o:p></p><p class=MsoPlainText>              use="required"<o:p></o:p></p><p class=MsoPlainText>              baseType="xs:NMTOKEN"<o:p></o:p></p><p class=MsoPlainText>              description="fromField is the field name in the source node which is originating an event."/><o:p></o:p></p><p class=MsoPlainText>      <field name="fromNode"<o:p></o:p></p><p class=MsoPlainText>              type="SFString"<o:p></o:p></p><p class=MsoPlainText>              accessType="inputOutput"<o:p></o:p></p><p class=MsoPlainText>              use="required"<o:p></o:p></p><p class=MsoPlainText>              baseType="xs:IDREF"<o:p></o:p></p><p class=MsoPlainText>              description="fromNode is the DEF name of the node originating an event."/><o:p></o:p></p><p class=MsoPlainText>      <field name="id"<o:p></o:p></p><p class=MsoPlainText>              type="SFString"<o:p></o:p></p><p class=MsoPlainText>              accessType="inputOutput"<o:p></o:p></p><p class=MsoPlainText>              inheritedFrom="X3DStatement"<o:p></o:p></p><p class=MsoPlainText>              baseType="xs:NMTOKEN"<o:p></o:p></p><p class=MsoPlainText>              description="The id attribute on each X3D node and statement is considered a unique identifier when used as part of an encompassing HTML/DOM context."/><o:p></o:p></p><p class=MsoPlainText>      <field name="style"<o:p></o:p></p><p class=MsoPlainText>              type="SFString"<o:p></o:p></p><p class=MsoPlainText>              accessType="inputOutput"<o:p></o:p></p><p class=MsoPlainText>              inheritedFrom="X3DStatement"<o:p></o:p></p><p class=MsoPlainText>              description="The style attribute on each X3D node and statement provides an inline block of CSS source for element styling, reserved for use by Cascading Style Sheets (CSS) and XML stylesheets."/><o:p></o:p></p><p class=MsoPlainText>      <field name="toField"<o:p></o:p></p><p class=MsoPlainText>              type="SFString"<o:p></o:p></p><p class=MsoPlainText>              accessType="inputOutput"<o:p></o:p></p><p class=MsoPlainText>              use="required"<o:p></o:p></p><p class=MsoPlainText>              baseType="xs:NMTOKEN"<o:p></o:p></p><p class=MsoPlainText>              description="toField is the field name in the destination node which is receiving an event."/><o:p></o:p></p><p class=MsoPlainText>      <field name="toNode"<o:p></o:p></p><p class=MsoPlainText>              type="SFString"<o:p></o:p></p><p class=MsoPlainText>              accessType="inputOutput"<o:p></o:p></p><p class=MsoPlainText>              use="required"<o:p></o:p></p><p class=MsoPlainText>              baseType="xs:IDREF"<o:p></o:p></p><p class=MsoPlainText>              description="toNode is the DEF name of the destination node receiving an event."/><o:p></o:p></p><p class=MsoPlainText>   </InterfaceDefinition><o:p></o:p></p><p class=MsoPlainText></Statement><o:p></o:p></p><div style='mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=MsoPlainText style='border:none;padding:0in'><o:p> </o:p></p></div><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Continued exploration shows consistent structures throughout X3DUOM.  Autogeneration is challenging but powerful!<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Every single one of these X3D data products listed in this message is open source, published freely, and maintained up to date in one of our Web3D Consortium version-control archives.  Nerdy perhaps but cool, definitely!<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=4 type=1><li class=MsoPlainText style='margin-left:-.25in;mso-list:l2 level1 lfo1'><b>XML Schema validation of thousands of models in the X3D Example Archives has really shaken out a lot of problems and edge cases</b>.<o:p></o:p></li></ol><p class=MsoPlainText><br>Validation testing of ClassicVRML versions using view3dscene tovrmlx3d.exe from Castle Game Engine is finding further X3D 4.0 model issues and fixes, collaboration work with Michalis is still in progress on that.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Autogenerating Java, Python and Turtle from X3DUOM has given us further validation testing.  Periodic revisions and releases follow meaningful improvements.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Am keen to get going on investigating Holger’s identification of X3DUOM mismatches with his code and presumably the authoritative reference, X3D Architecture.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><ol style='margin-top:0in' start=5 type=1><li class=MsoPlainText style='margin-left:-.25in;mso-list:l2 level1 lfo1'><b>OK OK already.  Where can you put a ROUTE?<o:p></o:p></b></li></ol><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>One might well think “well let’s put a ROUTE inside of any other parent node.”  In theory, maybe.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>In practice, not usually.  When modeling the actual X3D scene, sticking a ROUTE somewhere within a Shape node didn’t seem to help an author at all, since none of the other nodes within Shape actually generate events.  Much better to put the ROUTE after the DEF’ed interpolator/sensor/script node, since all DEF’s must be defined first.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>So trying to sprinkle ROUTE statements with reckless abandon anywhere in an X3D model seems like an impractical goal, maybe a case of<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>Patient:  “Doctor Doctor, my arm hurts when I lift it far behind my back like this….  over here…  Ouch!”<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>Doctor:  “Don’t do that.”<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>In NYC:  “That will be a thousand dollars, please!”   (more pain follows…)<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>And so, how does that pain-filled joke relate?  Well, making our XML/ClassicVRML/Java/Python/Turtle and JSON/ECMAScript/C/C/C++ SAI interfaces and (where possible) VRML97 models all consistent, compatible and round-trippable seems still like a very worthy, most-excellent, achievable implementation goal for X3D 4.0.  No really.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The journey continues.  I think we will have a very productive 2024 together aligning all of these X3D 4.0 variations to a consistent theme, updating each of our many specifications and implementations to match the finalized reference (cue trumpets please):<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><ul style='margin-top:0in' type=disc><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>Extensible 3D (X3D) 4.0, Part 1: Architecture and base components<o:p></o:p></li><li class=MsoPlainText style='margin-left:.25in;mso-list:l1 level1 lfo3'>https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/Architecture.html<o:p></o:p></li></ul><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Any way you like it, hopefully, if we remain careful.  Repeatable improvements are always welcome.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Have fun with X3D 4.0!   8)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>all the best, Don<o:p></o:p></p><p class=MsoPlainText>-- <o:p></o:p></p><p class=MsoPlainText><span style='font-size:9.0pt;font-family:"Courier New"'>Don Brutzman  Naval Postgraduate School, Code USW/Br        brutzman@nps.edu<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:9.0pt;font-family:"Courier New"'>Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:9.0pt;font-family:"Courier New"'>X3D graphics, virtual worlds, navy robotics https://faculty.nps.edu/brutzman<o:p></o:p></span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>-----Original Message-----<br>From: Andreas Plesch <andreasplesch@gmail.com> <br>Sent: Friday, November 3, 2023 7:44 PM<br>To: GPU Group <gpugroup@gmail.com><br>Cc: Brutzman, Donald (Don) (CIV) <brutzman@nps.edu>; X3D Graphics public mailing list <x3d-public@web3d.org><br>Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes in v.3.3 and v.4.0</p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>On Thu, Nov 2, 2023 at 7:48 PM GPU Group <<a href="mailto:gpugroup@gmail.com"><span style='color:windowtext;text-decoration:none'>gpugroup@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> Proposed solution: MFStatement field type in x3d.py<o:p></o:p></p><p class=MsoPlainText>> - each executionContext type ProtoDeclare, Inline, Scene would have 2 <o:p></o:p></p><p class=MsoPlainText>> new fields MFStatement ProtoDeclares MFStatement Routes<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Although at first it seems incongruent to have fields with statement type values, it is not really different from say a color type. So I think that makes sense.<o:p></o:p></p><p class=MsoPlainText>Should then Shape also have an MFStatement Routes field ? In fact, since Routes can occur wherever fields occur, all nodes would need such a field, since all nodes have fields.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>> - then when exporting a scene via x3d.py, protodeclares and routes <o:p></o:p></p><p class=MsoPlainText>> would be put in those fields<o:p></o:p></p><p class=MsoPlainText>> - x3d.py when writing an execution context to a file would put protodeclares at the top and routes at the bottom.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>I also seem to remember that Don had discussed putting Routes in the children parameter for x3d.py earlier, as something which is mostly sufficient. The generated XML/VRML is still valid, there is only an issue if there is an appetite for complete equivalence between all encodings, eg. complete roundtrips xml - python - xml.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>containerField support in x3d.py is really unrelated and can be accomplished in any case.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>-Andreas<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>><o:p> </o:p></p><p class=MsoPlainText>> On Thu, Nov 2, 2023 at 7:42 AM GPU Group <<a href="mailto:gpugroup@gmail.com"><span style='color:windowtext;text-decoration:none'>gpugroup@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>>><o:p> </o:p></p><p class=MsoPlainText>>> What about on Scene/Proto/Inline executionContext - is there an array holder / property / sub-element for ProtoDeclares and one for Routes in those x3d.py elements? If so, then they (ProtoDeclares, Routes) could go there.<o:p></o:p></p><p class=MsoPlainText>>> -Doug<o:p></o:p></p><p class=MsoPlainText>>><o:p> </o:p></p><p class=MsoPlainText>>><o:p> </o:p></p><p class=MsoPlainText>>> On Wed, Nov 1, 2023 at 8:54 PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> Hi Don,<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> All true and relevant, of course. I think the important phrase is <o:p></o:p></p><p class=MsoPlainText>>>> "inside a node wherever fields may appear". The question becomes <o:p></o:p></p><p class=MsoPlainText>>>> what does that phrase mean for the python encoding ? It is unclear <o:p></o:p></p><p class=MsoPlainText>>>> that it means ROUTE statements should appear as members of the array <o:p></o:p></p><p class=MsoPlainText>>>> which is assigned to the children field of a node, or any other <o:p></o:p></p><p class=MsoPlainText>>>> MFNode field of a node. The python encoding does not currently allow <o:p></o:p></p><p class=MsoPlainText>>>> for non-field parameters to appear inside a X3D node, eg. inside the <o:p></o:p></p><p class=MsoPlainText>>>> parameters given to the node returning function call. So, as a <o:p></o:p></p><p class=MsoPlainText>>>> consequence, the only option currently is to add ROUTE statements to <o:p></o:p></p><p class=MsoPlainText>>>> MFNode field values in the python encoding which to me seems more like a band aid.<o:p></o:p></p><p class=MsoPlainText>>>> For example, it seems to make it impossible to represent a ROUTE <o:p></o:p></p><p class=MsoPlainText>>>> inside a node which only has SFNode fields like:<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> XML:<o:p></o:p></p><p class=MsoPlainText>>>> <Shape><o:p></o:p></p><p class=MsoPlainText>>>>   <Appearance><o:p></o:p></p><p class=MsoPlainText>>>>      <Material DEF='boxColor' diffuseColor='1 0 0' /><o:p></o:p></p><p class=MsoPlainText>>>>   </Appearance><o:p></o:p></p><p class=MsoPlainText>>>>   <ROUTE fromNode='cIntrpltr' fromField='value_changed'<o:p></o:p></p><p class=MsoPlainText>>>> toNode='boxColor' toField='diffuseColor' /><o:p></o:p></p><p class=MsoPlainText>>>>   <Box/><o:p></o:p></p><p class=MsoPlainText>>>> </Shape><o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> Python:<o:p></o:p></p><p class=MsoPlainText>>>> Shape(<o:p></o:p></p><p class=MsoPlainText>>>>   appearance=Appearance(<o:p></o:p></p><p class=MsoPlainText>>>>     material=Material(DEF='boxColor', diffuseColor=SFColor(1,0,0))),<o:p></o:p></p><p class=MsoPlainText>>>>   # How to add a ROUTE here ?<o:p></o:p></p><p class=MsoPlainText>>>>   # children=[ ROUTE(..) ] ?<o:p></o:p></p><p class=MsoPlainText>>>>   geometry=Box()<o:p></o:p></p><p class=MsoPlainText>>>> )<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> Perhaps the children parameter is allowed for any node in the Python encoding ?<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> Would it make sense to add a 'statements' parameter or an 'inside'<o:p></o:p></p><p class=MsoPlainText>>>> parameter to node generating functions in python ? Possibly too late <o:p></o:p></p><p class=MsoPlainText>>>> for that.<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> In any case, for containerField support it is possible to just have<o:p></o:p></p><p class=MsoPlainText>>>> Route.XML() (and Comment.XML()) accept an optional field parameter <o:p></o:p></p><p class=MsoPlainText>>>> which is ignored.<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> -Andreas<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> On Wed, Nov 1, 2023 at 8:03 PM Brutzman, Donald (Don) (CIV) <o:p></o:p></p><p class=MsoPlainText>>>> <<a href="mailto:brutzman@nps.edu"><span style='color:windowtext;text-decoration:none'>brutzman@nps.edu</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Checking details: placement of ROUTE (and several other X3D statements) is allowed as a child of X3DGroupingNode and is permitted by XML validation.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > As noted already, we will be similarly working to make each of the file encodings and programming language bindings as symmetric as possible to maximize X3D 4.0 portability and clarity.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Of course it is a well-known error pattern to have missing or unclear ROUTE definitions.  The ability to keep ROUTEs together with (i.e. promptly following) related nodes is an excellent pattern for author understanding and animation completeness.  There are almost-countless instances of this pattern in the X3D Example Archives.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Finally, this was a deliberately considered topic during working group meetings and X3D 4.0 development.  Note that the following example in X3D 4.0 does not state it must be at root of the scene.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > X3D 4.0 Architecture, clause 4 Concepts, 4.4.2.4.1 Routes <o:p></o:p></p><p class=MsoPlainText>>>> > <a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-I"><span style='color:windowtext;text-decoration:none'>https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-I</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > S.proof/Part01/concepts.html#ModifyingObjectsRoutes<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > EXAMPLE  It is possible to create a scene with run-time behavior using only this event propagation model:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > DEF TS TimeSensor {<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >   loop TRUE<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >   cycleInterval 5<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > }<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > DEF I PositionInterpolator {<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >   key [ 0 0.5 1 ]<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >   keyValue [ 0 -1 0, 0 1 0, 0 -1 0 ]<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > }<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > DEF T Transform {<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >   children [<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >     Shape {<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >       geometry Box { }<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >     }<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> >   ]<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > }<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ROUTE ts.fraction_changed TO I.set_fraction<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ROUTE I.value_changed TO T.set_translation<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Also relevant:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > X3D 4.0 Architecture, clause 4 Concepts, 4.4.8.2 Routes <o:p></o:p></p><p class=MsoPlainText>>>> > <a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-I"><span style='color:windowtext;text-decoration:none'>https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-I</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > S.proof/Part01/concepts.html#Routes<o:p></o:p></p><p class=MsoPlainText>>>> > Excerpt: “ROUTE statements may either appear at the top level of an X3D file or inside a node wherever fields may appear. A ROUTE statement shall only appear after the definition of the source and destination nodes. Placing a ROUTE statement within a node does not associate it with that node in any way.”<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Hope this makes sense.  Thanks everyone for paying close attention… validatable correctness is essential.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Have fun with X3D!  8)<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > all the best, Don<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > --<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Don Brutzman  Naval Postgraduate School, Code USW/Br        <a href="mailto:brutzman@nps.edu"><span style='color:windowtext;text-decoration:none'>brutzman@nps.edu</span></a><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA    +1.831.656.2149<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > X3D graphics, virtual worlds, navy robotics <o:p></o:p></p><p class=MsoPlainText>>>> > <a href="https://faculty.nps.edu/brutzman"><span style='color:windowtext;text-decoration:none'>https://faculty.nps.edu/brutzman</span></a><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > -----Original Message-----<o:p></o:p></p><p class=MsoPlainText>>>> > From: x3d-public <<a href="mailto:x3d-public-bounces@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public-bounces@web3d.org</span></a>> On Behalf Of <o:p></o:p></p><p class=MsoPlainText>>>> > Andreas Plesch<o:p></o:p></p><p class=MsoPlainText>>>> > Sent: Wednesday, November 1, 2023 12:36 PM<o:p></o:p></p><p class=MsoPlainText>>>> > To: John Carlson <<a href="mailto:yottzumm@gmail.com"><span style='color:windowtext;text-decoration:none'>yottzumm@gmail.com</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> > Cc: X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> > Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes in <o:p></o:p></p><p class=MsoPlainText>>>> > v.3.3 and v.4.0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > I think that is because JoeKick.py puts ROUTE in the children field of a Group node which is not quite correct. ROUTEs can be children elements in the XML encoding but are not valid values for the children field. I think in the python encoding ROUTEs can probably exist only at the Scene level to avoid conflating x3d children with xml children.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > x3dcf2.py may work more robustly since the stylesheet does not really distinguish between x3d nodes and x3d statements and it did add the field parameter also to ROUTE.XML(). Perhaps give it a try.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > -Andreas<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > On Wed, Nov 1, 2023 at 1:35 PM John Carlson <<a href="mailto:yottzumm@gmail.com"><span style='color:windowtext;text-decoration:none'>yottzumm@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > First "bug" report:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > $ py JoeKick.py<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > x3d.py package 4.0.64.4 loaded, have fun with X3D Graphics!<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > Self-test diagnostics for JoeKick.py:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > meta information, TODO: Record information about skin <o:p></o:p></p><p class=MsoPlainText>>>> > > coordinates<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > (found in comment at end of scene) as a structured MetadataSet containing MetadataString nodes Traceback (most recent call last):<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >   File "C:\Users\john\X3DJSONLD\blend\JoeKick.py", line 715, in <o:p></o:p></p><p class=MsoPlainText>>>> > > <module><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >     newModelXML= newModel.XML() # test export method XML() for <o:p></o:p></p><p class=MsoPlainText>>>> > > exceptions during export<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >                  ^^^^^^^^^^^^^^<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >   File "C:\Users\john\x3d-python-mod\x3dcf.py", line 14985, in <o:p></o:p></p><p class=MsoPlainText>>>> > > XML<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >     result += str(self.Scene.XML(indentLevel=indentLevel+1, <o:p></o:p></p><p class=MsoPlainText>>>> > > syntax=syntax))<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >                   <o:p></o:p></p><p class=MsoPlainText>>>> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >   File "C:\Users\john\x3d-python-mod\x3dcf.py", line 14494, in <o:p></o:p></p><p class=MsoPlainText>>>> > > XML<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >     result += each.XML(indentLevel=indentLevel+1, syntax=syntax)<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >   File "C:\Users\john\x3d-python-mod\x3dcf.py", line 45024, in <o:p></o:p></p><p class=MsoPlainText>>>> > > XML<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >     result += each.XML(indentLevel=indentLevel+1, syntax=syntax, <o:p></o:p></p><p class=MsoPlainText>>>> > > field="children")<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<o:p></o:p></p><p class=MsoPlainText>>>> > > ^^^^<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > TypeError: ROUTE.XML() got an unexpected keyword argument 'field'<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > I have to take a half hour off volunteering, I hope to be back soon.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > John<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > > On Wed, Nov 1, 2023 at 12:22 PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> Thanks for giving this a try ! Glad to hear it could be useful,<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> Andreas<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Message: 2<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Date: Wed, 1 Nov 2023 11:16:24 -0400<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > From: Vincent Marchetti <<a href="mailto:vmarchetti@kshell.com"><span style='color:windowtext;text-decoration:none'>vmarchetti@kshell.com</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > To: X3D-Public <<a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes <o:p></o:p></p><p class=MsoPlainText>>>> > >> > in v.3.3<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >         and v.4.0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Message-ID: <<a href="mailto:38B8549E-944D-460F-B5D7-31BC73721015@kshell.com"><span style='color:windowtext;text-decoration:none'>38B8549E-944D-460F-B5D7-31BC73721015@kshell.com</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Content-Type: text/plain; charset="us-ascii"<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Thank you Andreas, The x3dcf.py module is a useful tool for generating X3D XML encoding for those scenes which require the containerField xml attribute to unambiguously assign XML elements to the different X3D fields of the parent XML element.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > I ran an example Python script for generating a MetadataSet node that required containerField for accurat XML encoding and the correct result is in the GeneratedCalendarMetadataWithCF.x3d file attached.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > The pertinent accurate encoding is:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ------<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >     <WorldInfo><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >       <MetadataSet containerField='metadata' name='birthday' <o:p></o:p></p><p class=MsoPlainText>>>> > >> > reference='https://www.archives.gov/legislative/features/wash<o:p></o:p></p><p class=MsoPlainText>>>> > >> > ington'><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >         <MetadataString containerField='metadata' <o:p></o:p></p><p class=MsoPlainText>>>> > >> > name='calendar' value='"Julian"'/><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >         <MetadataInteger containerField='value' name='day' <o:p></o:p></p><p class=MsoPlainText>>>> > >> > value='11'/><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >         <MetadataInteger containerField='value' name='month' <o:p></o:p></p><p class=MsoPlainText>>>> > >> > value='2'/><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >         <MetadataInteger containerField='value' name='year' <o:p></o:p></p><p class=MsoPlainText>>>> > >> > value='1731'/><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >       </MetadataSet><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >     </WorldInfo><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > -----<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Vince Marchetti<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > -------------- next part -------------- A non-text attachment <o:p></o:p></p><p class=MsoPlainText>>>> > >> > was<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > scrubbed...<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Name: GenerateCalendarMetadataWithCF.py<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Type: text/x-python-script<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Size: 791 bytes<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Desc: not available<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > URL:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/<o:p></o:p></p><p class=MsoPlainText>>>> > >> > 202311<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > 01/1383c745/attachment-0001.bin><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > -------------- next part -------------- A non-text attachment <o:p></o:p></p><p class=MsoPlainText>>>> > >> > was<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > scrubbed...<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Name: GeneratedCalendarMetadataWithCF.x3d<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Type: model/x3d+xml<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Size: 920 bytes<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Desc: not available<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > URL:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/<o:p></o:p></p><p class=MsoPlainText>>>> > >> > 202311<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > 01/1383c745/attachment-0001.x3d><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > -------------- next part --------------<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > On Nov 1, 2023, at 10:23 AM, Andreas Plesch <<a href="mailto:andreasplesch@gmail.com"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > A quick update:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > On Tue, Oct 31, 2023 at 3:49?PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> Notes:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> x3d.py is autogenerated from X3DUOM:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> <a href="https://www.web3d.org/x3d/stylesheets/python/python.html#a"><span style='color:windowtext;text-decoration:none'>https://www.web3d.org/x3d/stylesheets/python/python.html#a</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> utogen<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> eration<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> <a href="https://nam10.safelinks.protection.outlook.com/?url=https%25"><span style='color:windowtext;text-decoration:none'>https://nam10.safelinks.protection.outlook.com/?url=https%</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 3A%2F%<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 2Fsourceforge.net%2Fp%2Fx3d%2Fcode%2FHEAD%2Ftree%2Fwww.web<o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 3d.org<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> %2Fx3d%2Fstylesheets%2FX3duomToX3dPythonPackage.xslt&data=<o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 05%7C0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 1%7Cbrutzman%40nps.edu%7Ccd2d5f56ffc7496e3e5b08dbdb11f7fb%<o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 7C6d93<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 6231a51740ea9199f7578963378e%7C0%7C0%7C638344642474548323%<o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 7CUnkn<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> own%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJB<o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> TiI6Ik<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> 1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=vUoJQilvuatDOWA<o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> pbTvcw<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> vEprn8iyCs%2B%2F%2F7xTlQxpYE%3D&reserved=0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> X3DUOM has all necessary containerField default value information.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> But the first step may be to modify the stylesheet to <o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> generate<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> containerField attributes for all nodes, for simplicity. <o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> It<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> looks like the .XML() function would have to have an additional parameter 'field'<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> X3D(indentLevel, syntax, field) for each node.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> Postprocessing the generated XML is not possible since<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> information was irretrievably lost. But postprocessing the<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > >> autogenerated x3d.py python code may be possible since xslt is not for everyone.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > As a proof of concept I hacked a short awk (since I know <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > it)<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > script to process the latest x3d.py to include containerField support:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253"><span style='color:windowtext;text-decoration:none'>https://nam10.safelinks.protection.outlook.com/?url=https%3</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > A%2F%2<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Fgithub.com%2Fandreasplesch%2Fx3d-python-mod%2Fblob%2Fmain%<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 2Fsrc%<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 2FcfXML.awk&data=05%7C01%7Cbrutzman%40nps.edu%7Ccd2d5f56ffc<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 7496e3<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0%<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 7C6383<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 44642474548323%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAi<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > LCJQIj<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > oiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sd<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ata=6X<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > xOQrg8Id5BdOwqnW52BBFwDkmMPwhgKsa2BLle6ms%3D&reserved=0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > It looks for the Concrete Nodes section, adds a field <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > parameter<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > to the<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > .XML() output function, adds the containerField attribute <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > to the<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > output, and adds the field parameter to the .XML() calls <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > for<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > metadata, SFNode and MFNode field processing.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > The awk script is very brittle since it relies on comments <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > in<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > x3d.py to find the appropriate lines to modify. The hardest <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > part<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > was to get the quoting and escaping correct.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > It generates containerField attributes for all SF/MFNode <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > fields<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > except 'children'. Of course, most are unnecessary but <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > filtering<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > systematically for defaults would probably require <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > involving<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > X3DUOM and the generation stylesheet, similar to other XML related 'fields'<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > such as style or class.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > The result is<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253"><span style='color:windowtext;text-decoration:none'>https://nam10.safelinks.protection.outlook.com/?url=https%3</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > A%2F%2<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Fraw.githubusercontent.com%2Fandreasplesch%2Fx3d-python-mod<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > %2Fmai<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > n%2Fx3dcf.py&data=05%7C01%7Cbrutzman%40nps.edu%7Ccd2d5f56ff<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > c7496e<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 3e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > %7C638<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 344642474548323%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDA<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > iLCJQI<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > joiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&s<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > data=p<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Lm5kiuYmgbb5jcjp09KTCrIzUt2p%2BkdYlrjyYpkhac%3D&reserved=0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > The modified python script appears to work as expected by <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > adding<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > the appropriate containerField attributes in XML output for <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > all<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > the examples I tried.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Realistically, this is as far as I can go with this but I <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > think<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > it may show how containerField support in XML output could <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > be<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > provided with x3d.py.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > -Andreas<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > _______________________________________________<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > x3d-public mailing list<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org"><span style='color:windowtext;text-decoration:none'>http://web3d.org/mailman/listinfo/x3d-public_web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ------------------------------<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Message: 3<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Date: Wed, 1 Nov 2023 11:05:29 -0500<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > From: John Carlson <<a href="mailto:yottzumm@gmail.com"><span style='color:windowtext;text-decoration:none'>yottzumm@gmail.com</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > To: Andreas Plesch <<a href="mailto:andreasplesch@gmail.com"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Cc: X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes <o:p></o:p></p><p class=MsoPlainText>>>> > >> > in v.3.3<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> >         and v.4.0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Message-ID:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > <CAGC3UEkYxP0tk5rQ23VVhsd0gXW7W+AH5QaS=AWxkv0f8kgo1Q@mail.gma<o:p></o:p></p><p class=MsoPlainText>>>> > >> > il.com<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Content-Type: text/plain; charset="utf-8"<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > You are awesome, Andreas!  Awk would not have been my choice, <o:p></o:p></p><p class=MsoPlainText>>>> > >> > but<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > apparently, you made it work!  Perhaps I will make a Perl <o:p></o:p></p><p class=MsoPlainText>>>> > >> > script based on<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > your awk.   A python script could be written to process X3DUOM and probably<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > do the matching as well.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Dang cool!<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > On Wed, Nov 1, 2023 at 9:24 AM Andreas Plesch<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > <<a href="mailto:andreasplesch@gmail.com"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > wrote:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > A quick update:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > On Tue, Oct 31, 2023 at 3:49?PM Andreas Plesch<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <<a href="mailto:andreasplesch@gmail.com"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > wrote:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > Notes:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > x3d.py is autogenerated from X3DUOM:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > <a href="https://www.web3d.org/x3d/stylesheets/python/python.html#"><span style='color:windowtext;text-decoration:none'>https://www.web3d.org/x3d/stylesheets/python/python.html#</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > autoge<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > neration<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253"><span style='color:windowtext;text-decoration:none'>https://nam10.safelinks.protection.outlook.com/?url=https%3</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > A%2F%2<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Fsourceforge.net%2Fp%2Fx3d%2Fcode%2FHEAD%2Ftree%2Fwww.web3d<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > .org%2<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Fx3d%2Fstylesheets%2FX3duomToX3dPythonPackage.xslt&data=05%<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 7C01%7<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Cbrutzman%40nps.edu%7Ccd2d5f56ffc7496e3e5b08dbdb11f7fb%7C6d<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 936231<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > a51740ea9199f7578963378e%7C0%7C0%7C638344642474548323%7CUnk<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > nown%7<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 1haWwi<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > LCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=vUoJQilvuatDOWApbTvcwv<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Eprn8i<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > yCs%2B%2F%2F7xTlQxpYE%3D&reserved=0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > X3DUOM has all necessary containerField default value information.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > But the first step may be to modify the stylesheet to <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > generate<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > containerField attributes for all nodes, for simplicity. <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > It<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > looks like the .XML() function would have to have an additional parameter 'field'<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > X3D(indentLevel, syntax, field) for each node.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > Postprocessing the generated XML is not possible since<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > information was irretrievably lost. But postprocessing <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > the<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > > autogenerated x3d.py python code may be possible since xslt is not for everyone.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > As a proof of concept I hacked a short awk (since I know <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > it)<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > script to process the latest x3d.py to include containerField support:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253"><span style='color:windowtext;text-decoration:none'>https://nam10.safelinks.protection.outlook.com/?url=https%3</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > A%2F%2<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Fgithub.com%2Fandreasplesch%2Fx3d-python-mod%2Fblob%2Fmain%<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 2Fsrc%<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 2FcfXML.awk&data=05%7C01%7Cbrutzman%40nps.edu%7Ccd2d5f56ffc<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 7496e3<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0%<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 7C6383<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 44642474548323%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAi<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > LCJQIj<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > oiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sd<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > ata=6X<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > xOQrg8Id5BdOwqnW52BBFwDkmMPwhgKsa2BLle6ms%3D&reserved=0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > It looks for the Concrete Nodes section, adds a field <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > parameter<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > to the<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > .XML() output function, adds the containerField attribute <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > to the<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > output, and adds the field parameter to the .XML() calls <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > for<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > metadata, SFNode and MFNode field processing.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > The awk script is very brittle since it relies on comments <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > in<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > x3d.py to find the appropriate lines to modify. The hardest <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > part<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > was to get the quoting and escaping correct.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > It generates containerField attributes for all SF/MFNode <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > fields<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > except 'children'. Of course, most are unnecessary but <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > filtering<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > systematically for defaults would probably require <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > involving<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > X3DUOM and the generation stylesheet, similar to other XML related 'fields'<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > such as style or class.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > The result is<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253"><span style='color:windowtext;text-decoration:none'>https://nam10.safelinks.protection.outlook.com/?url=https%3</span></a><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > A%2F%2<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Fraw.githubusercontent.com%2Fandreasplesch%2Fx3d-python-mod<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > %2Fmai<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > n%2Fx3dcf.py&data=05%7C01%7Cbrutzman%40nps.edu%7Ccd2d5f56ff<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > c7496e<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 3e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > %7C638<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 344642474704621%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDA<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > iLCJQI<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > joiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&s<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > data=7<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 4nwRmIni6cSY%2FMdNtOH5VNh9l6%2FScsR4te6XOlwKug%3D&reserved=<o:p></o:p></p><p class=MsoPlainText>>>> > >> > > 0<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > The modified python script appears to work as expected by <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > adding<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > the appropriate containerField attributes in XML output for <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > all<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > the examples I tried.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > Realistically, this is as far as I can go with this but I <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > think<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > it may show how containerField support in XML output could <o:p></o:p></p><p class=MsoPlainText>>>> > >> > > be<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > provided with x3d.py.<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > > -Andreas<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > -------------- next part -------------- An HTML attachment <o:p></o:p></p><p class=MsoPlainText>>>> > >> > was<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > scrubbed...<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > URL:<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/<o:p></o:p></p><p class=MsoPlainText>>>> > >> > 202311<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > 01/59b1f34d/attachment.html><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ------------------------------<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > Subject: Digest Footer<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > _______________________________________________<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > x3d-public mailing list<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > <a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org"><span style='color:windowtext;text-decoration:none'>http://web3d.org/mailman/listinfo/x3d-public_web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ------------------------------<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > End of x3d-public Digest, Vol 176, Issue 4<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> > ******************************************<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> --<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> Andreas Plesch<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > >> Waltham, MA 02453<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > --<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Andreas Plesch<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > Waltham, MA 02453<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > _______________________________________________<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > x3d-public mailing list<o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > <a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText>>>> ><o:p></o:p></p><p class=MsoPlainText>>>> > <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org"><span style='color:windowtext;text-decoration:none'>http://web3d.org/mailman/listinfo/x3d-public_web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> --<o:p></o:p></p><p class=MsoPlainText>>>> Andreas Plesch<o:p></o:p></p><p class=MsoPlainText>>>> Waltham, MA 02453<o:p></o:p></p><p class=MsoPlainText>>>><o:p> </o:p></p><p class=MsoPlainText>>>> _______________________________________________<o:p></o:p></p><p class=MsoPlainText>>>> x3d-public mailing list<o:p></o:p></p><p class=MsoPlainText>>>> <a href="mailto:x3d-public@web3d.org"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText>>>> <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org"><span style='color:windowtext;text-decoration:none'>http://web3d.org/mailman/listinfo/x3d-public_web3d.org</span></a><o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>--<o:p></o:p></p><p class=MsoPlainText>Andreas Plesch<o:p></o:p></p><p class=MsoPlainText>Waltham, MA 02453<o:p></o:p></p></div></body></html>