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