[x3d-public] JSweet translation of X3DJSAIL to JavaScript: need specific design goals first

John Carlson yottzumm at gmail.com
Thu Apr 9 17:56:09 PDT 2020


You should be able to run tsc.cmd to convert TypeScript to JavaScript, so
I'm not posting the JavaScript transpilation here.



On Thu, Apr 9, 2020 at 6:58 PM John Carlson <yottzumm at gmail.com> wrote:

> Typescript Transform (pt 2 of 2)
>
> /* Generated from Java with JSweet 2.3.0-SNAPSHOT - http://www.jsweet.org
> */
> namespace org.web3d.x3d.sai.Grouping {
>     /**
>      * Transform is a Grouping node that can contain most nodes.
>      *
>      * <br><br>
>      * <i>X3D node tooltip</i>: [X3DGroupingNode] Transform is a Grouping
> node that can contain most nodes. Transform translates, orients and scales
> child geometry within the local world coordinate system.
>      * <ul>
>      * <li> <i>Hint:</i> each transformation creates a new coordinate
> system relative to the parent coordinate system. </li>
>      * <li> <i>Hint:</i> +Y axis is the up direction. (Similarly some
> scenes may consider +X is North and +Z is East.) </li>
>      * <li> <i>Hint:</i> best authoring approach is to keep +Y axis
> pointing towards local up direction, supporting scene composability and
> effective navigation response (which is based on gravity direction). </li>
>      * <li> <i>Hint:</i> insert a Shape node before adding geometry or
> Appearance. </li>
>      * <li> <i>Hint:</i> translation/rotation/scaling field attributes can
> be defined in any order in the scene. The applied order of
> translation/rotation/scaling transformation-matrix operations remains
> consistent. </li>
>      * <li> <i>Hint:</i> authors can modify order of
> translation/rotation/scaling operations by splitting them into separate
> nested parent/child Transform nodes. </li>
>      * <li> <i>Warning:</i> Transform contained by CADFace can only hold a
> single LOD or Shape node. </li>
>      * <li> <i>Hint:</i> X3D Scene Authoring Hints, Coordinate Systems <a
> href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#CoordinateSystems"
> target="_blank">
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#CoordinateSystems</a>
> </li>
>      * <li> <i>Hint:</i> X3D Scene Authoring Hints, Scale Factors and Unit
> Conversions <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Scale"
> target="_blank">
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Scale</a>
> </li>
>      * <li> <i>Hint:</i>  apply containerField='shape' if parent node is
> CADFace. </li>
>      * </ul>
>      * <br>
>      * <i>Package hint:</i>  This interface is defined by the X3D Java
> Language Binding Specification for the Scene Authoring Interface (SAI).
>      * @author Don Brutzman and Roy Walmsley
>      * @see <a href="
> https://www.web3d.org/documents/specifications/19777-2/V3.3/Part2/concretes.html#Transform"
> target="_blank">SAI Java Specification: TODO</a>
>      * @see <a href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#Transform"
> target="blank">X3D Abstract Specification: Transform</a>
>      * @see <a href="
> https://www.web3d.org/x3d/tooltips/X3dTooltips.html#Transform"
> target="_blank">X3D Tooltips: Transform</a>
>      * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#CoordinateSystems"
> target="_blank">X3D Scene Authoring Hints: CoordinateSystems</a>
>      * @class
>      */
>     export interface Transform extends
> org.web3d.x3d.sai.Grouping.X3DGroupingNode {
>         /**
>          * Provide array of 3-tuple float results from initializeOnly
> SFVec3f field named <i>bboxCenter</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Bounding box center accompanies bboxSize and
> provides an optional hint for bounding box position offset from origin of
> local coordinate system.
>          * <ul>
>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
> information can speed up the initialization of large detailed models, with
> a corresponding cost of increased file size. </li>
>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
> href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
> </li>
>          * </ul>
>          * @return {Array} value of bboxCenter field
>          */
>         getBboxCenter() : number[];
>
>         /**
>          * Accessor method to assign 3-tuple float array to initializeOnly
> SFVec3f field named <i>bboxCenter</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Bounding box center accompanies bboxSize and
> provides an optional hint for bounding box position offset from origin of
> local coordinate system.
>          * <ul>
>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
> information can speed up the initialization of large detailed models, with
> a corresponding cost of increased file size. </li>
>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
> href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
> </li>
>          * </ul>
>          * @param {Array} newValue is new value for the bboxCenter field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setBboxCenter(newValue : number[]) : Transform;
>
>         /**
>          * Provide array of 3-tuple float results within allowed range of
> [0,infinity), or default value [-1 -1 -1], from initializeOnly SFVec3f
> field named <i>bboxSize</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Bounding box size is usually omitted, and can
> easily be calculated automatically by an X3D player at scene-loading time
> with minimal computational cost. Bounding box size can also be defined as
> an optional authoring hint that suggests an optimization or constraint.
>          * <ul>
>          * <li> <i>Hint:</i> can be useful for collision computations or
> inverse-kinematics (IK) engines. </li>
>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
> information can speed up the initialization of large detailed models, with
> a corresponding cost of increased file size. </li>
>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
> href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
> </li>
>          * </ul>
>          * @return {Array} value of bboxSize field
>          */
>         getBboxSize() : number[];
>
>         /**
>          * Accessor method to assign 3-tuple float array to initializeOnly
> SFVec3f field named <i>bboxSize</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Bounding box size is usually omitted, and can
> easily be calculated automatically by an X3D player at scene-loading time
> with minimal computational cost. Bounding box size can also be defined as
> an optional authoring hint that suggests an optimization or constraint.
>          * <ul>
>          * <li> <i>Hint:</i> can be useful for collision computations or
> inverse-kinematics (IK) engines. </li>
>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
> information can speed up the initialization of large detailed models, with
> a corresponding cost of increased file size. </li>
>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
> href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
> </li>
>          * </ul>
>          * @param {Array} newValue is new value for the bboxSize field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setBboxSize(newValue : number[]) : Transform;
>
>         /**
>          * Provide array of 3-tuple float results from inputOutput SFVec3f
> field named <i>center</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Translation offset from origin of local
> coordinate system, applied prior to rotation or scaling.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of center field
>          */
>         getCenter() : number[];
>
>         /**
>          * Accessor method to assign 3-tuple float array to inputOutput
> SFVec3f field named <i>center</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Translation offset from origin of local
> coordinate system, applied prior to rotation or scaling.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @param {Array} newValue is new value for the center field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setCenter(newValue : number[]) : Transform;
>
>         /**
>          * Provide array of X3DNode results (using an array consisting of
> properly typed nodes or ProtoInstanceObjects) from inputOutput MFNode field
> <i>children</i>.
>          * <br><br>
>          * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an
> ordered list of children nodes.
>          * <ul>
>          * <li> <i>Hint:</i> Each grouping node defines a coordinate space
> for its children, relative to the coordinate space of its parent node. Thus
> transformations accumulate down the scene graph hierarchy. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode addChildren field can append
> new X3DChildNode nodes via a ROUTE connection, duplicate input nodes (i.e.
> matching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
> remove nodes from the children list, unrecognized input nodes (i.e.
> nonmatching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and
> children node types, <a href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
> </li>
>          * </ul>
>          * <br><br>
>          * <i>Warning:</i> according to X3D Unified Object Model (X3DUOM),
> acceptable node types are limited to X3DChildNode.
>          * @see org.web3d.x3d.sai.Core.X3DChildNode
>          * @return {Array} value of children field
>          */
>         getChildren() : org.web3d.x3d.sai.Core.X3DNode[];
>
>         /**
>          * Accessor method to assign X3DNode array (using an array
> consisting of properly typed nodes or ProtoInstanceObjects) to inputOutput
> MFNode field <i>children</i>.
>          * <br><br>
>          * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an
> ordered list of children nodes.
>          * <ul>
>          * <li> <i>Hint:</i> Each grouping node defines a coordinate space
> for its children, relative to the coordinate space of its parent node. Thus
> transformations accumulate down the scene graph hierarchy. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode addChildren field can append
> new X3DChildNode nodes via a ROUTE connection, duplicate input nodes (i.e.
> matching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
> remove nodes from the children list, unrecognized input nodes (i.e.
> nonmatching DEF, USE values) are ignored. </li>
>          * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and
> children node types, <a href="
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
> target="_blank">
> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
> </li>
>          * </ul>
>          * <br><br>
>          * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
> acceptable node types are limited to X3DChildNode.
>          * @param {Array} newValue is new value for the children field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setChildren(newValue? : any) : any;
>
>         /**
>          * Add array of children nodes to array of existing nodes (if any).
>          * <br><br>
>          * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
> acceptable node types are limited to X3DChildNode.
>          * @param {Array} newValue is new value array to be appended the
> children field.
>          */
>         addChildren(newValue : org.web3d.x3d.sai.Core.X3DNode[]);
>
>         /**
>          * Provide X3DMetadataObject instance (using a properly typed
> node) from inputOutput SFNode field <i>metadata</i>.
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>          * @return {*} value of metadata field
>          */
>         getMetadata() : org.web3d.x3d.sai.Core.X3DMetadataObject;
>
>         /**
>          * Accessor method to assign X3DMetadataObject instance (using a
> properly typed node) to inputOutput SFNode field <i>metadata</i>.
>          * @see <a href="
> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>          * @param {*} newValue is new value for the metadata field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setMetadata(newValue : org.web3d.x3d.sai.Core.X3DMetadataObject) :
> Transform;
>
>         /**
>          * Provide array of 4-tuple float results unit axis, angle (in
> radians) from inputOutput SFRotation field named <i>rotation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Orientation (axis, angle in radians) of
> children relative to local coordinate system.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of rotation field
>          */
>         getRotation() : number[];
>
>         /**
>          * Accessor method to assign 4-tuple float array unit axis, angle
> (in radians) to inputOutput SFRotation field named <i>rotation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Orientation (axis, angle in radians) of
> children relative to local coordinate system.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @param {Array} newValue is new value for the rotation field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setRotation(newValue : number[]) : Transform;
>
>         /**
>          * Provide array of 3-tuple float results from inputOutput SFVec3f
> field named <i>scale</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Non-uniform x-y-z scale of child coordinate
> system, adjusted by center and scaleOrientation.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of scale field
>          */
>         getScale() : number[];
>
>         /**
>          * Accessor method to assign 3-tuple float array to inputOutput
> SFVec3f field named <i>scale</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Non-uniform x-y-z scale of child coordinate
> system, adjusted by center and scaleOrientation.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @param {Array} newValue is new value for the scale field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setScale(newValue : number[]) : Transform;
>
>         /**
>          * Provide array of 4-tuple float results unit axis, angle (in
> radians) from inputOutput SFRotation field named <i>scaleOrientation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Preliminary rotation of coordinate system
> before scaling (to allow scaling around arbitrary orientations).
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of scaleOrientation field
>          */
>         getScaleOrientation() : number[];
>
>         /**
>          * Accessor method to assign 4-tuple float array unit axis, angle
> (in radians) to inputOutput SFRotation field named <i>scaleOrientation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Preliminary rotation of coordinate system
> before scaling (to allow scaling around arbitrary orientations).
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @param {Array} newValue is new value for the scaleOrientation
> field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setScaleOrientation(newValue : number[]) : Transform;
>
>         /**
>          * Provide array of 3-tuple float results from inputOutput SFVec3f
> field named <i>translation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Position (x, y, z in meters) of children
> relative to local coordinate system.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @return {Array} value of translation field
>          */
>         getTranslation() : number[];
>
>         /**
>          * Accessor method to assign 3-tuple float array to inputOutput
> SFVec3f field named <i>translation</i>.
>          * <br><br>
>          * <i>Tooltip:</i> Position (x, y, z in meters) of children
> relative to local coordinate system.
>          * <ul>
>          * <li> <i> Hint:</i>  The order of operation is first apply the
> center offset, then scaleOrientation and scale, then rotation, then restore
> the center offset, then translation. </li>
>          * </ul>
>          * @param {Array} newValue is new value for the translation field.
>          * @return {*} {@link Transform} - namely <i>this</i> same object
> to allow sequential method pipelining (i.e. consecutive method invocations
> on the same object).
>          */
>         setTranslation(newValue : number[]) : Transform;
>     }
> }
>
>
> On Thu, Apr 9, 2020 at 6:57 PM John Carlson <yottzumm at gmail.com> wrote:
>
>> Typescript Transform (part 1 of 2)
>>
>> /* Generated from Java with JSweet 2.3.0-SNAPSHOT - http://www.jsweet.org
>> */
>> namespace org.web3d.x3d.jsail.Grouping {
>>     /**
>>      * Utility constructor that assigns DEF label after initializing
>> member variables with default values.
>>      * @param {string} DEFlabel unique DEF name for this X3D node
>>      * @class
>>      * @extends org.web3d.x3d.jsail.X3DConcreteNode
>>      * @author Don Brutzman and Roy Walmsley
>>      */
>>     export class TransformObject extends
>> org.web3d.x3d.jsail.X3DConcreteNode implements
>> org.web3d.x3d.sai.Grouping.Transform {
>>         /*private*/ bboxCenter : number[];
>>
>>         /*private*/ bboxSize : number[];
>>
>>         /*private*/ center : number[];
>>
>>         /*private*/ children :
>> java.util.ArrayList<org.web3d.x3d.sai.Core.X3DNode>;
>>
>>         /*private*/ IS : org.web3d.x3d.jsail.Core.ISObject;
>>
>>         /*private*/ metadata : org.web3d.x3d.sai.Core.X3DMetadataObject;
>>
>>         /*private*/ metadataProtoInstance :
>> org.web3d.x3d.jsail.Core.ProtoInstanceObject;
>>
>>         /*private*/ rotation : number[];
>>
>>         /*private*/ scale : number[];
>>
>>         /*private*/ scaleOrientation : number[];
>>
>>         /*private*/ translation : number[];
>>
>>         /**
>>          * String constant <i>NAME</i> provides name of this element:
>> <i>Transform</i>.
>>          */
>>         public static NAME : string = "Transform";
>>
>>         /**
>>          * Provides name of this element: <i>Transform</i>
>>          * @return {string} name of this element
>>          */
>>         public getElementName() : string {
>>             return TransformObject.NAME;
>>         }
>>
>>         /**
>>          * String constant <i>COMPONENT</i> defines X3D component for the
>> <i>Transform</i> element: <i>Grouping</i>
>>          */
>>         public static COMPONENT : string = "Grouping";
>>
>>         /**
>>          * Defines X3D component for the <i>Transform</i> element:
>> <i>Grouping</i>
>>          * @return {string} X3D component for this element
>>          */
>>         public getComponent() : string {
>>             return TransformObject.COMPONENT;
>>         }
>>
>>         /**
>>          * Integer constant <i>LEVEL</i> provides default X3D
>> <i>Grouping</i> component level for this element: <i>1</i>
>>          */
>>         public static LEVEL : number = 1;
>>
>>         /**
>>          * Provides default X3D component level for this element: <i>1</i>
>>          * @return {number} default X3D component level for this element
>>          */
>>         public getComponentLevel() : number {
>>             return TransformObject.LEVEL;
>>         }
>>
>>         /**
>>          * SFVec3f field named <i>bboxCenter</i> has default value
>> <i>{0f,0f,0f}</i> (Java syntax) or <i>0 0 0</i> (XML syntax).
>>          */
>>         public static BBOXCENTER_DEFAULT_VALUE : number[]; public static
>> BBOXCENTER_DEFAULT_VALUE_$LI$() : number[] {
>> if(TransformObject.BBOXCENTER_DEFAULT_VALUE == null)
>> TransformObject.BBOXCENTER_DEFAULT_VALUE = [0.0, 0.0, 0.0]; return
>> TransformObject.BBOXCENTER_DEFAULT_VALUE; };
>>
>>         /**
>>          * SFVec3f field named <i>bboxSize</i> has default value
>> <i>{-1f,-1f,-1f}</i> (Java syntax) or <i>-1 -1 -1</i> (XML syntax).
>>          */
>>         public static BBOXSIZE_DEFAULT_VALUE : number[]; public static
>> BBOXSIZE_DEFAULT_VALUE_$LI$() : number[] {
>> if(TransformObject.BBOXSIZE_DEFAULT_VALUE == null)
>> TransformObject.BBOXSIZE_DEFAULT_VALUE = [-1.0, -1.0, -1.0]; return
>> TransformObject.BBOXSIZE_DEFAULT_VALUE; };
>>
>>         /**
>>          * SFVec3f field named <i>center</i> has default value
>> <i>{0f,0f,0f}</i> (Java syntax) or <i>0 0 0</i> (XML syntax).
>>          */
>>         public static CENTER_DEFAULT_VALUE : number[]; public static
>> CENTER_DEFAULT_VALUE_$LI$() : number[] {
>> if(TransformObject.CENTER_DEFAULT_VALUE == null)
>> TransformObject.CENTER_DEFAULT_VALUE = [0.0, 0.0, 0.0]; return
>> TransformObject.CENTER_DEFAULT_VALUE; };
>>
>>         /**
>>          * SFNode field named <i>IS</i> has default value <i>null</i>
>> (Java syntax) or <i>NULL</i> (XML syntax).
>>          */
>>         public static IS_DEFAULT_VALUE :
>> org.web3d.x3d.jsail.Core.ISObject = null;
>>
>>         /**
>>          * SFNode field named <i>metadata</i> has default value
>> <i>null</i> (Java syntax) or <i>NULL</i> (XML syntax).
>>          */
>>         public static METADATA_DEFAULT_VALUE :
>> org.web3d.x3d.sai.Core.X3DMetadataObject = null;
>>
>>         /**
>>          * SFRotation field named <i>rotation</i> has default value
>> <i>{0f,0f,1f,0f}</i> (Java syntax) or <i>0 0 1 0</i> (XML syntax).
>>          */
>>         public static ROTATION_DEFAULT_VALUE : number[]; public static
>> ROTATION_DEFAULT_VALUE_$LI$() : number[] {
>> if(TransformObject.ROTATION_DEFAULT_VALUE == null)
>> TransformObject.ROTATION_DEFAULT_VALUE = [0.0, 0.0, 1.0, 0.0]; return
>> TransformObject.ROTATION_DEFAULT_VALUE; };
>>
>>         /**
>>          * SFVec3f field named <i>scale</i> has default value
>> <i>{1f,1f,1f}</i> (Java syntax) or <i>1 1 1</i> (XML syntax).
>>          */
>>         public static SCALE_DEFAULT_VALUE : number[]; public static
>> SCALE_DEFAULT_VALUE_$LI$() : number[] {
>> if(TransformObject.SCALE_DEFAULT_VALUE == null)
>> TransformObject.SCALE_DEFAULT_VALUE = [1.0, 1.0, 1.0]; return
>> TransformObject.SCALE_DEFAULT_VALUE; };
>>
>>         /**
>>          * SFRotation field named <i>scaleOrientation</i> has default
>> value <i>{0f,0f,1f,0f}</i> (Java syntax) or <i>0 0 1 0</i> (XML syntax).
>>          */
>>         public static SCALEORIENTATION_DEFAULT_VALUE : number[]; public
>> static SCALEORIENTATION_DEFAULT_VALUE_$LI$() : number[] {
>> if(TransformObject.SCALEORIENTATION_DEFAULT_VALUE == null)
>> TransformObject.SCALEORIENTATION_DEFAULT_VALUE = [0.0, 0.0, 1.0, 0.0];
>> return TransformObject.SCALEORIENTATION_DEFAULT_VALUE; };
>>
>>         /**
>>          * SFVec3f field named <i>translation</i> has default value
>> <i>{0f,0f,0f}</i> (Java syntax) or <i>0 0 0</i> (XML syntax).
>>          */
>>         public static TRANSLATION_DEFAULT_VALUE : number[]; public static
>> TRANSLATION_DEFAULT_VALUE_$LI$() : number[] {
>> if(TransformObject.TRANSLATION_DEFAULT_VALUE == null)
>> TransformObject.TRANSLATION_DEFAULT_VALUE = [0.0, 0.0, 0.0]; return
>> TransformObject.TRANSLATION_DEFAULT_VALUE; };
>>
>>         /**
>>          * Indicate type corresponding to given fieldName.
>>          * @param {string} fieldName name of field in this X3D node
>>          * @see ConfigurationProperties#ERROR_UNKNOWN_FIELD_TYPE
>>          * @return {string} X3D type (SFvec3f etc.), otherwise
>> ConfigurationProperties.ERROR_UNKNOWN_FIELD_TYPE if not recognized
>>          */
>>         public getFieldType(fieldName : string) : string {
>>             let result : string;
>>             switch((fieldName)) {
>>             case "containerField":
>>                 result = "SFString";
>>                 break;
>>             case "addChildren":
>>                 result = "MFNode";
>>                 break;
>>             case "bboxCenter":
>>                 result = "SFVec3f";
>>                 break;
>>             case "bboxSize":
>>                 result = "SFVec3f";
>>                 break;
>>             case "center":
>>                 result = "SFVec3f";
>>                 break;
>>             case "children":
>>                 result = "MFNode";
>>                 break;
>>             case "IS":
>>                 result = "SFNode";
>>                 break;
>>             case "metadata":
>>                 result = "SFNode";
>>                 break;
>>             case "removeChildren":
>>                 result = "MFNode";
>>                 break;
>>             case "rotation":
>>                 result = "SFRotation";
>>                 break;
>>             case "scale":
>>                 result = "SFVec3f";
>>                 break;
>>             case "scaleOrientation":
>>                 result = "SFRotation";
>>                 break;
>>             case "translation":
>>                 result = "SFVec3f";
>>                 break;
>>             case "DEF":
>>                 result = "SFString";
>>                 break;
>>             case "USE":
>>                 result = "SFString";
>>                 break;
>>             case "class":
>>                 result = "SFString";
>>                 break;
>>             default:
>>                 {
>>                     if(/* startsWith */((str, searchString, position = 0)
>> => str.substr(position, searchString.length) ===
>> searchString)(fieldName.trim(), "set_")) result =
>> this.getFieldType(fieldName.trim().substring(4)); else if(/* endsWith
>> */((str, searchString) => { let pos = str.length - searchString.length; let
>> lastIndex = str.indexOf(searchString, pos); return lastIndex !== -1 &&
>> lastIndex === pos; })(fieldName.trim(), "_changed")) result =
>> this.getFieldType(fieldName.trim().substring(0, fieldName.length - 8));
>> else result =
>> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_UNKNOWN_FIELD_TYPE;
>>                 };
>>             }
>>             return result;
>>         }
>>
>>         /**
>>          * Indicate accessType corresponding to given fieldName.
>>          * @param {string} fieldName name of field in this X3D node
>>          * @see ConfigurationProperties#ERROR_UNKNOWN_FIELD_ACCESSTYPE
>>          * @return {string} X3D accessType (inputOnly etc.), otherwise
>> ConfigurationProperties.ERROR_UNKNOWN_FIELD_ACCESSTYPE if not recognized
>>          */
>>         public getAccessType(fieldName : string) : string {
>>             let result : string;
>>             switch((fieldName)) {
>>             case "addChildren":
>>                 result = "inputOnly";
>>                 break;
>>             case "bboxCenter":
>>                 result = "initializeOnly";
>>                 break;
>>             case "bboxSize":
>>                 result = "initializeOnly";
>>                 break;
>>             case "center":
>>                 result = "inputOutput";
>>                 break;
>>             case "children":
>>                 result = "inputOutput";
>>                 break;
>>             case "IS":
>>                 result = "inputOutput";
>>                 break;
>>             case "metadata":
>>                 result = "inputOutput";
>>                 break;
>>             case "removeChildren":
>>                 result = "inputOnly";
>>                 break;
>>             case "rotation":
>>                 result = "inputOutput";
>>                 break;
>>             case "scale":
>>                 result = "inputOutput";
>>                 break;
>>             case "scaleOrientation":
>>                 result = "inputOutput";
>>                 break;
>>             case "translation":
>>                 result = "inputOutput";
>>                 break;
>>             case "DEF":
>>                 result = "inputOutput";
>>                 break;
>>             case "USE":
>>                 result = "inputOutput";
>>                 break;
>>             case "class":
>>                 result = "inputOutput";
>>                 break;
>>             default:
>>                 {
>>                     if(/* startsWith */((str, searchString, position = 0)
>> => str.substr(position, searchString.length) ===
>> searchString)(fieldName.trim(), "set_")) result =
>> this.getAccessType(fieldName.trim().substring(4)); else if(/* endsWith
>> */((str, searchString) => { let pos = str.length - searchString.length; let
>> lastIndex = str.indexOf(searchString, pos); return lastIndex !== -1 &&
>> lastIndex === pos; })(fieldName.trim(), "_changed")) result =
>> this.getAccessType(fieldName.trim().substring(0, fieldName.length - 8));
>> else result =
>> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_UNKNOWN_FIELD_ACCESSTYPE;
>>                 };
>>             }
>>             return result;
>>         }
>>
>>         /**
>>          * containerField describes typical field relationship of a node
>> to its parent.
>>          * Usage is not ordinarily needed when using this API, default
>> value is provided for informational purposes.
>>          * @see <a href="
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#containerField">X3D
>> Scene Authoring Hints: containerField</a>
>>          * @see <a href="https://www.web3d.org/specifications/X3DUOM.html">X3D
>> Unified Object Model (X3DUOM)</a>
>>          */
>>         public static containerField_DEFAULT_VALUE : string = "children";
>>
>>         /**
>>          * containerField describes typical field relationship of a node
>> to its parent.
>>          * Usage is not ordinarily needed when using this API, default
>> value is provided for informational purposes.
>>          * @see <a href="
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#containerField">X3D
>> Scene Authoring Hints: containerField</a>
>>          * @see <a href="https://www.web3d.org/specifications/X3DUOM.html">X3D
>> Unified Object Model (X3DUOM)</a>
>>          * @return {string} default containerField value
>>          */
>>         public getContainerFieldDefault() : string {
>>             return TransformObject.containerField_DEFAULT_VALUE;
>>         }
>>
>>         /**
>>          * toField ROUTE name for MFNode field named <i>addChildren</i>.
>>          */
>>         public static toField_ADDCHILDREN : string = "addChildren";
>>
>>         /**
>>          * fromField ROUTE name for SFVec3f field named <i>center</i>.
>>          */
>>         public static fromField_CENTER : string = "center";
>>
>>         /**
>>          * toField ROUTE name for SFVec3f field named <i>center</i>.
>>          */
>>         public static toField_CENTER : string = "center";
>>
>>         /**
>>          * fromField ROUTE name for MFNode field named <i>children</i>.
>>          */
>>         public static fromField_CHILDREN : string = "children";
>>
>>         /**
>>          * toField ROUTE name for MFNode field named <i>children</i>.
>>          */
>>         public static toField_CHILDREN : string = "children";
>>
>>         /**
>>          * fromField ROUTE name for SFNode field named <i>IS</i>.
>>          */
>>         public static fromField_IS : string = "IS";
>>
>>         /**
>>          * fromField ROUTE name for SFNode field named <i>metadata</i>.
>>          */
>>         public static fromField_METADATA : string = "metadata";
>>
>>         /**
>>          * toField ROUTE name for SFNode field named <i>metadata</i>.
>>          */
>>         public static toField_METADATA : string = "metadata";
>>
>>         /**
>>          * toField ROUTE name for MFNode field named
>> <i>removeChildren</i>.
>>          */
>>         public static toField_REMOVECHILDREN : string = "removeChildren";
>>
>>         /**
>>          * fromField ROUTE name for SFRotation field named
>> <i>rotation</i>.
>>          */
>>         public static fromField_ROTATION : string = "rotation";
>>
>>         /**
>>          * toField ROUTE name for SFRotation field named <i>rotation</i>.
>>          */
>>         public static toField_ROTATION : string = "rotation";
>>
>>         /**
>>          * fromField ROUTE name for SFVec3f field named <i>scale</i>.
>>          */
>>         public static fromField_SCALE : string = "scale";
>>
>>         /**
>>          * toField ROUTE name for SFVec3f field named <i>scale</i>.
>>          */
>>         public static toField_SCALE : string = "scale";
>>
>>         /**
>>          * fromField ROUTE name for SFRotation field named
>> <i>scaleOrientation</i>.
>>          */
>>         public static fromField_SCALEORIENTATION : string =
>> "scaleOrientation";
>>
>>         /**
>>          * toField ROUTE name for SFRotation field named
>> <i>scaleOrientation</i>.
>>          */
>>         public static toField_SCALEORIENTATION : string =
>> "scaleOrientation";
>>
>>         /**
>>          * fromField ROUTE name for SFVec3f field named
>> <i>translation</i>.
>>          */
>>         public static fromField_TRANSLATION : string = "translation";
>>
>>         /**
>>          * toField ROUTE name for SFVec3f field named <i>translation</i>.
>>          */
>>         public static toField_TRANSLATION : string = "translation";
>>
>>         /**
>>          * Initialize all member variables to default values.
>>          */
>>         public initialize() {
>>             super.initialize();
>>             this.setContainerFieldOverride("");
>>             this.containerField_ALTERNATE_VALUES = ["children", "proxy",
>> "shape"];
>>             this.bboxCenter =
>> TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$();
>>             this.bboxSize = TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$();
>>             this.center = TransformObject.CENTER_DEFAULT_VALUE_$LI$();
>>             this.children = <any>(new java.util.ArrayList<any>());
>>             this.IS = null;
>>             this.metadata = null;
>>             this.metadataProtoInstance = null;
>>             this.rotation = TransformObject.ROTATION_DEFAULT_VALUE_$LI$();
>>             this.scale = TransformObject.SCALE_DEFAULT_VALUE_$LI$();
>>             this.scaleOrientation =
>> TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$();
>>             this.translation =
>> TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$();
>>         }
>>
>>         /**
>>          * Provide array of 3-tuple float results from initializeOnly
>> SFVec3f field named <i>bboxCenter</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> Bounding box center accompanies bboxSize and
>> provides an optional hint for bounding box position offset from origin of
>> local coordinate system.
>>          * <ul>
>>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
>> information can speed up the initialization of large detailed models, with
>> a corresponding cost of increased file size. </li>
>>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
>> href="
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
>> target="_blank">
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
>> </li>
>>          * </ul>
>>          * @return {Array} value of bboxCenter field
>>          */
>>         public getBboxCenter() : number[] {
>>             return this.bboxCenter;
>>         }
>>
>>         public setBboxCenter$float_A(newValue : number[]) :
>> TransformObject {
>>             if(newValue == null) newValue = [];
>>             if(newValue.length !== 3) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform bboxCenter
>> newValue=" + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) +
>> " has length=" + newValue.length + " instead of required length 3");
>>             }
>>             this.bboxCenter = newValue;
>>             return this;
>>         }
>>
>>         public
>> setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue :
>> org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>>             this.setBboxCenter$float_A(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public setBboxCenter$float$float$float(x : number, y : number, z
>> : number) : TransformObject {
>>             this.setBboxCenter$float_A([x, y, z]);
>>             return this;
>>         }
>>
>>         /**
>>          * Assign values to SFVec3f bboxCenter field, similar to {@link
>> #setBboxCenter(float[])}.
>>          *
>>          * @param {number} x first component
>>          * @param {number} y second component
>>          * @param {number} z third component
>>          *
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setBboxCenter(x? : any, y? : any, z? : any) : any {
>>             if(((typeof x === 'number') || x === null) && ((typeof y ===
>> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setBboxCenter$float$float$float(x, y, z);
>>             } else if(((typeof x === 'number') || x === null) && ((typeof
>> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setBboxCenter$double$double$double(x, y,
>> z);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setBboxCenter$float_A(x);
>>             } else if(((x != null && x instanceof
>> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
>> undefined && z === undefined) {
>>                 return
>> <any>this.setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setBboxCenter$double_A(x);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setBboxCenter$double$double$double(x : number, y : number,
>> z : number) : TransformObject {
>>             return
>> this.setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>>         }
>>
>>         public setBboxCenter$double_A(newArray : number[]) :
>> TransformObject {
>>             return
>> this.setBboxCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>>         }
>>
>>         /**
>>          * Provide array of 3-tuple float results within allowed range of
>> [0,infinity), or default value [-1 -1 -1], from initializeOnly SFVec3f
>> field named <i>bboxSize</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> Bounding box size is usually omitted, and can
>> easily be calculated automatically by an X3D player at scene-loading time
>> with minimal computational cost. Bounding box size can also be defined as
>> an optional authoring hint that suggests an optimization or constraint.
>>          * <ul>
>>          * <li> <i>Hint:</i> can be useful for collision computations or
>> inverse-kinematics (IK) engines. </li>
>>          * <li> <i>Hint:</i> precomputation and inclusion of bounding box
>> information can speed up the initialization of large detailed models, with
>> a corresponding cost of increased file size. </li>
>>          * <li> <i>Hint:</i>  X3D Architecture, 10.2.2 Bounding boxes <a
>> href="
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes"
>> target="_blank">
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#BoundingBoxes</a>
>> </li>
>>          * </ul>
>>          * @return {Array} value of bboxSize field
>>          */
>>         public getBboxSize() : number[] {
>>             return this.bboxSize;
>>         }
>>
>>         public setBboxSize$float_A(newValue : number[]) : TransformObject
>> {
>>             if(newValue == null) newValue = [];
>>             if(newValue.length !== 3) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform bboxSize newValue="
>> + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
>> length=" + newValue.length + " instead of required length 3");
>>             }
>>             if(((newValue[0] < 0) || (newValue[1] < 0) || (newValue[2] <
>> 0)) && !((newValue[0] === -1) && (newValue[1] === -1) && (newValue[2] ===
>> -1))) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform bboxSize newValue="
>> + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
>> negative value but is not equal to sentinel {-1,-1,-1} value.");
>>             }
>>             this.bboxSize = newValue;
>>             return this;
>>         }
>>
>>         public
>> setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue :
>> org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>>             this.setBboxSize$float_A(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public setBboxSize$float$float$float(x : number, y : number, z :
>> number) : TransformObject {
>>             this.setBboxSize$float_A([x, y, z]);
>>             return this;
>>         }
>>
>>         /**
>>          * Assign values to SFVec3f bboxSize field, similar to {@link
>> #setBboxSize(float[])}.
>>          *
>>          * @param {number} x first component
>>          * @param {number} y second component
>>          * @param {number} z third component
>>          *
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setBboxSize(x? : any, y? : any, z? : any) : any {
>>             if(((typeof x === 'number') || x === null) && ((typeof y ===
>> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setBboxSize$float$float$float(x, y, z);
>>             } else if(((typeof x === 'number') || x === null) && ((typeof
>> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setBboxSize$double$double$double(x, y,
>> z);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setBboxSize$float_A(x);
>>             } else if(((x != null && x instanceof
>> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
>> undefined && z === undefined) {
>>                 return
>> <any>this.setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setBboxSize$double_A(x);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setBboxSize$double$double$double(x : number, y : number, z
>> : number) : TransformObject {
>>             return
>> this.setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>>         }
>>
>>         public setBboxSize$double_A(newArray : number[]) :
>> TransformObject {
>>             return
>> this.setBboxSize$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>>         }
>>
>>         /**
>>          * Provide array of 3-tuple float results from inputOutput
>> SFVec3f field named <i>center</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> Translation offset from origin of local
>> coordinate system, applied prior to rotation or scaling.
>>          * <ul>
>>          * <li> <i> Hint:</i>  The order of operation is first apply the
>> center offset, then scaleOrientation and scale, then rotation, then restore
>> the center offset, then translation. </li>
>>          * </ul>
>>          * @return {Array} value of center field
>>          */
>>         public getCenter() : number[] {
>>             return this.center;
>>         }
>>
>>         public setCenter$float_A(newValue : number[]) : TransformObject {
>>             if(newValue == null) newValue = [];
>>             if(newValue.length !== 3) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform center newValue=" +
>> org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
>> length=" + newValue.length + " instead of required length 3");
>>             }
>>             this.center = newValue;
>>             return this;
>>         }
>>
>>         public
>> setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue :
>> org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>>             this.setCenter$float_A(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public setCenter$float$float$float(x : number, y : number, z :
>> number) : TransformObject {
>>             this.setCenter$float_A([x, y, z]);
>>             return this;
>>         }
>>
>>         /**
>>          * Assign values to SFVec3f center field, similar to {@link
>> #setCenter(float[])}.
>>          *
>>          * @param {number} x first component
>>          * @param {number} y second component
>>          * @param {number} z third component
>>          *
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setCenter(x? : any, y? : any, z? : any) : any {
>>             if(((typeof x === 'number') || x === null) && ((typeof y ===
>> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setCenter$float$float$float(x, y, z);
>>             } else if(((typeof x === 'number') || x === null) && ((typeof
>> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setCenter$double$double$double(x, y, z);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setCenter$float_A(x);
>>             } else if(((x != null && x instanceof
>> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
>> undefined && z === undefined) {
>>                 return
>> <any>this.setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setCenter$double_A(x);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setCenter$double$double$double(x : number, y : number, z :
>> number) : TransformObject {
>>             return
>> this.setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>>         }
>>
>>         public setCenter$double_A(newArray : number[]) : TransformObject {
>>             return
>> this.setCenter$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>>         }
>>
>>         /**
>>          * Provide array of X3DChildNode results (using an array
>> consisting of properly typed nodes or ProtoInstanceObjects) from
>> inputOutput MFNode field <i>children</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an
>> ordered list of children nodes.
>>          * <ul>
>>          * <li> <i>Hint:</i> Each grouping node defines a coordinate
>> space for its children, relative to the coordinate space of its parent
>> node. Thus transformations accumulate down the scene graph hierarchy. </li>
>>          * <li> <i>Hint:</i> inputOnly MFNode addChildren field can
>> append new X3DChildNode nodes via a ROUTE connection, duplicate input nodes
>> (i.e. matching DEF, USE values) are ignored. </li>
>>          * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
>> remove nodes from the children list, unrecognized input nodes (i.e.
>> nonmatching DEF, USE values) are ignored. </li>
>>          * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and
>> children node types, <a href="
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
>> target="_blank">
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
>> </li>
>>          * </ul>
>>          * <br><br>
>>          * <i>Warning:</i> according to X3D Unified Object Model
>> (X3DUOM), acceptable node types are limited to X3DChildNode.
>>          * @see org.web3d.x3d.sai.Core.X3DChildNode
>>          * @return {Array} value of children field
>>          */
>>         public getChildren() : org.web3d.x3d.sai.Core.X3DNode[] {
>>             let valuesArray : org.web3d.x3d.sai.Core.X3DNode[] = (s => {
>> let a=[]; while(s-->0) a.push(null); return a; })(this.children.size());
>>             let i : number = 0;
>>             for(let
>> index3676=this.children.iterator();index3676.hasNext();) {
>>                 let arrayElement = index3676.next();
>>                 {
>>                     valuesArray[i++] = arrayElement;
>>                 }
>>             }
>>             return valuesArray;
>>         }
>>
>>         /**
>>          * Utility method to get ArrayList value of MFNode children
>> field, similar to {@link #getChildren()}.
>>          * @return {java.util.ArrayList} value of children field
>>          */
>>         public getChildrenList() :
>> java.util.ArrayList<org.web3d.x3d.sai.Core.X3DNode> {
>>             return this.children;
>>         }
>>
>>         public setChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue :
>> org.web3d.x3d.sai.Core.X3DNode[]) : TransformObject {
>>             if(newValue == null) {
>>                 this.clearChildren();
>>                 return this;
>>             }
>>             this.clearChildren();
>>             for(let i : number = 0; i < newValue.length; i++) {{
>>                 if((newValue[i] != null && (newValue[i]["__interfaces"]
>> != null &&
>> newValue[i]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
>> || newValue[i].constructor != null &&
>> newValue[i].constructor["__interfaces"] != null &&
>> newValue[i].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0)) || (newValue[i] != null && newValue[i] instanceof
>> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)) {
>>                     this.children.add(newValue[i]);
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue[i]).setParentObject(this);
>>                 } else throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("X3DNode[] newValue[" + i + "]
>> is not instanceof X3DNode or ProtoInstanceObject; array newValue=" +
>> java.util.Arrays.toString(newValue));
>>             };}
>>             return this;
>>         }
>>
>>         /**
>>          * Accessor method to assign X3DChildNode array (using an array
>> consisting of properly typed nodes or ProtoInstanceObjects) to inputOutput
>> MFNode field <i>children</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> [X3DChildNode] Grouping nodes contain an
>> ordered list of children nodes.
>>          * <ul>
>>          * <li> <i>Hint:</i> Each grouping node defines a coordinate
>> space for its children, relative to the coordinate space of its parent
>> node. Thus transformations accumulate down the scene graph hierarchy. </li>
>>          * <li> <i>Hint:</i> inputOnly MFNode addChildren field can
>> append new X3DChildNode nodes via a ROUTE connection, duplicate input nodes
>> (i.e. matching DEF, USE values) are ignored. </li>
>>          * <li> <i>Hint:</i> inputOnly MFNode removeChildren field can
>> remove nodes from the children list, unrecognized input nodes (i.e.
>> nonmatching DEF, USE values) are ignored. </li>
>>          * <li> <i>Hint:</i>  X3D Architecture 10.2.1 Grouping and
>> children node types, <a href="
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes"
>> target="_blank">
>> https://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/group.html#GroupingAndChildrenNodes</a>
>> </li>
>>          * </ul>
>>          * <br><br>
>>          * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
>> acceptable node types are limited to X3DChildNode.
>>          * @param {Array} newValue is new value for the children field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setChildren(newValue? : any) : any {
>>             if(((newValue != null && newValue instanceof <any>Array &&
>> (newValue.length==0 || newValue[0] == null ||(newValue[0] != null &&
>> (newValue[0]["__interfaces"] != null &&
>> newValue[0]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
>> || newValue[0].constructor != null &&
>> newValue[0].constructor["__interfaces"] != null &&
>> newValue[0].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0)))) || newValue === null)) {
>>                 return
>> <any>this.setChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue);
>>             } else if(((newValue != null && newValue instanceof
>> <any>java.util.ArrayList) || newValue === null)) {
>>                 return
>> <any>this.setChildren$java_util_ArrayList(newValue);
>>             } else if(((newValue != null && (newValue["__interfaces"] !=
>> null && newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0 || newValue.constructor != null &&
>> newValue.constructor["__interfaces"] != null &&
>> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0)) || newValue === null)) {
>>                 return
>> <any>this.setChildren$org_web3d_x3d_sai_Core_X3DNode(newValue);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setChildren$java_util_ArrayList(newValue :
>> java.util.ArrayList<org.web3d.x3d.sai.Core.X3DChildNode>) : TransformObject
>> {
>>             if(newValue == null) {
>>                 this.clearChildren();
>>                 return this;
>>             }
>>             if(newValue.isEmpty()) this.clearChildren(); else {
>>                 let newArray : org.web3d.x3d.sai.Core.X3DNode[] = (s => {
>> let a=[]; while(s-->0) a.push(null); return a; })(newValue.size());
>>                 for(let i : number = 0; i < newValue.size(); i++)
>> {newArray[i] = newValue.get(i);}
>>
>> this.setChildren$org_web3d_x3d_sai_Core_X3DNode_A(newArray);
>>             }
>>             for(let index3677=newValue.iterator();index3677.hasNext();) {
>>                 let element = index3677.next();
>>                 {
>>
>> this.children.add(<org.web3d.x3d.sai.Core.X3DNode><any>element);
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).setParentObject(this);
>>                 }
>>             }
>>             return this;
>>         }
>>
>>         public addChildren$org_web3d_x3d_sai_Core_X3DNode(newValue :
>> org.web3d.x3d.sai.Core.X3DNode) {
>>             if(newValue == null) return;
>>             this.children.add(newValue);
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue).setParentObject(this);
>>         }
>>
>>         public
>> addChildren$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue :
>> org.web3d.x3d.jsail.Core.ProtoInstanceObject) : TransformObject {
>>             if(newValue == null) return this;
>>             this.children.add(newValue);
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement>newValue).setParentObject(this);
>>             return this;
>>         }
>>
>>         /**
>>          * Add single ProtoInstanceObject (with appropriate node type and
>> containerField value) to MFNode array for children field.
>>          * <br><br>
>>          * <i>Note:</i> according to X3D Unified Object Model (X3DUOM),
>> acceptable node types are limited to ShaderPart and ProtoInstance.
>>          * @param {org.web3d.x3d.jsail.Core.ProtoInstanceObject} newValue
>> is new value to be appended the parts field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public addChildren(newValue? : any) : any {
>>             if(((newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject) || newValue === null)) {
>>                 return
>> <any>this.addChildren$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue);
>>             } else if(((newValue != null && (newValue["__interfaces"] !=
>> null && newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0 || newValue.constructor != null &&
>> newValue.constructor["__interfaces"] != null &&
>> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0)) || newValue === null)) {
>>                 return
>> <any>this.addChildren$org_web3d_x3d_sai_Core_X3DNode(newValue);
>>             } else if(((newValue != null && newValue instanceof
>> <any>Array && (newValue.length==0 || newValue[0] == null ||(newValue[0] !=
>> null && (newValue[0]["__interfaces"] != null &&
>> newValue[0]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
>> || newValue[0].constructor != null &&
>> newValue[0].constructor["__interfaces"] != null &&
>> newValue[0].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0)))) || newValue === null)) {
>>                 return
>> <any>this.addChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         /**
>>          * Utility method to add single child element to contained list
>> of existing children nodes (if any).
>>          * @param {*} newValue is new node value to be appended the
>> children field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public addChild(newValue : org.web3d.x3d.sai.Core.X3DChildNode) :
>> TransformObject {
>>             if(newValue == null) return this;
>>             this.children.add(newValue);
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue).setParentObject(this);
>>             if(newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)
>> (<org.web3d.x3d.jsail.Core.ProtoInstanceObject><any>newValue).setContainerField("children");
>>             return this;
>>         }
>>
>>         public addChildren$org_web3d_x3d_sai_Core_X3DNode_A(newValue :
>> org.web3d.x3d.sai.Core.X3DNode[]) {
>>             if(newValue == null) return;
>>             for(let i : number = 0; i < newValue.length; i++) {{
>>                 if((newValue[i] != null && (newValue[i]["__interfaces"]
>> != null &&
>> newValue[i]["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0
>> || newValue[i].constructor != null &&
>> newValue[i].constructor["__interfaces"] != null &&
>> newValue[i].constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0)) || (newValue[i] != null && newValue[i] instanceof
>> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)) {
>>                     this.children.add(newValue[i]);
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue[i]).setParentObject(this);
>>                     if(newValue[i] != null && newValue[i] instanceof
>> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject)
>> (<org.web3d.x3d.jsail.Core.ProtoInstanceObject><any>newValue[i]).setContainerField("children");
>>                 } else throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("X3DNode[] newValue[" + i + "]
>> is not instanceof X3DNode or ProtoInstanceObject, array newValue=" +
>> java.util.Arrays.toString(newValue));
>>             };}
>>         }
>>
>>         public setChildren$org_web3d_x3d_sai_Core_X3DNode(newValue :
>> org.web3d.x3d.sai.Core.X3DNode) {
>>             if(newValue == null) {
>>                 this.clearChildren();
>>                 return;
>>             }
>>             if(newValue != null && (newValue["__interfaces"] != null &&
>> newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode") >= 0 ||
>> newValue.constructor != null && newValue.constructor["__interfaces"] !=
>> null &&
>> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DNode")
>> >= 0)) {
>>                 for(let
>> index3678=this.children.iterator();index3678.hasNext();) {
>>                     let element = index3678.next();
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).clearParentObject()
>>                 }
>>                 this.clearChildren();
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>newValue).setParentObject(this);
>>                 this.children.add(newValue);
>>             } else throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("X3DNode newValue is not
>> instanceof X3DNode; newValue=" + newValue);
>>         }
>>
>>         /**
>>          * Utility method to clear MFNode value of children field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive
>>          * setAttribute method invocations).
>>          */
>>         public clearChildren() : TransformObject {
>>             for(let
>> index3679=this.children.iterator();index3679.hasNext();) {
>>                 let element = index3679.next();
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).clearParentObject()
>>             }
>>             this.children.clear();
>>             return this;
>>         }
>>
>>         /**
>>          * Indicate whether an object is available for inputOutput MFNode
>> field <i>children</i>.
>>          * @return {boolean} whether a properly typed node or
>> ProtoInstance array or CommentsBlock is available.
>>          * @see #getChildren()
>>          */
>>         public hasChildren() : boolean {
>>             return (!this.children.isEmpty());
>>         }
>>
>>         public addComments$java_lang_String(newComment : string) :
>> TransformObject {
>>             if(newComment == null) return this;
>>             this.children.add(new
>> org.web3d.x3d.jsail.Core.CommentsBlock(newComment));
>>             return this;
>>         }
>>
>>         /**
>>          * Add comment as CommentsBlock to children field
>>          * @param {string} newComment initial value
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive
>>          * setAttribute method invocations).
>>          */
>>         public addComments(newComment? : any) : any {
>>             if(((typeof newComment === 'string') || newComment === null))
>> {
>>                 return <any>this.addComments$java_lang_String(newComment);
>>             } else if(((newComment != null && newComment instanceof
>> <any>Array && (newComment.length==0 || newComment[0] == null ||(typeof
>> newComment[0] === 'string'))) || newComment === null)) {
>>                 return
>> <any>this.addComments$java_lang_String_A(newComment);
>>             } else if(((newComment != null && newComment instanceof
>> <any>org.web3d.x3d.jsail.Core.CommentsBlock) || newComment === null)) {
>>                 return
>> <any>this.addComments$org_web3d_x3d_jsail_Core_CommentsBlock(newComment);
>>             } else if(((typeof newComment === 'string') || newComment ===
>> null)) {
>>                  throw new Error('cannot invoke abstract overloaded
>> method... check your argument(s) type(s)');
>>             } else if(((newComment != null && newComment instanceof
>> <any>Array && (newComment.length==0 || newComment[0] == null ||(typeof
>> newComment[0] === 'string'))) || newComment === null)) {
>>                 return
>> <any>this.addComments$java_lang_String_A(newComment);
>>             } else if(((newComment != null && newComment instanceof
>> <any>org.web3d.x3d.jsail.Core.CommentsBlock) || newComment === null)) {
>>                 return
>> <any>this.addComments$org_web3d_x3d_jsail_Core_CommentsBlock(newComment);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public addComments$java_lang_String_A(newComments : string[]) :
>> TransformObject {
>>             if(newComments == null) return this;
>>             this.children.add(new
>> org.web3d.x3d.jsail.Core.CommentsBlock(newComments));
>>             return this;
>>         }
>>
>>         public
>> addComments$org_web3d_x3d_jsail_Core_CommentsBlock(newCommentsBlock :
>> org.web3d.x3d.jsail.Core.CommentsBlock) : TransformObject {
>>             if(newCommentsBlock == null) return this;
>>             this.children.add(newCommentsBlock);
>>             return this;
>>         }
>>
>>         /**
>>          * Provide ISObject instance (using a properly typed node) from
>> inputOutput SFNode field <i>IS</i>.
>>          * @return {org.web3d.x3d.jsail.Core.ISObject} value of IS field
>>          */
>>         public getIS() : org.web3d.x3d.jsail.Core.ISObject {
>>             return this.IS;
>>         }
>>
>>         /**
>>          * Accessor method to assign ISObject instance (using a properly
>> typed node) to inputOutput SFNode field <i>IS</i>.
>>          * @param {org.web3d.x3d.jsail.Core.ISObject} newValue is new
>> value for the IS field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setIS(newValue : org.web3d.x3d.jsail.Core.ISObject) :
>> TransformObject {
>>             this.IS = newValue;
>>             if(newValue != null) {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).setParentObject(this);
>>             }
>>             return this;
>>         }
>>
>>         /**
>>          * Utility method to clear SFNode value of IS field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive
>>          * setAttribute method invocations).
>>          */
>>         public clearIS() : TransformObject {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).clearParentObject();
>>             this.IS = null;
>>             return this;
>>         }
>>
>>         /**
>>          * Indicate whether an object is available for inputOutput SFNode
>> field <i>IS</i>.
>>          * @return {boolean} whether a concrete statement or
>> CommentsBlock is available.
>>          * @see #getIS()
>>          */
>>         public hasIS() : boolean {
>>             return (this.IS != null);
>>         }
>>
>>         /**
>>          * Provide X3DMetadataObject instance (using a properly typed
>> node) from inputOutput SFNode field <i>metadata</i>.
>>          * @see #getMetadataProtoInstance()
>>          * @see <a href="
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
>> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>>          * @return {*} value of metadata field
>>          */
>>         public getMetadata() : org.web3d.x3d.sai.Core.X3DMetadataObject {
>>             return this.metadata;
>>         }
>>
>>         public
>> setMetadata$org_web3d_x3d_sai_Core_X3DMetadataObject(newValue :
>> org.web3d.x3d.sai.Core.X3DMetadataObject) : TransformObject {
>>             this.metadata = newValue;
>>             if(newValue != null) {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).setParentObject(this);
>>             }
>>             if(this.metadataProtoInstance != null) {
>>                 this.metadataProtoInstance.setParentObject(null);
>>                 this.metadataProtoInstance = null;
>>             }
>>             return this;
>>         }
>>
>>         /**
>>          * Accessor method to assign X3DMetadataObject instance (using a
>> properly typed node) to inputOutput SFNode field <i>metadata</i>.
>>          * @see #setMetadata(ProtoInstanceObject)
>>          * @see <a href="
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
>> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>>          * @param {*} newValue is new value for the metadata field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setMetadata(newValue? : any) : any {
>>             if(((newValue != null && (newValue["__interfaces"] != null &&
>> newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
>> >= 0 || newValue.constructor != null &&
>> newValue.constructor["__interfaces"] != null &&
>> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
>> >= 0)) || newValue === null)) {
>>                 return
>> <any>this.setMetadata$org_web3d_x3d_sai_Core_X3DMetadataObject(newValue);
>>             } else if(((newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject) || newValue === null)) {
>>                 return
>> <any>this.setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue);
>>             } else if(((newValue != null && (newValue["__interfaces"] !=
>> null &&
>> newValue["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
>> >= 0 || newValue.constructor != null &&
>> newValue.constructor["__interfaces"] != null &&
>> newValue.constructor["__interfaces"].indexOf("org.web3d.x3d.sai.Core.X3DMetadataObject")
>> >= 0)) || newValue === null)) {
>>                  throw new Error('cannot invoke abstract overloaded
>> method... check your argument(s) type(s)');
>>             } else if(((newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.Core.ProtoInstanceObject) || newValue === null)) {
>>                 return
>> <any>this.setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         /**
>>          * Utility method to clear SFNode value of metadata field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive
>>          * setAttribute method invocations).
>>          */
>>         public clearMetadata() : TransformObject {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).clearParentObject();
>>             this.metadata = null;
>>             return this;
>>         }
>>
>>         public
>> setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(newValue :
>> org.web3d.x3d.jsail.Core.ProtoInstanceObject) : TransformObject {
>>             if(this.metadataProtoInstance != null) {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).setParentObject(null);
>>             }
>>             this.metadataProtoInstance = newValue;
>>             if(newValue != null) {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).setParentObject(this);
>>                 this.metadataProtoInstance.setContainerField("metadata");
>>             }
>>             if(this.metadata != null) {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).setParentObject(null);
>>                 this.metadata = null;
>>             }
>>             return this;
>>         }
>>
>>         /**
>>          * Private utility method to access SFNode ProtoInstance field
>>          * @return {org.web3d.x3d.jsail.Core.ProtoInstanceObject}
>>          * @private
>>          */
>>         /*private*/ getMetadataProtoInstance() :
>> org.web3d.x3d.jsail.Core.ProtoInstanceObject {
>>             return this.metadataProtoInstance;
>>         }
>>
>>         /**
>>          * Indicate whether an object is available for inputOutput SFNode
>> field <i>metadata</i>.
>>          * @return {boolean} whether a properly typed node or
>> ProtoInstance or CommentsBlock is available.
>>          * @see #getMetadata()
>>          * @see #getMetadataProtoInstance()
>>          * @see <a href="
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#Metadata"
>> target="_blank">X3D Scene Authoring Hints: Metadata Nodes</a>
>>          */
>>         public hasMetadata() : boolean {
>>             return (this.metadata != null) || (this.metadataProtoInstance
>> != null);
>>         }
>>
>>         /**
>>          * Provide array of 4-tuple float results unit axis, angle (in
>> radians) from inputOutput SFRotation field named <i>rotation</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> Orientation (axis, angle in radians) of
>> children relative to local coordinate system.
>>          * <ul>
>>          * <li> <i> Hint:</i>  The order of operation is first apply the
>> center offset, then scaleOrientation and scale, then rotation, then restore
>> the center offset, then translation. </li>
>>          * </ul>
>>          * @return {Array} value of rotation field
>>          */
>>         public getRotation() : number[] {
>>             return this.rotation;
>>         }
>>
>>         public setRotation$float_A(newValue : number[]) : TransformObject
>> {
>>             if(newValue == null) newValue = [];
>>             if(newValue.length !== 4) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform rotation newValue="
>> + org.web3d.x3d.jsail.fields.SFRotationObject.toString(newValue) + " has
>> length=" + newValue.length + " instead of required length 4");
>>             }
>>             this.rotation = newValue;
>>             return this;
>>         }
>>
>>         public
>> setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(newValue :
>> org.web3d.x3d.jsail.fields.SFRotationObject) : TransformObject {
>>             this.setRotation$float_A(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public setRotation$float$float$float$float(x : number, y :
>> number, z : number, angleRadians : number) : TransformObject {
>>             this.setRotation$float_A([x, y, z, angleRadians]);
>>             return this;
>>         }
>>
>>         /**
>>          * Assign values to SFRotation rotation field, similar to {@link
>> #setRotation(float[])}.
>>          *
>>          * @param {number} x first component of axis
>>          * @param {number} y second component of axis
>>          * @param {number} z third component of axis
>>          * @param {number} angleRadians fourth component of rotation
>> around axis
>>          *
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setRotation(x? : any, y? : any, z? : any, angleRadians? :
>> any) : any {
>>             if(((typeof x === 'number') || x === null) && ((typeof y ===
>> 'number') || y === null) && ((typeof z === 'number') || z === null) &&
>> ((typeof angleRadians === 'number') || angleRadians === null)) {
>>                 return <any>this.setRotation$float$float$float$float(x,
>> y, z, angleRadians);
>>             } else if(((typeof x === 'number') || x === null) && ((typeof
>> y === 'number') || y === null) && ((typeof z === 'number') || z === null)
>> && ((typeof angleRadians === 'number') || angleRadians === null)) {
>>                 return
>> <any>this.setRotation$double$double$double$double(x, y, z, angleRadians);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined && angleRadians === undefined) {
>>                 return <any>this.setRotation$float_A(x);
>>             } else if(((x != null && x instanceof
>> <any>org.web3d.x3d.jsail.fields.SFRotationObject) || x === null) && y ===
>> undefined && z === undefined && angleRadians === undefined) {
>>                 return
>> <any>this.setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(x);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined && angleRadians === undefined) {
>>                 return <any>this.setRotation$double_A(x);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setRotation$double$double$double$double(x : number, y :
>> number, z : number, angleRadians : number) : TransformObject {
>>             return
>> this.setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(new
>> org.web3d.x3d.jsail.fields.SFRotationObject(x, y, z, angleRadians));
>>         }
>>
>>         public setRotation$double_A(newArray : number[]) :
>> TransformObject {
>>             return
>> this.setRotation$org_web3d_x3d_jsail_fields_SFRotationObject(new
>> org.web3d.x3d.jsail.fields.SFRotationObject(newArray));
>>         }
>>
>>         /**
>>          * Provide array of 3-tuple float results from inputOutput
>> SFVec3f field named <i>scale</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> Non-uniform x-y-z scale of child coordinate
>> system, adjusted by center and scaleOrientation.
>>          * <ul>
>>          * <li> <i> Hint:</i>  The order of operation is first apply the
>> center offset, then scaleOrientation and scale, then rotation, then restore
>> the center offset, then translation. </li>
>>          * </ul>
>>          * @return {Array} value of scale field
>>          */
>>         public getScale() : number[] {
>>             return this.scale;
>>         }
>>
>>         public setScale$float_A(newValue : number[]) : TransformObject {
>>             if(newValue == null) newValue = [];
>>             if(newValue.length !== 3) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform scale newValue=" +
>> org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) + " has
>> length=" + newValue.length + " instead of required length 3");
>>             }
>>             this.scale = newValue;
>>             return this;
>>         }
>>
>>         public setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue
>> : org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>>             this.setScale$float_A(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public setScale$float$float$float(x : number, y : number, z :
>> number) : TransformObject {
>>             this.setScale$float_A([x, y, z]);
>>             return this;
>>         }
>>
>>         /**
>>          * Assign values to SFVec3f scale field, similar to {@link
>> #setScale(float[])}.
>>          *
>>          * @param {number} x first component
>>          * @param {number} y second component
>>          * @param {number} z third component
>>          *
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setScale(x? : any, y? : any, z? : any) : any {
>>             if(((typeof x === 'number') || x === null) && ((typeof y ===
>> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setScale$float$float$float(x, y, z);
>>             } else if(((typeof x === 'number') || x === null) && ((typeof
>> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setScale$double$double$double(x, y, z);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setScale$float_A(x);
>>             } else if(((x != null && x instanceof
>> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
>> undefined && z === undefined) {
>>                 return
>> <any>this.setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setScale$double_A(x);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setScale$double$double$double(x : number, y : number, z :
>> number) : TransformObject {
>>             return
>> this.setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>>         }
>>
>>         public setScale$double_A(newArray : number[]) : TransformObject {
>>             return
>> this.setScale$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>>         }
>>
>>         /**
>>          * Provide array of 4-tuple float results unit axis, angle (in
>> radians) from inputOutput SFRotation field named <i>scaleOrientation</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> Preliminary rotation of coordinate system
>> before scaling (to allow scaling around arbitrary orientations).
>>          * <ul>
>>          * <li> <i> Hint:</i>  The order of operation is first apply the
>> center offset, then scaleOrientation and scale, then rotation, then restore
>> the center offset, then translation. </li>
>>          * </ul>
>>          * @return {Array} value of scaleOrientation field
>>          */
>>         public getScaleOrientation() : number[] {
>>             return this.scaleOrientation;
>>         }
>>
>>         public setScaleOrientation$float_A(newValue : number[]) :
>> TransformObject {
>>             if(newValue == null) newValue = [];
>>             if(newValue.length !== 4) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform scaleOrientation
>> newValue=" + org.web3d.x3d.jsail.fields.SFRotationObject.toString(newValue)
>> + " has length=" + newValue.length + " instead of required length 4");
>>             }
>>             this.scaleOrientation = newValue;
>>             return this;
>>         }
>>
>>         public
>> setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(newValue :
>> org.web3d.x3d.jsail.fields.SFRotationObject) : TransformObject {
>>
>> this.setScaleOrientation$float_A(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public setScaleOrientation$float$float$float$float(x : number, y
>> : number, z : number, angleRadians : number) : TransformObject {
>>             this.setScaleOrientation$float_A([x, y, z, angleRadians]);
>>             return this;
>>         }
>>
>>         /**
>>          * Assign values to SFRotation scaleOrientation field, similar to
>> {@link #setScaleOrientation(float[])}.
>>          *
>>          * @param {number} x first component of axis
>>          * @param {number} y second component of axis
>>          * @param {number} z third component of axis
>>          * @param {number} angleRadians fourth component of rotation
>> around axis
>>          *
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setScaleOrientation(x? : any, y? : any, z? : any,
>> angleRadians? : any) : any {
>>             if(((typeof x === 'number') || x === null) && ((typeof y ===
>> 'number') || y === null) && ((typeof z === 'number') || z === null) &&
>> ((typeof angleRadians === 'number') || angleRadians === null)) {
>>                 return
>> <any>this.setScaleOrientation$float$float$float$float(x, y, z,
>> angleRadians);
>>             } else if(((typeof x === 'number') || x === null) && ((typeof
>> y === 'number') || y === null) && ((typeof z === 'number') || z === null)
>> && ((typeof angleRadians === 'number') || angleRadians === null)) {
>>                 return
>> <any>this.setScaleOrientation$double$double$double$double(x, y, z,
>> angleRadians);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined && angleRadians === undefined) {
>>                 return <any>this.setScaleOrientation$float_A(x);
>>             } else if(((x != null && x instanceof
>> <any>org.web3d.x3d.jsail.fields.SFRotationObject) || x === null) && y ===
>> undefined && z === undefined && angleRadians === undefined) {
>>                 return
>> <any>this.setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(x);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined && angleRadians === undefined) {
>>                 return <any>this.setScaleOrientation$double_A(x);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setScaleOrientation$double$double$double$double(x :
>> number, y : number, z : number, angleRadians : number) : TransformObject {
>>             return
>> this.setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(new
>> org.web3d.x3d.jsail.fields.SFRotationObject(x, y, z, angleRadians));
>>         }
>>
>>         public setScaleOrientation$double_A(newArray : number[]) :
>> TransformObject {
>>             return
>> this.setScaleOrientation$org_web3d_x3d_jsail_fields_SFRotationObject(new
>> org.web3d.x3d.jsail.fields.SFRotationObject(newArray));
>>         }
>>
>>         /**
>>          * Provide array of 3-tuple float results from inputOutput
>> SFVec3f field named <i>translation</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> Position (x, y, z in meters) of children
>> relative to local coordinate system.
>>          * <ul>
>>          * <li> <i> Hint:</i>  The order of operation is first apply the
>> center offset, then scaleOrientation and scale, then rotation, then restore
>> the center offset, then translation. </li>
>>          * </ul>
>>          * @return {Array} value of translation field
>>          */
>>         public getTranslation() : number[] {
>>             return this.translation;
>>         }
>>
>>         public setTranslation$float_A(newValue : number[]) :
>> TransformObject {
>>             if(newValue == null) newValue = [];
>>             if(newValue.length !== 3) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform translation
>> newValue=" + org.web3d.x3d.jsail.fields.SFVec3fObject.toString(newValue) +
>> " has length=" + newValue.length + " instead of required length 3");
>>             }
>>             this.translation = newValue;
>>             return this;
>>         }
>>
>>         public
>> setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(newValue :
>> org.web3d.x3d.jsail.fields.SFVec3fObject) : TransformObject {
>>             this.setTranslation$float_A(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public setTranslation$float$float$float(x : number, y : number, z
>> : number) : TransformObject {
>>             this.setTranslation$float_A([x, y, z]);
>>             return this;
>>         }
>>
>>         /**
>>          * Assign values to SFVec3f translation field, similar to {@link
>> #setTranslation(float[])}.
>>          *
>>          * @param {number} x first component
>>          * @param {number} y second component
>>          * @param {number} z third component
>>          *
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setTranslation(x? : any, y? : any, z? : any) : any {
>>             if(((typeof x === 'number') || x === null) && ((typeof y ===
>> 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setTranslation$float$float$float(x, y,
>> z);
>>             } else if(((typeof x === 'number') || x === null) && ((typeof
>> y === 'number') || y === null) && ((typeof z === 'number') || z === null)) {
>>                 return <any>this.setTranslation$double$double$double(x,
>> y, z);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setTranslation$float_A(x);
>>             } else if(((x != null && x instanceof
>> <any>org.web3d.x3d.jsail.fields.SFVec3fObject) || x === null) && y ===
>> undefined && z === undefined) {
>>                 return
>> <any>this.setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(x);
>>             } else if(((x != null && x instanceof <any>Array &&
>> (x.length==0 || x[0] == null ||(typeof x[0] === 'number'))) || x === null)
>> && y === undefined && z === undefined) {
>>                 return <any>this.setTranslation$double_A(x);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setTranslation$double$double$double(x : number, y :
>> number, z : number) : TransformObject {
>>             return
>> this.setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(x, y, z));
>>         }
>>
>>         public setTranslation$double_A(newArray : number[]) :
>> TransformObject {
>>             return
>> this.setTranslation$org_web3d_x3d_jsail_fields_SFVec3fObject(new
>> org.web3d.x3d.jsail.fields.SFVec3fObject(newArray));
>>         }
>>
>>         /**
>>          * Provide String value from inputOutput SFString field named
>> <i>DEF</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> DEF defines a unique ID name for this node,
>> referenceable by other nodes.
>>          * <ul>
>>          * <li> <i>Hint:</i> descriptive DEF names improve clarity and
>> help document a model. </li>
>>          * <li> <i>Hint:</i> well-defined names can simplify design and
>> debugging through improved author understanding. </li>
>>          * <li> <i>Hint:</i>  X3D Scene Authoring Hints, Naming
>> Conventions <a href="
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions"
>> target="_blank">
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions</a>
>> </li>
>>          * </ul>
>>          * @return {string} value of DEF field
>>          */
>>         public getDEF() : string {
>>             return super.getDEF();
>>         }
>>
>>         public setDEF$java_lang_String(newValue : string) :
>> TransformObject {
>>             if(newValue == null) newValue = <string>new String();
>>             if(!/* isEmpty */(newValue.length === 0) &&
>> !org.web3d.x3d.jsail.fields.SFStringObject.isNMTOKEN(newValue)) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform DEF newValue=\'" +
>> newValue + "\' has illegal name value, cannot be empty and must be defined
>> with valid NMTOKEN name string (with legal characters and no embedded
>> whitespace).");
>>             }
>>             this.setConcreteUSE("");
>>             this.setConcreteDEF(newValue);
>>             return this;
>>         }
>>
>>         /**
>>          * Accessor method to assign String value to inputOutput SFString
>> field named <i>DEF</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> DEF defines a unique ID name for this node,
>> referenceable by other nodes.
>>          * <ul>
>>          * <li> <i>Hint:</i> descriptive DEF names improve clarity and
>> help document a model. </li>
>>          * <li> <i>Hint:</i> well-defined names can simplify design and
>> debugging through improved author understanding. </li>
>>          * <li> <i>Hint:</i>  X3D Scene Authoring Hints, Naming
>> Conventions <a href="
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions"
>> target="_blank">
>> https://www.web3d.org/x3d/content/examples/X3dSceneAuthoringHints.html#NamingConventions</a>
>> </li>
>>          * </ul>
>>          * <br><br>
>>          * Note that setting the DEF value clears the USE value.
>>          * @param {string} newValue is new value for the DEF field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setDEF(newValue? : any) : any {
>>             if(((typeof newValue === 'string') || newValue === null)) {
>>                 return <any>this.setDEF$java_lang_String(newValue);
>>             } else if(((newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.fields.SFStringObject) || newValue === null)) {
>>                 return
>> <any>this.setDEF$org_web3d_x3d_jsail_fields_SFStringObject(newValue);
>>             } else if(((typeof newValue === 'string') || newValue ===
>> null)) {
>>                  throw new Error('cannot invoke abstract overloaded
>> method... check your argument(s) type(s)');
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setDEF$org_web3d_x3d_jsail_fields_SFStringObject(newValue
>> : org.web3d.x3d.jsail.fields.SFStringObject) : TransformObject {
>>             this.setDEF$java_lang_String(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         /**
>>          * Provide String value from inputOutput SFString field named
>> <i>USE</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> USE means reuse an already DEF-ed node ID,
>> excluding all child nodes and all other attributes (except for
>> containerField, which can have a different value).
>>          * <ul>
>>          * <li> <i>Hint:</i> USE references to previously defined DEF
>> geometry (instead of duplicating nodes) can improve performance. </li>
>>          * <li> <i>Warning:</i> do NOT include any child nodes, a DEF
>> attribute, or any other attribute values (except for containerField) when
>> defining a USE attribute. </li>
>>          * <li> <i>Warning:</i>  each USE value must match a
>> corresponding DEF value that is defined earlier in the scene. </li>
>>          * </ul>
>>          * @return {string} value of USE field
>>          */
>>         public getUSE() : string {
>>             return super.getUSE();
>>         }
>>
>>         public setUSE$java_lang_String(newValue : string) :
>> TransformObject {
>>             if(newValue == null) newValue = <string>new String();
>>             if(!/* isEmpty */(newValue.length === 0) &&
>> !org.web3d.x3d.jsail.fields.SFStringObject.isNMTOKEN(newValue)) {
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException("Transform USE newValue=\'" +
>> newValue + "\' has illegal name value, cannot be empty and must be defined
>> with valid NMTOKEN name string (with legal characters and no embedded
>> whitespace).");
>>             }
>>             this.setConcreteDEF("");
>>             this.setConcreteUSE(newValue);
>>             return this;
>>         }
>>
>>         /**
>>          * Accessor method to assign String value to inputOutput SFString
>> field named <i>USE</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> USE means reuse an already DEF-ed node ID,
>> excluding all child nodes and all other attributes (except for
>> containerField, which can have a different value).
>>          * <ul>
>>          * <li> <i>Hint:</i> USE references to previously defined DEF
>> geometry (instead of duplicating nodes) can improve performance. </li>
>>          * <li> <i>Warning:</i> do NOT include any child nodes, a DEF
>> attribute, or any other attribute values (except for containerField) when
>> defining a USE attribute. </li>
>>          * <li> <i>Warning:</i>  each USE value must match a
>> corresponding DEF value that is defined earlier in the scene. </li>
>>          * </ul>
>>          * <br><br>
>>          * <i>Note:</i> each <code>USE</code> node is still an
>> independent object, with the <code>USE</code> value matching the
>> <code>DEF</code> value in the preceding object.
>>          * <br><br>
>>          * <i>Warning:</i> invoking the <code>setUSE()</code> method on
>> this node resets all other fields to their default values (except for
>> containerField) and also releases all child nodes.<br><br>
>>          * <i>Warning:</i> no other operations can be performed to modify
>> a USE node other than setting an alternate containerField value.
>>          * @param {string} newValue is new value for the USE field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setUSE(newValue? : any) : any {
>>             if(((typeof newValue === 'string') || newValue === null)) {
>>                 return <any>this.setUSE$java_lang_String(newValue);
>>             } else if(((newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.fields.SFStringObject) || newValue === null)) {
>>                 return
>> <any>this.setUSE$org_web3d_x3d_jsail_fields_SFStringObject(newValue);
>>             } else if(((newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.Grouping.TransformObject) || newValue === null)) {
>>                 return
>> <any>this.setUSE$org_web3d_x3d_jsail_Grouping_TransformObject(newValue);
>>             } else if(((typeof newValue === 'string') || newValue ===
>> null)) {
>>                  throw new Error('cannot invoke abstract overloaded
>> method... check your argument(s) type(s)');
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public setUSE$org_web3d_x3d_jsail_fields_SFStringObject(newValue
>> : org.web3d.x3d.jsail.fields.SFStringObject) : TransformObject {
>>             this.setUSE$java_lang_String(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         /**
>>          * Provide String value from inputOutput SFString field named
>> <i>class</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> The class attribute is a space-separated list
>> of classes, reserved for use by CSS cascading stylesheets.
>>          * <ul>
>>          * <li> <i>Warning:</i> currently the class attribute is only
>> supported in XML encoding of X3D scenes. </li>
>>          * <li> <i>Hint:</i>  W3C Cascading Style Sheets <a href="
>> https://www.w3.org/Style/CSS" target="_blank">
>> https://www.w3.org/Style/CSS</a> </li>
>>          * </ul>
>>          * @return {string} value of class field
>>          */
>>         public getCssClass() : string {
>>             return super.getCssClass();
>>         }
>>
>>         public setCssClass$java_lang_String(newValue : string) :
>> TransformObject {
>>             if(newValue == null) newValue = <string>new String();
>>             this.setConcreteCssClass(newValue);
>>             return this;
>>         }
>>
>>         /**
>>          * Accessor method to assign String value to inputOutput SFString
>> field named <i>class</i>.
>>          * <br><br>
>>          * <i>Tooltip:</i> The class attribute is a space-separated list
>> of classes, reserved for use by CSS cascading stylesheets.
>>          * <ul>
>>          * <li> <i>Warning:</i> currently the class attribute is only
>> supported in XML encoding of X3D scenes. </li>
>>          * <li> <i>Hint:</i>  W3C Cascading Style Sheets <a href="
>> https://www.w3.org/Style/CSS" target="_blank">
>> https://www.w3.org/Style/CSS</a> </li>
>>          * </ul>
>>          * @param {string} newValue is new value for the class field.
>>          * @return {org.web3d.x3d.jsail.Grouping.TransformObject} {@link
>> TransformObject} - namely <i>this</i> same object to allow sequential
>> method pipelining (i.e. consecutive method invocations on the same object).
>>          */
>>         public setCssClass(newValue? : any) : any {
>>             if(((typeof newValue === 'string') || newValue === null)) {
>>                 return <any>this.setCssClass$java_lang_String(newValue);
>>             } else if(((newValue != null && newValue instanceof
>> <any>org.web3d.x3d.jsail.fields.SFStringObject) || newValue === null)) {
>>                 return
>> <any>this.setCssClass$org_web3d_x3d_jsail_fields_SFStringObject(newValue);
>>             } else if(((typeof newValue === 'string') || newValue ===
>> null)) {
>>                  throw new Error('cannot invoke abstract overloaded
>> method... check your argument(s) type(s)');
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public
>> setCssClass$org_web3d_x3d_jsail_fields_SFStringObject(newValue :
>> org.web3d.x3d.jsail.fields.SFStringObject) : TransformObject {
>>
>> this.setCssClass$java_lang_String(newValue.getPrimitiveValue());
>>             return this;
>>         }
>>
>>         public
>> setUSE$org_web3d_x3d_jsail_Grouping_TransformObject(DEFnode :
>> TransformObject) : TransformObject {
>>             if(/* isEmpty */(DEFnode.getDEF().length === 0)) {
>>                 let errorNotice : string = "setUSE(DEFnode) invoked on
>> TransformObject that has no DEF name defined, thus a copy cannot be
>> referenced as a USE node";
>>                 this.validationResult.append(errorNotice).append("\n");
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>>             }
>>             this.setUSE$java_lang_String(DEFnode.getDEF());
>>             return this;
>>         }
>>
>>         public constructor(DEFlabel? : any) {
>>             if(((typeof DEFlabel === 'string') || DEFlabel === null)) {
>>                 let __args = arguments;
>>                 super();
>>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>>                 if(this.bboxSize===undefined) this.bboxSize = null;
>>                 if(this.center===undefined) this.center = null;
>>                 if(this.IS===undefined) this.IS = null;
>>                 if(this.metadata===undefined) this.metadata = null;
>>                 if(this.metadataProtoInstance===undefined)
>> this.metadataProtoInstance = null;
>>                 if(this.rotation===undefined) this.rotation = null;
>>                 if(this.scale===undefined) this.scale = null;
>>                 if(this.scaleOrientation===undefined)
>> this.scaleOrientation = null;
>>                 if(this.translation===undefined) this.translation = null;
>>                 this.children = <any>(new java.util.ArrayList<any>());
>>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>>                 if(this.bboxSize===undefined) this.bboxSize = null;
>>                 if(this.center===undefined) this.center = null;
>>                 if(this.IS===undefined) this.IS = null;
>>                 if(this.metadata===undefined) this.metadata = null;
>>                 if(this.metadataProtoInstance===undefined)
>> this.metadataProtoInstance = null;
>>                 if(this.rotation===undefined) this.rotation = null;
>>                 if(this.scale===undefined) this.scale = null;
>>                 if(this.scaleOrientation===undefined)
>> this.scaleOrientation = null;
>>                 if(this.translation===undefined) this.translation = null;
>>                 (() => {
>>                     this.initialize();
>>                     this.setDEF$java_lang_String(DEFlabel);
>>                 })();
>>             } else if(DEFlabel === undefined) {
>>                 let __args = arguments;
>>                 super();
>>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>>                 if(this.bboxSize===undefined) this.bboxSize = null;
>>                 if(this.center===undefined) this.center = null;
>>                 if(this.IS===undefined) this.IS = null;
>>                 if(this.metadata===undefined) this.metadata = null;
>>                 if(this.metadataProtoInstance===undefined)
>> this.metadataProtoInstance = null;
>>                 if(this.rotation===undefined) this.rotation = null;
>>                 if(this.scale===undefined) this.scale = null;
>>                 if(this.scaleOrientation===undefined)
>> this.scaleOrientation = null;
>>                 if(this.translation===undefined) this.translation = null;
>>                 this.children = <any>(new java.util.ArrayList<any>());
>>                 if(this.bboxCenter===undefined) this.bboxCenter = null;
>>                 if(this.bboxSize===undefined) this.bboxSize = null;
>>                 if(this.center===undefined) this.center = null;
>>                 if(this.IS===undefined) this.IS = null;
>>                 if(this.metadata===undefined) this.metadata = null;
>>                 if(this.metadataProtoInstance===undefined)
>> this.metadataProtoInstance = null;
>>                 if(this.rotation===undefined) this.rotation = null;
>>                 if(this.scale===undefined) this.scale = null;
>>                 if(this.scaleOrientation===undefined)
>> this.scaleOrientation = null;
>>                 if(this.translation===undefined) this.translation = null;
>>                 (() => {
>>                     this.initialize();
>>                 })();
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public toStringX3D$int(indentLevel : number) : string {
>>             let hasAttributes : boolean = true;
>>             let hasChild : boolean = (this.IS != null) ||
>> (!this.children.isEmpty()) || (this.IS != null) || (this.metadata != null)
>> || (this.metadataProtoInstance != null);
>>             if(this.isUSE()) hasChild = false;
>>             let indent : java.lang.StringBuilder = new
>> java.lang.StringBuilder();
>>             let indentIncrement : number =
>> org.web3d.x3d.jsail.ConfigurationProperties.getIndentIncrement();
>>             let indentCharacter : string =
>> org.web3d.x3d.jsail.ConfigurationProperties.getIndentCharacter();
>>             for(let i : number = 0; i < indentLevel; i++)
>> {indent.append(indentCharacter);}
>>             let stringX3D : java.lang.StringBuilder = new
>> java.lang.StringBuilder();
>>             stringX3D.append(indent).append("<Transform");
>>             if(hasAttributes) {
>>                 if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
>> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getDEF(),org.web3d.x3d.jsail.X3DConcreteNode.DEF_DEFAULT_VALUE)) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> DEF=\'").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getDEF())).append("\'");
>>                 }
>>                 if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
>> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getUSE(),org.web3d.x3d.jsail.X3DConcreteNode.USE_DEFAULT_VALUE))) {
>>                     stringX3D.append("
>> USE=\'").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getUSE())).append("\'");
>>                 }
>>                 if(!/* isEmpty */(this.getContainerFieldOverride().length
>> === 0) && !/* equals */(<any>((o1: any, o2: any) => { if(o1 && o1.equals) {
>> return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getContainerFieldOverride(),this.getContainerFieldDefault()))) {
>>                     stringX3D.append("
>> containerField=\'").append(this.getContainerFieldOverride()).append("\'");
>>                 }
>>                 if((!java.util.Arrays.equals(this.getBboxCenter(),
>> TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> bboxCenter=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxCenter())).append("\'");
>>                 }
>>                 if((!java.util.Arrays.equals(this.getBboxSize(),
>> TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> bboxSize=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxSize())).append("\'");
>>                 }
>>                 if((!java.util.Arrays.equals(this.getCenter(),
>> TransformObject.CENTER_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> center=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getCenter())).append("\'");
>>                 }
>>                 if((!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
>> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getCssClass(),org.web3d.x3d.jsail.X3DConcreteNode.CLASS_DEFAULT_VALUE))
>> || org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes())
>> && !this.isUSE()) {
>>                     stringX3D.append(" class=\'").append(new
>> org.web3d.x3d.jsail.fields.SFStringObject(this.getCssClass()).toStringX3D()).append("\'");
>>                 }
>>                 if((!java.util.Arrays.equals(this.getRotation(),
>> TransformObject.ROTATION_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> rotation=\'").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getRotation())).append("\'");
>>                 }
>>                 if((!java.util.Arrays.equals(this.getScale(),
>> TransformObject.SCALE_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> scale=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getScale())).append("\'");
>>                 }
>>                 if((!java.util.Arrays.equals(this.getScaleOrientation(),
>> TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> scaleOrientation=\'").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getScaleOrientation())).append("\'");
>>                 }
>>                 if((!java.util.Arrays.equals(this.getTranslation(),
>> TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) &&
>> !this.isUSE()) {
>>                     stringX3D.append("
>> translation=\'").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getTranslation())).append("\'");
>>                 }
>>             }
>>             if((hasChild) && !this.isUSE()) {
>>                 stringX3D.append(">").append("\n");
>>                 if(this.metadata != null) {
>>
>> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).toStringX3D$int(indentLevel
>> + indentIncrement));
>>                 } else if(this.metadataProtoInstance != null) {
>>
>> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).toStringX3D$int(indentLevel
>> + indentIncrement));
>>                 }
>>                 if(this.IS != null) {
>>
>> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).toStringX3D$int(indentLevel
>> + indentIncrement));
>>                 }
>>                 for(let
>> index3680=this.children.iterator();index3680.hasNext();) {
>>                     let element = index3680.next();
>>                     {
>>
>> stringX3D.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>element).toStringX3D$int(indentLevel
>> + indentIncrement));
>>                     }
>>                 }
>>
>> stringX3D.append(indent).append("</Transform>").append("\n");
>>             } else {
>>                 stringX3D.append("/>").append("\n");
>>             }
>>             return stringX3D.toString();
>>         }
>>
>>         /**
>>          * Recursive method to provide X3D string serialization of this
>> model subgraph, utilizing XML encoding and conforming to X3D Canonical Form.
>>          * @param {number} indentLevel number of levels of indentation
>> for this element
>>          * @see X3DObject#FILE_EXTENSION_X3D
>>          * @see X3DObject#FILE_EXTENSION_XML
>>          * @see X3DObject#toStringXML()
>>          * @see X3DObject#toFileXML(String)
>>          * @see X3DObject#toFileX3D(String)
>>          * @see <a href="
>> https://www.web3d.org/documents/specifications/19776-1/V3.3/Part01/X3D_XML.html">X3D
>> XML Encoding</a>
>>          * @see <a href="
>> https://www.web3d.org/documents/specifications/19776-3/V3.3/Part03/concepts.html#X3DCanonicalForm"
>> target="blank">X3D Compressed Binary Encoding: X3D Canonical Form</a>
>>          * @see <a href="
>> https://www.web3d.org/x3d/tools/canonical/doc/x3dTools.htm">X3D
>> Canonicalization (C14N) Tool</a>
>>          * @return {string} X3D string
>>          */
>>         public toStringX3D(indentLevel? : any) : any {
>>             if(((typeof indentLevel === 'number') || indentLevel ===
>> null)) {
>>                 return <any>this.toStringX3D$int(indentLevel);
>>             } else if(indentLevel === undefined) {
>>                 return <any>this.toStringX3D$();
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public toStringClassicVRML$int(indentLevel : number) : string {
>>             let stringClassicVRML : java.lang.StringBuilder = new
>> java.lang.StringBuilder();
>>             let hasAttributes : boolean = true;
>>             let hasChild : boolean = (this.IS != null) ||
>> (!this.children.isEmpty()) || (this.IS != null) || (this.metadata != null)
>> || (this.metadataProtoInstance != null);
>>             if(this.isUSE()) {
>>                 hasAttributes = false;
>>                 hasChild = false;
>>             }
>>             let indent : java.lang.StringBuilder = new
>> java.lang.StringBuilder();
>>             let indentCharacter : string =
>> org.web3d.x3d.jsail.ConfigurationProperties.getIndentCharacter();
>>             let indentIncrement : number =
>> org.web3d.x3d.jsail.ConfigurationProperties.getIndentIncrement();
>>             for(let i : number = 0; i < indentLevel; i++)
>> {indent.append(indentCharacter);}
>>             if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
>> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getDEF(),org.web3d.x3d.jsail.X3DConcreteNode.DEF_DEFAULT_VALUE))) {
>>                 stringClassicVRML.append("DEF
>> ").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getDEF())).append("
>> ");
>>             }
>>             if(!/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
>> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getUSE(),org.web3d.x3d.jsail.X3DConcreteNode.USE_DEFAULT_VALUE))) {
>>                 stringClassicVRML.append("USE
>> ").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getUSE())).append("\n");
>>             } else {
>>                 stringClassicVRML.append("Transform").append(" { ");
>>                 if(hasAttributes || hasChild) {
>>
>> stringClassicVRML.append("\n").append(indent).append(indentCharacter);
>>                 }
>>                 if(hasAttributes) {
>>                     let hasISconnect : boolean = (this.getIS() != null)
>> && !this.getIS().getConnectList().isEmpty();
>>                     if(hasISconnect) {
>>                         for(let
>> index3681=this.getIS().getConnectList().iterator();index3681.hasNext();) {
>>                             let element = index3681.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"bboxCenter"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("bboxCenter").append(" IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else
>> if(!java.util.Arrays.equals(this.getBboxCenter(),
>> TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("bboxCenter
>> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxCenter())).append("\n").append(indent).append(indentCharacter);
>>                     }
>>                     if(hasISconnect) {
>>                         for(let
>> index3682=this.getIS().getConnectList().iterator();index3682.hasNext();) {
>>                             let element = index3682.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"bboxSize"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("bboxSize").append(" IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else
>> if(!java.util.Arrays.equals(this.getBboxSize(),
>> TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("bboxSize
>> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getBboxSize())).append("\n").append(indent).append(indentCharacter);
>>                     }
>>                     if(hasISconnect) {
>>                         for(let
>> index3683=this.getIS().getConnectList().iterator();index3683.hasNext();) {
>>                             let element = index3683.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"center"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("center").append(" IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else if(!java.util.Arrays.equals(this.getCenter(),
>> TransformObject.CENTER_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("center
>> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getCenter())).append("\n").append(indent).append(indentCharacter);
>>                     }
>>                     if(hasISconnect) {
>>                         for(let
>> index3684=this.getIS().getConnectList().iterator();index3684.hasNext();) {
>>                             let element = index3684.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"class"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("class").append(" IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else if(!/* equals */(<any>((o1: any, o2: any) => {
>> if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getCssClass(),org.web3d.x3d.jsail.X3DConcreteNode.CLASS_DEFAULT_VALUE))
>> || org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("# class
>> ").append("\"").append(org.web3d.x3d.jsail.fields.SFStringObject.toString(this.getCssClass())).append("\"").append("\n").append(indent).append(indentCharacter);
>>                     }
>>                     if(hasISconnect) {
>>                         for(let
>> index3685=this.getIS().getConnectList().iterator();index3685.hasNext();) {
>>                             let element = index3685.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"rotation"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("rotation").append(" IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else
>> if(!java.util.Arrays.equals(this.getRotation(),
>> TransformObject.ROTATION_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("rotation
>> ").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getRotation())).append("\n").append(indent).append(indentCharacter);
>>                     }
>>                     if(hasISconnect) {
>>                         for(let
>> index3686=this.getIS().getConnectList().iterator();index3686.hasNext();) {
>>                             let element = index3686.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"scale"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("scale").append(" IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else if(!java.util.Arrays.equals(this.getScale(),
>> TransformObject.SCALE_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("scale
>> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getScale())).append("\n").append(indent).append(indentCharacter);
>>                     }
>>                     if(hasISconnect) {
>>                         for(let
>> index3687=this.getIS().getConnectList().iterator();index3687.hasNext();) {
>>                             let element = index3687.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"scaleOrientation"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("scaleOrientation").append("
>> IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else
>> if(!java.util.Arrays.equals(this.getScaleOrientation(),
>> TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("scaleOrientation
>> ").append(org.web3d.x3d.jsail.fields.SFRotationObject.toString(this.getScaleOrientation())).append("\n").append(indent).append(indentCharacter);
>>                     }
>>                     if(hasISconnect) {
>>                         for(let
>> index3688=this.getIS().getConnectList().iterator();index3688.hasNext();) {
>>                             let element = index3688.next();
>>                             {
>>                                 if(/* equals */(<any>((o1: any, o2: any)
>> => { if(o1 && o1.equals) { return o1.equals(o2); } else { return o1 === o2;
>> } })(element.getNodeField(),"translation"))) {
>>
>> stringClassicVRML.append(indentCharacter).append("translation").append(" IS
>> ").append(element.getProtoField()).append("\n").append(indent).append(indentCharacter);
>>                                 }
>>                             }
>>                         }
>>                     } else
>> if(!java.util.Arrays.equals(this.getTranslation(),
>> TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$()) ||
>> org.web3d.x3d.jsail.ConfigurationProperties.isShowDefaultAttributes()) {
>>                         stringClassicVRML.append("translation
>> ").append(org.web3d.x3d.jsail.fields.SFVec3fObject.toString(this.getTranslation())).append("\n").append(indent).append(indentCharacter);
>>                     }
>>                 }
>>             }
>>             if(hasChild) {
>>                 if(this.metadata != null) {
>>
>> stringClassicVRML.append(indentCharacter).append("metadata").append(" ");
>>
>> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).toStringClassicVRML$int(indentLevel
>> + indentIncrement));
>>                     stringClassicVRML.append(indent);
>>                 } else if(this.metadataProtoInstance != null) {
>>
>> stringClassicVRML.append(indentCharacter).append("metadata").append(" ");
>>
>> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).toStringClassicVRML$int(indentLevel
>> + indentIncrement));
>>                     stringClassicVRML.append(indent);
>>                 }
>>                 if(this.IS != null) {
>>
>> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).toStringClassicVRML$int(indentLevel));
>>                 }
>>                 if(this.children.size() > 0) {
>>
>> stringClassicVRML.append(indentCharacter).append(indentCharacter).append("children").append("
>> [").append("\n").append(indent).append(indentCharacter).append(indentCharacter);
>>                     for(let
>> index3689=this.children.iterator();index3689.hasNext();) {
>>                         let element = index3689.next();
>>                         {
>>
>> stringClassicVRML.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>element).toStringClassicVRML$int(indentLevel
>> + indentIncrement + indentIncrement));
>>                         }
>>                     }
>>
>> stringClassicVRML.append(indent).append(indentCharacter).append(indentCharacter).append("]").append("\n").append(indent);
>>                 }
>>             }
>>             if(hasAttributes || hasChild) {
>>                 stringClassicVRML.append("}").append("\n");
>>             }
>>             return stringClassicVRML.toString();
>>         }
>>
>>         /**
>>          * Recursive method to provide ClassicVRML string serialization.
>>          * @param {number} indentLevel number of levels of indentation
>> for this element
>>          * @see X3DObject#FILE_EXTENSION_CLASSICVRML
>>          * @see <a href="
>> https://www.web3d.org/x3d/content/examples/X3dResources.html#VRML">X3D
>> Resources: Virtual Reality Modeling Language (VRML) 97</a>
>>          * @see <a href="
>> https://www.web3d.org/documents/specifications/19776-2/V3.3/Part02/X3D_ClassicVRML.html">Extensible
>> 3D (X3D) encodings Part 2: Classic VRML encoding</a>
>>          * @see <a href="
>> https://www.web3d.org/documents/specifications/19776-2/V3.3/Part02/grammar.html">Extensible
>> 3D (X3D) encodings Part 2: Classic VRML encoding, Annex A: Grammar</a>
>>          * @return {string} ClassicVRML string
>>          */
>>         public toStringClassicVRML(indentLevel? : any) : any {
>>             if(((typeof indentLevel === 'number') || indentLevel ===
>> null)) {
>>                 return <any>this.toStringClassicVRML$int(indentLevel);
>>             } else if(indentLevel === undefined) {
>>                 return <any>this.toStringClassicVRML$();
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public toStringVRML97$int(indentLevel : number) : string {
>>             return this.toStringClassicVRML$int(indentLevel);
>>         }
>>
>>         /**
>>          * Recursive method to provide VRML97 string serialization.
>>          * @param {number} indentLevel number of levels of indentation
>> for this element
>>          * @see X3DObject#FILE_EXTENSION_VRML97
>>          * @see <a href="
>> https://www.web3d.org/x3d/content/examples/X3dResources.html#VRML">X3D
>> Resources: Virtual Reality Modeling Language (VRML) 97</a>
>>          * @see <a href="
>> https://www.web3d.org/documents/specifications/14772/V2.0/index.html">Virtual
>> Reality Modeling Language (VRML) 97 specification</a>
>>          * @see <a href="
>> https://www.web3d.org/documents/specifications/14772-1/V2.1/index.html">VRML
>> 97 v2.1 Amendment</a>
>>          * @return {string} VRML97 string
>>          */
>>         public toStringVRML97(indentLevel? : any) : any {
>>             if(((typeof indentLevel === 'number') || indentLevel ===
>> null)) {
>>                 return <any>this.toStringVRML97$int(indentLevel);
>>             } else if(indentLevel === undefined) {
>>                 return <any>this.toStringVRML97$();
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         public findElementByNameValue$java_lang_String(nameValue :
>> string) : org.web3d.x3d.jsail.X3DConcreteElement {
>>             return
>> this.findElementByNameValue$java_lang_String$java_lang_String(nameValue,
>> "");
>>         }
>>
>>         public
>> findElementByNameValue$java_lang_String$java_lang_String(nameValue :
>> string, elementName : string) : org.web3d.x3d.jsail.X3DConcreteElement {
>>             if((nameValue == null) || /* isEmpty */(nameValue.length ===
>> 0)) {
>>                 let errorNotice : string = "findElementByNameValue(\"\",
>> " + elementName + ") cannot use empty string to find a name attribute";
>>                 this.validationResult.append(errorNotice).append("\n");
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>>             }
>>             let referenceElement : org.web3d.x3d.jsail.X3DConcreteElement;
>>             for(let
>> index3690=this.children.iterator();index3690.hasNext();) {
>>                 let element = index3690.next();
>>                 {
>>                     if(element != null && element instanceof
>> <any>org.web3d.x3d.jsail.X3DConcreteElement) {
>>                         referenceElement =
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
>> elementName);
>>                         if(referenceElement != null) return
>> referenceElement;
>>                     }
>>                 }
>>             }
>>             if(this.IS != null) {
>>                 referenceElement =
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
>> elementName);
>>                 if(referenceElement != null) return referenceElement;
>>             }
>>             if(this.metadata != null) {
>>                 referenceElement =
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
>> elementName);
>>                 if(referenceElement != null) return referenceElement;
>>             }
>>             if(this.metadataProtoInstance != null) {
>>                 referenceElement =
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).findElementByNameValue$java_lang_String$java_lang_String(nameValue,
>> elementName);
>>                 if(referenceElement != null) return referenceElement;
>>             }
>>             return null;
>>         }
>>
>>         /**
>>          * Recursive method to provide object reference to node or
>> statement by name attribute, if found as part of this element or in a
>> contained element.
>>          * Elements with name fields include meta, Metadata* nodes,
>> field/fieldValue, ProtoDeclare/ExternProtoDeclare/ProtoInstance, CAD and
>> HAnim nodes.
>>          * <br ><br >
>>          * <i>Warning:</i> first start with findAncestorSceneObject() to
>> check entire scene graph, or findAncestorX3DObject() to check entire model
>> document.
>>          * <br ><br >
>>          * <i>Warning:</i> more than one element may be found that has
>> the same name, this method does not handle that case.
>>          * @see #findNodeByDEF(String)
>>          * @see X3DConcreteElement#hasAncestorSceneObject()
>>          * @see
>> org.web3d.x3d.jsail.X3DConcreteElement#findAncestorX3DObject()
>>          * @param {string} nameValue is value of the name field being
>> searched for in this element and child elements(if any)
>>          * @param {string} elementName identifies the element of interest
>> (meta MetadataString ProtoDeclare CADassembly ProtoInstance HAnimHumanoid
>> etc.)
>>          * @return {org.web3d.x3d.jsail.X3DConcreteElement} object
>> reference to found element, null otherwise
>>          */
>>         public findElementByNameValue(nameValue? : any, elementName? :
>> any) : any {
>>             if(((typeof nameValue === 'string') || nameValue === null) &&
>> ((typeof elementName === 'string') || elementName === null)) {
>>                 return
>> <any>this.findElementByNameValue$java_lang_String$java_lang_String(nameValue,
>> elementName);
>>             } else if(((typeof nameValue === 'string') || nameValue ===
>> null) && elementName === undefined) {
>>                 return
>> <any>this.findElementByNameValue$java_lang_String(nameValue);
>>             } else throw new Error('invalid overload');
>>         }
>>
>>         /**
>>          * Recursive method to determine whether node or statement with
>> given name attribute is found, meaning both objects are attached to same
>> scene graph.
>>          * @param {string} nameValue is value of the name field being
>> searched for in this element and child elements(if any)
>>          * @param {string} elementName identifies the element of interest
>> (meta MetadataString ProtoDeclare CADassembly ProtoInstance HAnimHumanoid
>> etc.)
>>          * @see #findElementByNameValue(String, String)
>>          * @return {boolean} whether node is found
>>          */
>>         public hasElementByNameValue(nameValue : string, elementName :
>> string) : boolean {
>>             return
>> (this.findElementByNameValue$java_lang_String$java_lang_String(nameValue,
>> elementName) != null);
>>         }
>>
>>         /**
>>          * Recursive method to provide object reference to node by DEF,
>> if found as this node or in a contained node.
>>          * <br ><br >
>>          * <i>Warning:</i> first start with findAncestorSceneObject() to
>> check entire scene graph, or findAncestorX3DObject() to check entire model
>> document.
>>          * <br ><br >
>>          * <i>Warning:</i> more than one element may be found that has
>> the same DEF, this method does not handle that case.
>>          * @see #findElementByNameValue(String)
>>          * @see X3DConcreteElement#hasAncestorSceneObject()
>>          * @see
>> org.web3d.x3d.jsail.X3DConcreteElement#findAncestorX3DObject()
>>          * @param {string} DEFvalue is value of the name field being
>> searched for in this element and child elements(if any)
>>          * @return {org.web3d.x3d.jsail.X3DConcreteNode} object reference
>> to found node, null otherwise
>>          */
>>         public findNodeByDEF(DEFvalue : string) :
>> org.web3d.x3d.jsail.X3DConcreteNode {
>>             if((DEFvalue == null) || /* isEmpty */(DEFvalue.length ===
>> 0)) {
>>                 let errorNotice : string = "findNodeByDEF(\"\") cannot
>> use empty string to find a name";
>>                 this.validationResult.append(errorNotice).append("\n");
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>>             }
>>             if(/* equals */(<any>((o1: any, o2: any) => { if(o1 &&
>> o1.equals) { return o1.equals(o2); } else { return o1 === o2; }
>> })(this.getDEF(),DEFvalue))) return this;
>>             let referenceNode : org.web3d.x3d.jsail.X3DConcreteNode;
>>             for(let
>> index3691=this.children.iterator();index3691.hasNext();) {
>>                 let element = index3691.next();
>>                 {
>>                     if(element != null && element instanceof
>> <any>org.web3d.x3d.jsail.X3DConcreteNode) {
>>                         referenceNode =
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).findNodeByDEF(DEFvalue);
>>                         if(referenceNode != null) return referenceNode;
>>                     }
>>                 }
>>             }
>>             if(this.IS != null) {
>>                 referenceNode =
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).findNodeByDEF(DEFvalue);
>>                 if(referenceNode != null) return referenceNode;
>>             }
>>             if(this.metadata != null) {
>>                 referenceNode =
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).findNodeByDEF(DEFvalue);
>>                 if(referenceNode != null) return referenceNode;
>>             }
>>             if(this.metadataProtoInstance != null) {
>>                 referenceNode =
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).findNodeByDEF(DEFvalue);
>>                 if(referenceNode != null) return referenceNode;
>>             }
>>             return null;
>>         }
>>
>>         /**
>>          * Recursive method to determine whether node with DEFvalue is
>> found, meaning both objects are attached to same scene graph.
>>          * @param {string} DEFvalue is value of the name field being
>> searched for in this element and child elements(if any)
>>          * @see #findNodeByDEF(String)
>>          * @return {boolean} whether node is found
>>          */
>>         public hasNodeByDEF(DEFvalue : string) : boolean {
>>             return (this.findNodeByDEF(DEFvalue) != null);
>>         }
>>
>>         /**
>>          * Recursive method to validate this element plus all contained
>> nodes and statements,
>>          * using both datatype-specification value checks and regular
>> expression (regex) checking of corresponding string values.
>>          * @return {string} validation results (if any)
>>          */
>>         public validate() : string {
>>             this.validationResult = new java.lang.StringBuilder();
>>             this.setBboxCenter$float_A(this.getBboxCenter());
>>             this.setBboxSize$float_A(this.getBboxSize());
>>             this.setCenter$float_A(this.getCenter());
>>             this.setRotation$float_A(this.getRotation());
>>             this.setScale$float_A(this.getScale());
>>             this.setScaleOrientation$float_A(this.getScaleOrientation());
>>             this.setTranslation$float_A(this.getTranslation());
>>             if(!this.isUSE()) this.setDEF$java_lang_String(this.getDEF());
>>             if(this.isUSE()) this.setUSE$java_lang_String(this.getUSE());
>>             this.setCssClass$java_lang_String(this.getCssClass());
>>             for(let
>> index3692=this.children.iterator();index3692.hasNext();) {
>>                 let element = index3692.next();
>>                 {
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>element).validate();
>>
>> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>element).getValidationResult());
>>                 }
>>             }
>>
>> this.setChildren$org_web3d_x3d_sai_Core_X3DNode_A(this.getChildren());
>>             if(this.isUSE() && this.hasChildren()) {
>>                 let errorNotice : string = "Transform USE=\'" +
>> this.getUSE() + "\' is not allowed to have contained MFNode children";
>>                 this.validationResult.append(errorNotice);
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>>             }
>>             if(this.IS != null) {
>>                 this.setIS(this.getIS());
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).validate();
>>
>> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.IS).getValidationResult());
>>             }
>>             if(this.isUSE() && this.hasIS()) {
>>                 let errorNotice : string = "Transform USE=\'" +
>> this.getUSE() + "\' is not allowed to have contained SFNode IS";
>>                 this.validationResult.append(errorNotice);
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>>             }
>>             if(this.metadata != null) {
>>
>> this.setMetadata$org_web3d_x3d_sai_Core_X3DMetadataObject(this.getMetadata());
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).validate();
>>
>> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement><any>this.metadata).getValidationResult());
>>             }
>>             if(this.metadataProtoInstance != null) {
>>
>> this.setMetadata$org_web3d_x3d_jsail_Core_ProtoInstanceObject(this.getMetadataProtoInstance());
>>
>> (<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).validate();
>>
>> this.validationResult.append((<org.web3d.x3d.jsail.X3DConcreteElement>this.metadataProtoInstance).getValidationResult());
>>             }
>>             if((this.metadata != null) && (this.metadataProtoInstance !=
>> null)) {
>>                 let errorNotice : string = "Internal X3DJSAIL error:
>> incorrect handling of contained SFNode field, both metadata and
>> metadataProtoInstance are set simultaneously";
>>                 this.validationResult.append(errorNotice);
>>                 throw new
>> org.web3d.x3d.sai.InvalidProtoException(errorNotice);
>>             }
>>             if(this.isUSE() && this.hasMetadata()) {
>>                 let errorNotice : string = "Transform USE=\'" +
>> this.getUSE() + "\' is not allowed to have contained SFNode metadata";
>>                 this.validationResult.append(errorNotice);
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldValueException(errorNotice);
>>             }
>>             if(this.getIS() != null) {
>>                 if(this.getIS().getConnectList().isEmpty()) {
>>                     let errorNotice : string = "IS statement present, but
>> contains no connect statements";
>>
>> this.validationResult.append(errorNotice).append("\n");
>>                     throw new
>> org.web3d.x3d.sai.InvalidProtoException(errorNotice);
>>                 }
>>             }
>>             if(!/* isEmpty */(this.getContainerFieldOverride().length ===
>> 0) &&
>> !java.util.Arrays.asList<any>(this.containerField_ALTERNATE_VALUES).contains(this.getContainerFieldOverride()))
>> {
>>                 let errorNotice : string =
>> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_ILLEGAL_VALUE + ":
>> illegal value encountered, containerField=\'" +
>> this.getContainerFieldOverride() + "\' but allowed values are
>> containerField_ALTERNATE_VALUES=\'" + new
>> org.web3d.x3d.jsail.fields.MFStringObject(this.containerField_ALTERNATE_VALUES).toStringX3D()
>> + "\'.";
>>                 this.validationResult.append(errorNotice).append("\n");
>>                 throw new
>> org.web3d.x3d.sai.InvalidFieldException(errorNotice);
>>             }
>>             if(this.findAncestorX3DObject() != null) {
>>                 let modelProfile : string =
>> this.findAncestorX3DObject().getProfile();
>>                 let hasSatisfactorySupport : boolean =
>> this.findAncestorX3DObject().supportsX3dComponent(TransformObject.COMPONENT,
>> TransformObject.LEVEL);
>>                 if(!hasSatisfactorySupport) {
>>                     let errorNotice : string =
>> org.web3d.x3d.jsail.ConfigurationProperties.ERROR_ILLEGAL_VALUE + "
>> insufficient X3D profile=\'" + modelProfile + "\' for parent X3D model
>> containing \'Transform\' node, add head statement <component
>> name=\'Grouping\' level=\'1\'/>\nor Java source-code assignment:
>>  findAncestorX3DObject().getHead().addComponent(\"Grouping\").setLevel(1);";
>>
>> this.validationResult.append(errorNotice).append("\n");
>>                     throw new
>> org.web3d.x3d.sai.InvalidFieldException(errorNotice);
>>                 }
>>             }
>>             return this.validationResult.toString();
>>         }
>>     }
>>     TransformObject["__class"] =
>> "org.web3d.x3d.jsail.Grouping.TransformObject";
>>     TransformObject["__interfaces"] =
>> ["org.web3d.x3d.sai.Grouping.Transform","org.web3d.x3d.sai.Core.X3DNode","org.web3d.x3d.sai.Grouping.X3DBoundedObject","org.web3d.x3d.sai.Grouping.X3DGroupingNode","org.web3d.x3d.sai.Core.X3DChildNode"];
>>
>>
>> }
>>
>>
>>
>> org.web3d.x3d.jsail.Grouping.TransformObject.TRANSLATION_DEFAULT_VALUE_$LI$();
>>
>>
>> org.web3d.x3d.jsail.Grouping.TransformObject.SCALEORIENTATION_DEFAULT_VALUE_$LI$();
>>
>> org.web3d.x3d.jsail.Grouping.TransformObject.SCALE_DEFAULT_VALUE_$LI$();
>>
>>
>> org.web3d.x3d.jsail.Grouping.TransformObject.ROTATION_DEFAULT_VALUE_$LI$();
>>
>> org.web3d.x3d.jsail.Grouping.TransformObject.CENTER_DEFAULT_VALUE_$LI$();
>>
>>
>> org.web3d.x3d.jsail.Grouping.TransformObject.BBOXSIZE_DEFAULT_VALUE_$LI$();
>>
>>
>> org.web3d.x3d.jsail.Grouping.TransformObject.BBOXCENTER_DEFAULT_VALUE_$LI$();
>>
>> On Thu, Apr 9, 2020 at 6:52 PM John Carlson <yottzumm at gmail.com> wrote:
>>
>>> Matrix transform class implementation in different toolkits:
>>>
>>> X3DOM:
>>> https://github.com/x3dom/x3dom/blob/master/src/nodes/Grouping/Transform.js
>>>
>>> X_ITE:
>>> https://github.com/create3000/x_ite/blob/master/src/x_ite/Components/Grouping/Transform.js
>>>
>>> Three.js:
>>> https://threejs.org/docs/#manual/en/introduction/Matrix-transformations
>>>
>>> TypeScript: TBD, not checked in.  Cannot unpack zip on my server.
>>>
>>>
>>> On Thu, Apr 9, 2020 at 12:07 AM John Carlson <yottzumm at gmail.com> wrote:
>>>
>>>> Trying to understand why SAI is so difficult to take out of X_ITE and
>>>> put in X3DOM.
>>>>
>>>> Under x3dom, there's:
>>>>
>>>> ~/x3dom/src/nodes (master)
>>>> $ ls
>>>> BVHRefiner/            Geometry3D/     Navigation/            Sound/
>>>> CADGeometry/           Geometry3DExt/  Networking/            Text/
>>>> Core/                  Geospatial/     NURBS/                 Texturing/
>>>> CubeMapTexturing/      Grouping/       PointingDeviceSensor/
>>>>  Texturing3D/
>>>> EnvironmentalEffects/  H-Anim/         Rendering/             Time/
>>>> EventUtilities/        Interpolation/  RigidBodyPhysics/
>>>>  VolumeRendering/
>>>> Followers/             Layout/         Shaders/
>>>> Geometry2D/            Lighting/       Shape/
>>>>
>>>> Under X_ITE, there's:
>>>>
>>>> ~/x_ite/src/x_ite (master)
>>>> $ ls Browser/ Components
>>>> Browser/:
>>>> Core/                  Navigation/            Sound/
>>>> EnvironmentalEffects/  Networking/            Text/
>>>> Followers/             NURBS/                 Texturing/
>>>> Geometry2D/            ParticleSystems/       Texturing3D/
>>>> Geometry3D/            Picking/               Time/
>>>> Geospatial/            PointingDeviceSensor/  VERSION.js
>>>> Interpolation/         Rendering/             VolumeRendering/
>>>> KeyDeviceSensor/       RigidBodyPhysics/      X3DBrowser.js
>>>> Layering/              Scripting/             X3DBrowserContext.js
>>>> Layout/                Shaders/
>>>> Lighting/              Shape/
>>>>
>>>> Components:
>>>> Annotation/              H-Anim/                    Rendering/
>>>> CADGeometry/             Interpolation/             Rendering.js
>>>> Core/                    Interpolation.js           RigidBodyPhysics/
>>>> Core.js                  KeyDeviceSensor/           Scripting/
>>>> CubeMapTexturing/        Layering/                  Shaders/
>>>> DIS/                     Layering.js                Shaders.js
>>>> EnvironmentalEffects/    Layout/                    Shape/
>>>> EnvironmentalEffects.js  Lighting/                  Shape.js
>>>> EnvironmentalSensor/     Lighting.js                Sound/
>>>> EnvironmentalSensor.js   Navigation/                Sound.js
>>>> EventUtilities/          Navigation.js              Text/
>>>> Followers/               Networking/                Text.js
>>>> Followers.js             Networking.js              Texturing/
>>>> Geometry2D/              NURBS/                     Texturing.js
>>>> Geometry3D/              ParticleSystems/           Texturing3D/
>>>> Geometry3D.js            Picking/                   Time/
>>>> Geospatial/              PointingDeviceSensor/      Time.js
>>>> Grouping/                PointingDeviceSensor.js    VolumeRendering/
>>>> Grouping.js              ProjectiveTextureMapping/  X_ITE/
>>>>
>>>>
>>>> Suggestion:  We create test cases with X3dToES5.xslt (or similar)
>>>> targeting X_ITE's SAI.  Once we have that working satisfactorily, we go
>>>> ahead and write either an XSLT file or Python file to generate additional
>>>> classes not currently covered by X_ITE.
>>>>
>>>> I think that Holger would appreciate the additional help on testing and
>>>> fleshing out the X_ITE SAI.
>>>>
>>>> This seems like a good thing to do, and I am accepting of it.
>>>>
>>>> John
>>>>
>>>>
>>>>
>>>> On Wed, Mar 25, 2020 at 8:47 AM Andreas Plesch <andreasplesch at gmail.com>
>>>> wrote:
>>>>
>>>>> Hi John, Don,
>>>>>
>>>>> I am trying to follow the discussion somewhat but have quite limited
>>>>> availability now.
>>>>>
>>>>> Here are some considerations, unfortunately quite unconnected.
>>>>>
>>>>> Ecmascript best practices
>>>>>
>>>>> It is not clear that there are commonly accepted standards since the
>>>>> language is forgiving having evolved so much. But here are perhaps
>>>>> some guides. An often encountered viewpoint is that the language is
>>>>> not very OO oriented but rather functional in nature. So OO principles
>>>>> do not necessarily apply but could be used anyways. There are now
>>>>> classes in Ecmascript although my understanding is that they are
>>>>> largely considered syntactical sugar. Another principle is that since
>>>>> it is a largely interpreted language which relies on garbage
>>>>> collection, object reuse is favored over object creation and
>>>>> destruction. Three.js, for example, is very strict about this, and
>>>>> part of the reason why it is performing well. x3dom is not very strict
>>>>> about this on the other hand, and still does ok. As node.js is a
>>>>> target one needs to be careful to distinguish between DOM/browser
>>>>> features and language features. Node.js natively does not have DOM
>>>>> methods but a DOM and methods can be added with a library. Also, keep
>>>>> in mind that currently there is no X3D runtime for node.js.
>>>>> x3dom/x_ite cannot be run in node.js. So one, expensive, experiment
>>>>> would be to try to extract a node compatible runtime by separating the
>>>>> rendering and input controls out of these engines.
>>>>>
>>>>> Scene Authoring/Construction versus Scene Access
>>>>>
>>>>> Ecmascript differs from Python or Java in that it is the primary
>>>>> language for X3D scripts used internally in scenes, and externally to
>>>>> access scenes in running browsers. This is what the current SAI spec.
>>>>> defines, and what I understand to be Scene Access. This includes but
>>>>> is not limited to constructing new nodes and entire scenes
>>>>> programmatically. In addition to construction, SAI also allows for
>>>>> controling a browser, and modifying a running scene. In contrast,
>>>>> X3DJ/PSAIL is limited to constructing and authoring a scene which can
>>>>> eventually be serialized as xml or json, and be used to load into X3D
>>>>> browser. It seems perhaps prudent for now to parallel X3DJSAIL and
>>>>> just focus on scene authoring, and not be concerned about live scene
>>>>> control and modification.
>>>>>
>>>>> JSON
>>>>>
>>>>> Since the X3D JSON encoding now exists, a useful and specific question
>>>>> is if the Ecmascript JSON.parse() function
>>>>> (
>>>>> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
>>>>> )
>>>>> should return a value which can be immediately used by the envisioned
>>>>> library given a JSON encoded string. Conversely, should the Ecmascript
>>>>> JSON.stringify() function generate directly X3D JSON encoding if given
>>>>> a library generated object ?
>>>>>
>>>>> -Andreas
>>>>>
>>>>>
>>>>>
>>>>> On Tue, Mar 24, 2020 at 9:20 AM Don Brutzman <brutzman at nps.edu> wrote:
>>>>> >
>>>>> > John, certainly we need to pay attention to "how" a library
>>>>> conversion is performed.  JSweet is promising, and we have a number of
>>>>> conversion approached demonstrated already.
>>>>> >
>>>>> > But that is distracting and confusing way to solve a problem and
>>>>> leads to "fire, ready, aim!" implementation pathologies.
>>>>> >
>>>>> > A further risk might be that JSweet might carry through unnecessary
>>>>> Java programming idioms, but presumably they have sorted through that well
>>>>> already.
>>>>> >
>>>>> > First things first, please.  Let's begin with defining design
>>>>> goals.  That's how we accomplished creating Java and Python
>>>>> programming-language bindings for X3D.
>>>>> >
>>>>> > What we really need to understand is "what" a sharable X3D
>>>>> JavaScript library looks like, and how JavaScript programmers might then
>>>>> use it to author interactive X3D models.
>>>>> >
>>>>> > Authoring use-case environments are
>>>>> > 1. Script inside X3D scene graph,
>>>>> > 2. Script in outer HTML5 web page,
>>>>> > 3. Standalone programmatic use in node.js
>>>>> >
>>>>> > Now get specific.  Recommend listing pseudocode and design patterns
>>>>> for JavaScript Transform class and JavaScript X3D types, comparing:
>>>>> >
>>>>> > a. X3D ECMAScript specification,
>>>>> > b. X3D Script code fields (class variables) and methods,
>>>>> > c. good general-practice OO design pattern(s) in common use,
>>>>> > d. current X3D JSON approach, is it OK or improvable further?
>>>>> > e. compare/contrast Transform approach with X3DJSONLD,
>>>>> > f. compare/contrast Transform approach with X_ITE,
>>>>> > g. compare/contrast Transform approach with X3DOM,
>>>>> > h. compare/contrast Transform approach with three.js,
>>>>> > j. compare/contrast Transform approach with any other javascript
>>>>> libraries of interest,
>>>>> > i. compatibility of Transform approach with Angular, React, jquery,
>>>>> other common JavaScript frameworks for HTML.
>>>>> >
>>>>> > We did this kind of comparison for X3D JSON design and it helped
>>>>> make a confusing understandable, eventually leading to good design
>>>>> decisions.
>>>>> >
>>>>> > If interested parties prepare this kind of comparison, and
>>>>> understand "what" we want that has general appeal, then progress refinement
>>>>> will be straightforward.
>>>>> >
>>>>> > Many people use JavaScript these days, especially with node.js -
>>>>> check whether they like the result.
>>>>> >
>>>>> > When you have solid patterns then we convert 4,000 X3D example
>>>>> scenes (from .x3d -> .js) to match, providing unit tests.  Lather, rinse,
>>>>> repeat...
>>>>> >
>>>>> > Hope this outline helps.  Good luck out there!  8)
>>>>> >
>>>>> > all the best, Don
>>>>> > --
>>>>> > Don Brutzman  Naval Postgraduate School, Code USW/Br
>>>>> brutzman at nps.edu
>>>>> > Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA
>>>>>  +1.831.656.2149
>>>>> > X3D graphics, virtual worlds, navy robotics
>>>>> http://faculty.nps.edu/brutzman
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Andreas Plesch
>>>>> Waltham, MA 02453
>>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20200409/3a4187b3/attachment-0001.html>


More information about the x3d-public mailing list