<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:"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;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
{mso-style-name:msonormal;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
p.m-3752600496485697341msoplaintext, li.m-3752600496485697341msoplaintext, div.m-3752600496485697341msoplaintext
{mso-style-name:m_-3752600496485697341msoplaintext;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.gmailsignatureprefix
{mso-style-name:gmail_signature_prefix;}
span.EmailStyle21
{mso-style-type:personal;
font-family:"Calibri",sans-serif;
color:windowtext;}
span.EmailStyle22
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@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:330724454;
mso-list-template-ids:2102154814;}
@list l0:level1
{mso-level-start-at:4;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l1
{mso-list-id:431704881;
mso-list-template-ids:-1690115914;}
@list l1:level1
{mso-level-start-at:3;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l2
{mso-list-id:551304819;
mso-list-template-ids:471490172;}
@list l2:level1
{mso-level-start-at:2;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l3
{mso-list-id:561868315;
mso-list-template-ids:2130061654;}
@list l3: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 l3:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l3: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:Symbol;}
@list l3: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:Symbol;}
@list l3: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:Symbol;}
@list l3: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:Symbol;}
@list l3: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:Symbol;}
@list l3: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:Symbol;}
@list l3: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:Symbol;}
@list l4
{mso-list-id:565996706;
mso-list-template-ids:-1947676828;}
@list l4:level1
{mso-level-start-at:5;
mso-level-tab-stop:.5in;
mso-level-number-position:left;
text-indent:-.25in;}
@list l5
{mso-list-id:726104512;
mso-list-template-ids:917152298;}
@list l5: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 l5:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l5: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:Symbol;}
@list l5: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:Symbol;}
@list l5: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:Symbol;}
@list l5: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:Symbol;}
@list l5: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:Symbol;}
@list l5: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:Symbol;}
@list l5: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:Symbol;}
@list l6
{mso-list-id:869563125;
mso-list-template-ids:-925856760;}
@list l7
{mso-list-id:1004044000;
mso-list-template-ids:1289497596;}
@list l7: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 l7:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l7: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:Symbol;}
@list l7: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:Symbol;}
@list l7: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:Symbol;}
@list l7: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:Symbol;}
@list l7: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:Symbol;}
@list l7: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:Symbol;}
@list l7: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:Symbol;}
@list l8
{mso-list-id:1136872051;
mso-list-template-ids:-1406208724;}
@list l8: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 l8:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l8: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:Symbol;}
@list l8: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:Symbol;}
@list l8: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:Symbol;}
@list l8: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:Symbol;}
@list l8: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:Symbol;}
@list l8: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:Symbol;}
@list l8: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:Symbol;}
@list l9
{mso-list-id:1298341805;
mso-list-template-ids:-582435618;}
@list l9: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 l9:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l9: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:Symbol;}
@list l9: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:Symbol;}
@list l9: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:Symbol;}
@list l9: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:Symbol;}
@list l9: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:Symbol;}
@list l9: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:Symbol;}
@list l9: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:Symbol;}
@list l10
{mso-list-id:1382705975;
mso-list-template-ids:-685356900;}
@list l10: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 l10:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l10: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:Symbol;}
@list l10: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:Symbol;}
@list l10: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:Symbol;}
@list l10: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:Symbol;}
@list l10: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:Symbol;}
@list l10: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:Symbol;}
@list l10: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:Symbol;}
@list l11
{mso-list-id:1443527915;
mso-list-template-ids:1180480866;}
@list l11: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 l11:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l11: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:Symbol;}
@list l11: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:Symbol;}
@list l11: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:Symbol;}
@list l11: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:Symbol;}
@list l11: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:Symbol;}
@list l11: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:Symbol;}
@list l11: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:Symbol;}
@list l12
{mso-list-id:1814833601;
mso-list-template-ids:715707166;}
@list l12: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 l12:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l12: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:Symbol;}
@list l12: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:Symbol;}
@list l12: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:Symbol;}
@list l12: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:Symbol;}
@list l12: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:Symbol;}
@list l12: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:Symbol;}
@list l12: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:Symbol;}
@list l13
{mso-list-id:2008973253;
mso-list-template-ids:-628219568;}
@list l13: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 l13:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l13: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:Symbol;}
@list l13: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:Symbol;}
@list l13: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:Symbol;}
@list l13: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:Symbol;}
@list l13: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:Symbol;}
@list l13: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:Symbol;}
@list l13: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:Symbol;}
@list l14
{mso-list-id:2124686445;
mso-list-template-ids:1785384050;}
@list l14: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 l14:level2
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:1.0in;
mso-level-number-position:left;
text-indent:-.25in;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
@list l14: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:Symbol;}
@list l14: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:Symbol;}
@list l14: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:Symbol;}
@list l14: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:Symbol;}
@list l14: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:Symbol;}
@list l14: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:Symbol;}
@list l14: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:Symbol;}
ol
{margin-bottom:0in;}
ul
{margin-bottom:0in;}
--></style></head><body lang=EN-US link=blue vlink=purple style='word-wrap:break-word'><div class=WordSection1><p class=MsoNormal>Glad this careful look was useful, thanks.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>FWIW for authoring cases where I wanted to ROUTE into a Material node, the moving the ROUTE a few lines later (just after the containing Shape node) didn’t seem like any significant loss of authoring context. Good DEF names help even further.<o:p></o:p></p><div><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Courier New"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Courier New"'>all the best, Don<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:9.0pt;font-family:"Courier New"'>-- <o:p></o:p></span></p><p class=MsoNormal><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=MsoNormal><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=MsoNormal><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></div><p class=MsoNormal><o:p> </o:p></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From:</b> Andreas Plesch <andreasplesch@gmail.com> <br><b>Sent:</b> Sunday, November 5, 2023 9:28 AM<br><b>To:</b> Brutzman, Donald (Don) (CIV) <brutzman@nps.edu><br><b>Cc:</b> GPU Group <gpugroup@gmail.com>; Holger Seelig <holger.seelig@yahoo.de>; Michalis Kamburelis <michalis.kambi@gmail.com>; X3D Graphics public mailing list <x3d-public@web3d.org><br><b>Subject:</b> Re: Where to allow ROUTE in X3D models? Deep-dive analysis<o:p></o:p></p></div></div><p class=MsoNormal><o:p> </o:p></p><div style='border:solid #004679 1.0pt;padding:2.0pt 2.0pt 2.0pt 2.0pt'><p class=MsoNormal style='line-height:12.0pt;background:#004679'><span style='font-size:10.0pt;color:yellow'>NPS WARNING: *external sender* verify before acting.<o:p></o:p></span></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><div><p class=MsoNormal>Thanks for the deep dive into X3D design and the xml encoding.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>I completely agree that all the diverse X3D statements have their own requirements within the document. So a MFStatement type field type would not be useful.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Good to learn that the XML encoding restricts ROUTE placement to the Scene root and to within X3DGroupingNodes via the schema. If this is the case, that restriction should probably be included in the XML encoding specification itself, perhaps here <a href="https://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/concepts.html#ROUTEStatementSyntax">https://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/concepts.html#ROUTEStatementSyntax</a> .<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>In turn, since the XML encoding has this restriction, other encodings may also need to consider such a restriction since content should be transparent across encodings. In the end, the abstract specification may need to be tightened from 'inside a node wherever fields may appear' to something like 'inside a node wherever X3DChildNodes may appear'.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Finally, to me a ROUTE statement next to a Material node (inside a Shape node) does not seem out of place, if an author wants to emphasize the target of an event. An author could reasonably structure a scene document following an input-processing-output design: First, a (Time)Sensor as input, then an Interpolator ( or Script ) for processing, and finally the Shape with the Material as output at the bottom. That does not seem very exotic ?<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>But if such a ROUTE statement placement is deemed not desirable in any encoding, I think the spec. should reflect that view and may need another look.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>All the best, Andreas<o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal>On Sat, Nov 4, 2023 at 9:09 PM Brutzman, Donald (Don) (CIV) <<a href="mailto:brutzman@nps.edu">brutzman@nps.edu</a>> wrote:<o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><div><p class=m-3752600496485697341msoplaintext>All useful thoughts, thanks Andreas and Doug.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><ol start=1 type=1><li class=m-3752600496485697341msoplaintext style='mso-list:l6 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=m-3752600496485697341msoplaintext> <o:p></o:p></p><ul type=disc><li class=m-3752600496485697341msoplaintext 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=m-3752600496485697341msoplaintext style='mso-list:l3 level1 lfo2'><a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/components/core.html#AbstractX3DStructure" target="_blank">https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/components/core.html#AbstractX3DStructure</a><o:p></o:p></li></ul><div style='border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p></div><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext 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=m-3752600496485697341msoplaintext style='margin-left:.25in'> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.25in'>X3D statements include the following:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.25in'> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>Header,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>PROFILE,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>COMPONENT,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>META,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>UNIT,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>ROUTE,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>PROTO declare,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>EXTERNPROTO declare,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>PROTO interface,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>PROTO body,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>IS,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>connect,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>IMPORT, and<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l9 level1 lfo3'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>EXPORT<o:p></o:p></p><div style='border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p></div><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><ol start=2 type=1><li class=m-3752600496485697341msoplaintext style='mso-list:l2 level1 lfo4'><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=m-3752600496485697341msoplaintext style='margin-left:.25in'> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>X3D Specifications: Schema and DOCTYPE Validation<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/" target="_blank">https://www.web3d.org/specifications/</a><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5;background:#CCFFFF'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol;color:black'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><span style='font-size:13.5pt;font-family:"Times New Roman",serif;color:black'>X3D XML Schema x3d-4.0.xsd and documentation (latest)</span><span style='color:black'><o:p></o:p></span></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_X3D.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_X3D.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_component.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_component.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_unit.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_unit.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_meta.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_meta.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_ROUTE.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_ROUTE.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l13 level1 lfo5'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>etc.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l7 level1 lfo6'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_Scene.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_Scene.html</a> (wow, a lot of possibilities)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l7 level1 lfo6'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>down towards bottom: ChildContentModelSceneGraphStructure<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext><img border=0 width=430 height=167 style='width:4.4791in;height:1.7416in' id="m_-3752600496485697341Picture_x0020_2" src="cid:image001.png@01DA1029.56C251D0"><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>and<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l12 level1 lfo7'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_X3DGroupingNode.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_X3DGroupingNode.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l12 level1 lfo7'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>again towards bottom, can find ChildContentModelSceneGraphStructure<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l12 level1 lfo7'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_ChildContentModelSceneGraphStructure.html" target="_blank">https://www.web3d.org/specifications/X3dSchemaDocumentation4.0/x3d-4.0_ChildContentModelSceneGraphStructure.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><ol start=3 type=1><li class=m-3752600496485697341msoplaintext style='mso-list:l1 level1 lfo8'><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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>Let’s look in detail at how the statements got collected in X3DUOM.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l11 level1 lfo9'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>X3D Unified Object Model (X3DUOM)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l11 level1 lfo9'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3DUOM.html" target="_blank">https://www.web3d.org/specifications/X3DUOM.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l11 level1 lfo9'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3dUnifiedObjectModel-4.0.xml" target="_blank">https://www.web3d.org/specifications/X3dUnifiedObjectModel-4.0.xml</a><o:p></o:p></p><div style='border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p></div><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l5 level1 lfo10'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>Overall structure (screen snippet using Chrome)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext><img border=0 width=906 height=270 style='width:9.4375in;height:2.8125in' id="m_-3752600496485697341Picture_x0020_1" src="cid:image002.png@01DA1029.56C251D0"><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l8 level1 lfo11'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>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></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext><Statement name="ROUTE"><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <InterfaceDefinition specificationUrl=<a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/concepts.html#ModifyingObjectsRoutes" target="_blank">https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/concepts.html#ModifyingObjectsRoutes</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> appinfo="ROUTE connects output fields of event-producing nodes to input fields of event-consuming nodes."><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <componentInfo name="Core" level="1"/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <field name="class"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> type="SFString"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> accessType="inputOutput"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> inheritedFrom="X3DStatement"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> baseType="xs:NMTOKENS"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> 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=m-3752600496485697341msoplaintext> <field name="fromField"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> type="SFString"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> accessType="inputOutput"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> use="required"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> baseType="xs:NMTOKEN"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> description="fromField is the field name in the source node which is originating an event."/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <field name="fromNode"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> type="SFString"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> accessType="inputOutput"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> use="required"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> baseType="xs:IDREF"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> description="fromNode is the DEF name of the node originating an event."/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <field name="id"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> type="SFString"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> accessType="inputOutput"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> inheritedFrom="X3DStatement"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> baseType="xs:NMTOKEN"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> 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=m-3752600496485697341msoplaintext> <field name="style"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> type="SFString"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> accessType="inputOutput"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> inheritedFrom="X3DStatement"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> 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=m-3752600496485697341msoplaintext> <field name="toField"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> type="SFString"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> accessType="inputOutput"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> use="required"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> baseType="xs:NMTOKEN"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> description="toField is the field name in the destination node which is receiving an event."/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <field name="toNode"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> type="SFString"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> accessType="inputOutput"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> use="required"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> baseType="xs:IDREF"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> description="toNode is the DEF name of the destination node receiving an event."/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> </InterfaceDefinition><o:p></o:p></p><p class=m-3752600496485697341msoplaintext></Statement><o:p></o:p></p><div style='border:none;border-bottom:solid windowtext 1.5pt;padding:0in 0in 1.0pt 0in'><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p></div><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>Continued exploration shows consistent structures throughout X3DUOM. Autogeneration is challenging but powerful!<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><ol start=4 type=1><li class=m-3752600496485697341msoplaintext style='mso-list:l0 level1 lfo12'><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=m-3752600496485697341msoplaintext><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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><ol start=5 type=1><li class=m-3752600496485697341msoplaintext style='mso-list:l4 level1 lfo13'><b>OK OK already. Where can you put a ROUTE?</b><o:p></o:p></li></ol><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l10 level1 lfo14'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>Patient: “Doctor Doctor, my arm hurts when I lift it far behind my back like this…. over here… Ouch!”<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l10 level1 lfo14'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>Doctor: “Don’t do that.”<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l10 level1 lfo14'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>In NYC: “That will be a thousand dollars, please!” (more pain follows…)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l14 level1 lfo15'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>Extensible 3D (X3D) 4.0, Part 1: Architecture and base components<o:p></o:p></p><p class=m-3752600496485697341msoplaintext style='margin-left:.75in;text-indent:-.25in;mso-list:l14 level1 lfo15'><![if !supportLists]><span style='font-size:10.0pt;font-family:Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]><a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/Architecture.html" target="_blank">https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-IS.proof/Part01/Architecture.html</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>Any way you like it, hopefully, if we remain careful. Repeatable improvements are always welcome.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>Have fun with X3D 4.0! 8)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>all the best, Don<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>-- <o:p></o:p></p><p class=m-3752600496485697341msoplaintext><span style='font-size:9.0pt;font-family:"Courier New"'>Don Brutzman Naval Postgraduate School, Code USW/Br <a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a></span><o:p></o:p></p><p class=m-3752600496485697341msoplaintext><span style='font-size:9.0pt;font-family:"Courier New"'>Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149</span><o:p></o:p></p><p class=m-3752600496485697341msoplaintext><span style='font-size:9.0pt;font-family:"Courier New"'>X3D graphics, virtual worlds, navy robotics <a href="https://faculty.nps.edu/brutzman" target="_blank">https://faculty.nps.edu/brutzman</a></span><o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>-----Original Message-----<br>From: Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank">andreasplesch@gmail.com</a>> <br>Sent: Friday, November 3, 2023 7:44 PM<br>To: GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank">gpugroup@gmail.com</a>><br>Cc: Brutzman, Donald (Don) (CIV) <<a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a>>; X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org" target="_blank">x3d-public@web3d.org</a>><br>Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes in v.3.3 and v.4.0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>On Thu, Nov 2, 2023 at 7:48 PM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>gpugroup@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> Proposed solution: MFStatement field type in x3d.py<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> - each executionContext type ProtoDeclare, Inline, Scene would have 2 <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> new fields MFStatement ProtoDeclares MFStatement Routes<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> - then when exporting a scene via x3d.py, protodeclares and routes <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> would be put in those fields<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> - 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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>containerField support in x3d.py is really unrelated and can be accomplished in any case.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>-Andreas<o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>> On Thu, Nov 2, 2023 at 7:42 AM GPU Group <<a href="mailto:gpugroup@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>gpugroup@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>> 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=m-3752600496485697341msoplaintext>>> -Doug<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>> On Wed, Nov 1, 2023 at 8:54 PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Hi Don,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> All true and relevant, of course. I think the important phrase is <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> "inside a node wherever fields may appear". The question becomes <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> what does that phrase mean for the python encoding ? It is unclear <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> that it means ROUTE statements should appear as members of the array <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> which is assigned to the children field of a node, or any other <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> MFNode field of a node. The python encoding does not currently allow <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> for non-field parameters to appear inside a X3D node, eg. inside the <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> parameters given to the node returning function call. So, as a <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> consequence, the only option currently is to add ROUTE statements to <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> MFNode field values in the python encoding which to me seems more like a band aid.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> For example, it seems to make it impossible to represent a ROUTE <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> inside a node which only has SFNode fields like:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> XML:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <Shape><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <Appearance><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <Material DEF='boxColor' diffuseColor='1 0 0' /><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> </Appearance><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <ROUTE fromNode='cIntrpltr' fromField='value_changed'<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> toNode='boxColor' toField='diffuseColor' /><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <Box/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> </Shape><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Python:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Shape(<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> appearance=Appearance(<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> material=Material(DEF='boxColor', diffuseColor=SFColor(1,0,0))),<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> # How to add a ROUTE here ?<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> # children=[ ROUTE(..) ] ?<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> geometry=Box()<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> )<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Perhaps the children parameter is allowed for any node in the Python encoding ?<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Would it make sense to add a 'statements' parameter or an 'inside'<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> parameter to node generating functions in python ? Possibly too late <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> for that.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> In any case, for containerField support it is possible to just have<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Route.XML() (and Comment.XML()) accept an optional field parameter <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> which is ignored.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> -Andreas<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> On Wed, Nov 1, 2023 at 8:03 PM Brutzman, Donald (Don) (CIV) <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <<a href="mailto:brutzman@nps.edu" target="_blank"><span style='color:windowtext;text-decoration:none'>brutzman@nps.edu</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > X3D 4.0 Architecture, clause 4 Concepts, 4.4.2.4.1 Routes <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > <a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-I" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > S.proof/Part01/concepts.html#ModifyingObjectsRoutes<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > DEF TS TimeSensor {<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > loop TRUE<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > cycleInterval 5<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > }<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > DEF I PositionInterpolator {<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > key [ 0 0.5 1 ]<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > keyValue [ 0 -1 0, 0 1 0, 0 -1 0 ]<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > }<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > DEF T Transform {<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > children [<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Shape {<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > geometry Box { }<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > }<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ]<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > }<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ROUTE ts.fraction_changed TO I.set_fraction<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ROUTE I.value_changed TO T.set_translation<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Also relevant:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > X3D 4.0 Architecture, clause 4 Concepts, 4.4.8.2 Routes <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > <a href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-I" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > S.proof/Part01/concepts.html#Routes<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Hope this makes sense. Thanks everyone for paying close attention… validatable correctness is essential.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Have fun with X3D! 8)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > all the best, Don<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > --<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Don Brutzman Naval Postgraduate School, Code USW/Br <a href="mailto:brutzman@nps.edu" target="_blank"><span style='color:windowtext;text-decoration:none'>brutzman@nps.edu</span></a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Watkins 270, MOVES Institute, Monterey CA 93943-5000 USA +1.831.656.2149<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > X3D graphics, virtual worlds, navy robotics <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > <a href="https://faculty.nps.edu/brutzman" target="_blank"><span style='color:windowtext;text-decoration:none'>https://faculty.nps.edu/brutzman</span></a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > -----Original Message-----<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > From: x3d-public <<a href="mailto:x3d-public-bounces@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public-bounces@web3d.org</span></a>> On Behalf Of <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Andreas Plesch<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Sent: Wednesday, November 1, 2023 12:36 PM<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > To: John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>yottzumm@gmail.com</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Cc: X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes in <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > v.3.3 and v.4.0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > -Andreas<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > On Wed, Nov 1, 2023 at 1:35 PM John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>yottzumm@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > First "bug" report:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > $ py JoeKick.py<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > x3d.py package 4.0.64.4 loaded, have fun with X3D Graphics!<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > Self-test diagnostics for JoeKick.py:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > meta information, TODO: Record information about skin <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > coordinates<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > (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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > File "C:\Users\john\X3DJSONLD\blend\JoeKick.py", line 715, in <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > <module><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > newModelXML= newModel.XML() # test export method XML() for <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > exceptions during export<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > ^^^^^^^^^^^^^^<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > File "C:\Users\john\x3d-python-mod\x3dcf.py", line 14985, in <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > XML<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > result += str(self.Scene.XML(indentLevel=indentLevel+1, <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > syntax=syntax))<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > File "C:\Users\john\x3d-python-mod\x3dcf.py", line 14494, in <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > XML<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > result += each.XML(indentLevel=indentLevel+1, syntax=syntax)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > File "C:\Users\john\x3d-python-mod\x3dcf.py", line 45024, in <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > XML<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > result += each.XML(indentLevel=indentLevel+1, syntax=syntax, <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > field="children")<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > ^^^^<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > TypeError: ROUTE.XML() got an unexpected keyword argument 'field'<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > I have to take a half hour off volunteering, I hope to be back soon.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > John<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > > On Wed, Nov 1, 2023 at 12:22 PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> Thanks for giving this a try ! Glad to hear it could be useful,<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> Andreas<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Message: 2<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Date: Wed, 1 Nov 2023 11:16:24 -0400<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > From: Vincent Marchetti <<a href="mailto:vmarchetti@kshell.com" target="_blank"><span style='color:windowtext;text-decoration:none'>vmarchetti@kshell.com</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > To: X3D-Public <<a href="mailto:x3d-public@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > in v.3.3<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > and v.4.0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Message-ID: <<a href="mailto:38B8549E-944D-460F-B5D7-31BC73721015@kshell.com" target="_blank"><span style='color:windowtext;text-decoration:none'>38B8549E-944D-460F-B5D7-31BC73721015@kshell.com</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Content-Type: text/plain; charset="us-ascii"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > The pertinent accurate encoding is:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ------<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <WorldInfo><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <MetadataSet containerField='metadata' name='birthday' <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > reference='<a href="https://www.archives.gov/legislative/features/wash" target="_blank">https://www.archives.gov/legislative/features/wash</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ington'><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <MetadataString containerField='metadata' <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > name='calendar' value='"Julian"'/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <MetadataInteger containerField='value' name='day' <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > value='11'/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <MetadataInteger containerField='value' name='month' <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > value='2'/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <MetadataInteger containerField='value' name='year' <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > value='1731'/><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > </MetadataSet><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > </WorldInfo><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > -----<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Vince Marchetti<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > -------------- next part -------------- A non-text attachment <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > was<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > scrubbed...<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Name: GenerateCalendarMetadataWithCF.py<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Type: text/x-python-script<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Size: 791 bytes<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Desc: not available<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > URL:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <<a href="http://web3d.org/pipermail/x3d-public_web3d.org/attachments/" target="_blank">http://web3d.org/pipermail/x3d-public_web3d.org/attachments/</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 202311<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 01/1383c745/attachment-0001.bin><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > -------------- next part -------------- A non-text attachment <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > was<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > scrubbed...<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Name: GeneratedCalendarMetadataWithCF.x3d<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Type: model/x3d+xml<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Size: 920 bytes<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Desc: not available<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > URL:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <<a href="http://web3d.org/pipermail/x3d-public_web3d.org/attachments/" target="_blank">http://web3d.org/pipermail/x3d-public_web3d.org/attachments/</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 202311<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 01/1383c745/attachment-0001.x3d><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > -------------- next part --------------<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > On Nov 1, 2023, at 10:23 AM, Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > A quick update:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > On Tue, Oct 31, 2023 at 3:49?PM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>> wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> Notes:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> x3d.py is autogenerated from X3DUOM:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> <a href="https://www.web3d.org/x3d/stylesheets/python/python.html#a" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > >> > >> utogen<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> eration<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> <a href="https://nam10.safelinks.protection.outlook.com/?url=https%25" target="_blank"><span style='color:windowtext;text-decoration:none'>https://nam10.safelinks.protection.outlook.com/?url=https%</span></a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 3A%2F%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 2Fsourceforge.net%2Fp%2Fx3d%2Fcode%2FHEAD%2Ftree%2Fwww.web<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> <a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2F3d.org%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996493248%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=yUcr0PzRQs1m3YcoP88aCDjVL6bf7UPwCq%2FzayoSU1c%3D&reserved=0" target="_blank">3d.org</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> %2Fx3d%2Fstylesheets%2FX3duomToX3dPythonPackage.xslt&data=<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 05%7C0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 1%7Cbrutzman%<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2F40nps.edu%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996493248%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=Z9uIuTyggvaHbvHNc68vcXEzZJ%2FYBA4pINI0eaRZyH4%3D&reserved=0" target="_blank">40nps.edu</a>%7Ccd2d5f56ffc7496e3e5b08dbdb11f7fb%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 7C6d93<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 6231a51740ea9199f7578963378e%7C0%7C0%7C638344642474548323%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 7CUnkn<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> own%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJB<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> TiI6Ik<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> 1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=vUoJQilvuatDOWA<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> pbTvcw<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> vEprn8iyCs%2B%2F%2F7xTlQxpYE%3D&reserved=0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> X3DUOM has all necessary containerField default value information.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> But the first step may be to modify the stylesheet to <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> generate<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> containerField attributes for all nodes, for simplicity. <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> It<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> looks like the .XML() function would have to have an additional parameter 'field'<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> X3D(indentLevel, syntax, field) for each node.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> Postprocessing the generated XML is not possible since<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> information was irretrievably lost. But postprocessing the<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > >> autogenerated x3d.py python code may be possible since xslt is not for everyone.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > As a proof of concept I hacked a short awk (since I know <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > it)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > script to process the latest x3d.py to include containerField support:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > >> > > A%2F%2<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Fgithub.com%2Fandreasplesch%2Fx3d-python-mod%2Fblob%2Fmain%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 2Fsrc%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 2FcfXML.awk&data=05%7C01%7Cbrutzman%<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2F40nps.edu%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996493248%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=Z9uIuTyggvaHbvHNc68vcXEzZJ%2FYBA4pINI0eaRZyH4%3D&reserved=0" target="_blank">40nps.edu</a>%7Ccd2d5f56ffc<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 7496e3<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 7C6383<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 44642474548323%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAi<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > LCJQIj<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > oiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sd<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ata=6X<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > xOQrg8Id5BdOwqnW52BBFwDkmMPwhgKsa2BLle6ms%3D&reserved=0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > It looks for the Concrete Nodes section, adds a field <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > parameter<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > to the<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > .XML() output function, adds the containerField attribute <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > to the<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > output, and adds the field parameter to the .XML() calls <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > for<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > metadata, SFNode and MFNode field processing.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > The awk script is very brittle since it relies on comments <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > in<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > x3d.py to find the appropriate lines to modify. The hardest <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > part<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > was to get the quoting and escaping correct.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > It generates containerField attributes for all SF/MFNode <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > fields<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > except 'children'. Of course, most are unnecessary but <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > filtering<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > systematically for defaults would probably require <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > involving<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > X3DUOM and the generation stylesheet, similar to other XML related 'fields'<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > such as style or class.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > The result is<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > >> > > A%2F%2<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Ffraw.githubusercontent.com%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996493248%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=5OgXIoMgqLfe8aWJugWz9uJ94v3pp46GWs7pVcJQXaA%3D&reserved=0" target="_blank">Fraw.githubusercontent.com</a>%2Fandreasplesch%2Fx3d-python-mod<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > %2Fmai<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > n%2Fx3dcf.py&data=05%7C01%7Cbrutzman%<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2F40nps.edu%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996649960%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=4BNBFzXRFlC3neEIuVH0qqIAdSiW2gSZLBcxen%2BZ0Fo%3D&reserved=0" target="_blank">40nps.edu</a>%7Ccd2d5f56ff<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > c7496e<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 3e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > %7C638<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 344642474548323%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDA<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > iLCJQI<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > joiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&s<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > data=p<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Lm5kiuYmgbb5jcjp09KTCrIzUt2p%2BkdYlrjyYpkhac%3D&reserved=0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > The modified python script appears to work as expected by <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > adding<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > the appropriate containerField attributes in XML output for <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > all<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > the examples I tried.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Realistically, this is as far as I can go with this but I <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > think<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > it may show how containerField support in XML output could <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > be<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > provided with x3d.py.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > -Andreas<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > _______________________________________________<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > x3d-public mailing list<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="mailto:x3d-public@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org" target="_blank"><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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ------------------------------<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Message: 3<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Date: Wed, 1 Nov 2023 11:05:29 -0500<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > From: John Carlson <<a href="mailto:yottzumm@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>yottzumm@gmail.com</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > To: Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Cc: X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Subject: Re: [x3d-public] x3d.py roundtrip for Metadata nodes <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > in v.3.3<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > and v.4.0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Message-ID:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <CAGC3UEkYxP0tk5rQ23VVhsd0gXW7W+AH5QaS=AWxkv0f8kgo1Q@mail.gma<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Fil.com%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996649960%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=M6LTAtabU93ocuw8%2FpCHdSUIIDIx57krThmVjaxsczg%3D&reserved=0" target="_blank">il.com</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Content-Type: text/plain; charset="utf-8"<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > You are awesome, Andreas! Awk would not have been my choice, <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > but<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > apparently, you made it work! Perhaps I will make a Perl <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > script based on<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > your awk. A python script could be written to process X3DUOM and probably<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > do the matching as well.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Dang cool!<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > On Wed, Nov 1, 2023 at 9:24 AM Andreas Plesch<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <<a href="mailto:andreasplesch@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > A quick update:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > On Tue, Oct 31, 2023 at 3:49?PM Andreas Plesch<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <<a href="mailto:andreasplesch@gmail.com" target="_blank"><span style='color:windowtext;text-decoration:none'>andreasplesch@gmail.com</span></a>><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > wrote:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > Notes:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > x3d.py is autogenerated from X3DUOM:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > <a href="https://www.web3d.org/x3d/stylesheets/python/python.html" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > >> > > > autoge<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > neration<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > >> > > A%2F%2<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Fsourceforge.net%2Fp%2Fx3d%2Fcode%2FHEAD%2Ftree%2Fwww.web3d<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > .org%2<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Fx3d%2Fstylesheets%2FX3duomToX3dPythonPackage.xslt&data=05%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 7C01%7<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Cbrutzman%<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2F40nps.edu%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996649960%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=4BNBFzXRFlC3neEIuVH0qqIAdSiW2gSZLBcxen%2BZ0Fo%3D&reserved=0" target="_blank">40nps.edu</a>%7Ccd2d5f56ffc7496e3e5b08dbdb11f7fb%7C6d<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 936231<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > a51740ea9199f7578963378e%7C0%7C0%7C638344642474548323%7CUnk<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > nown%7<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 1haWwi<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > LCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=vUoJQilvuatDOWApbTvcwv<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Eprn8i<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > yCs%2B%2F%2F7xTlQxpYE%3D&reserved=0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > X3DUOM has all necessary containerField default value information.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > But the first step may be to modify the stylesheet to <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > generate<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > containerField attributes for all nodes, for simplicity. <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > It<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > looks like the .XML() function would have to have an additional parameter 'field'<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > X3D(indentLevel, syntax, field) for each node.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > Postprocessing the generated XML is not possible since<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > information was irretrievably lost. But postprocessing <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > the<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > > autogenerated x3d.py python code may be possible since xslt is not for everyone.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > As a proof of concept I hacked a short awk (since I know <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > it)<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > script to process the latest x3d.py to include containerField support:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > >> > > A%2F%2<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Fgithub.com%2Fandreasplesch%2Fx3d-python-mod%2Fblob%2Fmain%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 2Fsrc%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 2FcfXML.awk&data=05%7C01%7Cbrutzman%<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2F40nps.edu%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996649960%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=4BNBFzXRFlC3neEIuVH0qqIAdSiW2gSZLBcxen%2BZ0Fo%3D&reserved=0" target="_blank">40nps.edu</a>%7Ccd2d5f56ffc<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 7496e3<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0%<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 7C6383<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 44642474548323%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAi<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > LCJQIj<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > oiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sd<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > ata=6X<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > xOQrg8Id5BdOwqnW52BBFwDkmMPwhgKsa2BLle6ms%3D&reserved=0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > It looks for the Concrete Nodes section, adds a field <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > parameter<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > to the<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > .XML() output function, adds the containerField attribute <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > to the<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > output, and adds the field parameter to the .XML() calls <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > for<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > metadata, SFNode and MFNode field processing.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > The awk script is very brittle since it relies on comments <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > in<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > x3d.py to find the appropriate lines to modify. The hardest <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > part<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > was to get the quoting and escaping correct.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > It generates containerField attributes for all SF/MFNode <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > fields<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > except 'children'. Of course, most are unnecessary but <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > filtering<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > systematically for defaults would probably require <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > involving<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > X3DUOM and the generation stylesheet, similar to other XML related 'fields'<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > such as style or class.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > The result is<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=https%253" target="_blank"><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=m-3752600496485697341msoplaintext>>>> > >> > > A%2F%2<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > <a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2Ffraw.githubusercontent.com%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996649960%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=iFL32%2F0st2d%2F%2Bnceewc0%2BCMYOJOLSbcuCHSaNqkuYB4%3D&reserved=0" target="_blank">Fraw.githubusercontent.com</a>%2Fandreasplesch%2Fx3d-python-mod<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > %2Fmai<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > n%2Fx3dcf.py&data=05%7C01%7Cbrutzman%<a href="https://nam10.safelinks.protection.outlook.com/?url=http%3A%2F%2F40nps.edu%2F&data=05%7C01%7Cbrutzman%40nps.edu%7C9f41ab9794284336382508dbde24943e%7C6d936231a51740ea9199f7578963378e%7C0%7C0%7C638348020996649960%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=4BNBFzXRFlC3neEIuVH0qqIAdSiW2gSZLBcxen%2BZ0Fo%3D&reserved=0" target="_blank">40nps.edu</a>%7Ccd2d5f56ff<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > c7496e<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 3e5b08dbdb11f7fb%7C6d936231a51740ea9199f7578963378e%7C0%7C0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > %7C638<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 344642474704621%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDA<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > iLCJQI<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > joiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&s<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > data=7<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 4nwRmIni6cSY%2FMdNtOH5VNh9l6%2FScsR4te6XOlwKug%3D&reserved=<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > 0<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > The modified python script appears to work as expected by <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > adding<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > the appropriate containerField attributes in XML output for <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > all<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > the examples I tried.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > Realistically, this is as far as I can go with this but I <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > think<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > it may show how containerField support in XML output could <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > be<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > provided with x3d.py.<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > > -Andreas<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > -------------- next part -------------- An HTML attachment <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > was<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > scrubbed...<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > URL:<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <<a href="http://web3d.org/pipermail/x3d-public_web3d.org/attachments/" target="_blank">http://web3d.org/pipermail/x3d-public_web3d.org/attachments/</a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 202311<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > 01/59b1f34d/attachment.html><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ------------------------------<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > Subject: Digest Footer<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > _______________________________________________<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > x3d-public mailing list<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <a href="mailto:x3d-public@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org" target="_blank"><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=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ------------------------------<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > End of x3d-public Digest, Vol 176, Issue 4<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> > ******************************************<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> --<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> Andreas Plesch<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > >> Waltham, MA 02453<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > --<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Andreas Plesch<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > Waltham, MA 02453<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > _______________________________________________<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > x3d-public mailing list<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > <a href="mailto:x3d-public@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> ><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> > <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org" target="_blank"><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=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> --<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Andreas Plesch<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> Waltham, MA 02453<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> _______________________________________________<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> x3d-public mailing list<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <a href="mailto:x3d-public@web3d.org" target="_blank"><span style='color:windowtext;text-decoration:none'>x3d-public@web3d.org</span></a><o:p></o:p></p><p class=m-3752600496485697341msoplaintext>>>> <a href="http://web3d.org/mailman/listinfo/x3d-public_web3d.org" target="_blank"><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=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext> <o:p></o:p></p><p class=m-3752600496485697341msoplaintext>--<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>Andreas Plesch<o:p></o:p></p><p class=m-3752600496485697341msoplaintext>Waltham, MA 02453<o:p></o:p></p></div></div></div></blockquote></div><p class=MsoNormal><br clear=all><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p class=MsoNormal><span class=gmailsignatureprefix>-- </span><o:p></o:p></p><div><div><div><p class=MsoNormal>Andreas Plesch<br>Waltham, MA 02453<o:p></o:p></p></div></div></div></div></div></div></body></html>