@prefix :        <https://www.web3d.org/x3d/content/examples/Basic/CAD/CadGeometryPrototypes.ttl#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema:  <http://schema.org/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix x3d:     <https://www.web3d.org/specifications/x3d-4.1.xsd#> .
@prefix x3do:    <https://www.web3d.org/specifications/X3dOntology4.1#> .

:X3D a owl:NamedIndividual, x3do:X3D ;
  x3do:hasHead :head ;
  x3do:hasScene :Scene ;
  x3do:profile 'Immersive' ;
  x3do:version '3.1' ;
  x3do:noNamespaceSchemaLocation 'https://www.web3d.org/specifications/x3d-3.1.xsd' .
:head a owl:NamedIndividual, x3do:head ;
  x3do:hasParent :X3D ;
  x3do:hasMeta :meta_1_1, :meta_1_2, :meta_1_3, :meta_1_4, :meta_1_5, :meta_1_6, :meta_1_7, :meta_1_8, :meta_1_9, :meta_1_10, :meta_1_11, :meta_1_12, :meta_1_13, :meta_1_14, :meta_1_15 .
:meta_1_1 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'CadGeometryPrototypes.x3d' ;
  x3do:name 'title' .
:meta_1_2 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'This scene provides tool developers with X3D Amendment 1 CAD Component node prototypes, providing backwards compatibility with VRML97 and X3D v3.0.' ;
  x3do:name 'description' .
:meta_1_3 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'Travis Rauch, Alan Shaffer, Mounir Sidhom, Patrick Sullivan and Don Brutzman' ;
  x3do:name 'creator' .
:meta_1_4 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content '28 April 2005' ;
  x3do:name 'created' .
:meta_1_5 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content '2 December 2024' ;
  x3do:name 'modified' .
:meta_1_6 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'Do not use these prototypes in an up-to-date X3D browser that already provides CAD support.' ;
  x3do:name 'warning' .
:meta_1_7 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'Recommended practice: avoid using these prototypes, instead use native definitions for CAD nodes using an up-to-date X3D browser.' ;
  x3do:name 'info' .
:meta_1_8 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'These scenes are not intended for regular authoring - use X3D v3.2+ CAD component instead. Example scenes using these prototypes do not get support for making embdedded metadata values visible at run time, though metadata can certainly be saved in the scene file OK.' ;
  x3do:name 'info' .
:meta_1_9 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'CadGeometryExternPrototypes.x3d' ;
  x3do:name 'reference' .
:meta_1_10 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'https://www.web3d.org/files/specifications/19775-1/V3.3/Part01/components/CADGeometry.html' ;
  x3do:name 'reference' .
:meta_1_11 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'https://www.web3d.org/files/specifications/19775-1/V3.3/Part01/CADInterchange.html' ;
  x3do:name 'reference' .
:meta_1_12 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'CADAssembly CADFace CADLayer CADPart IndexedQuadSet QuadSet' ;
  x3do:name 'subject' .
:meta_1_13 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'https://www.web3d.org/x3d/content/examples/Basic/CAD/CadGeometryPrototypes.x3d' ;
  x3do:name 'identifier' .
:meta_1_14 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content 'X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit' ;
  x3do:name 'generator' .
:meta_1_15 a owl:NamedIndividual, x3do:meta ;
  x3do:hasParent :head ;
  x3do:content '../license.html' ;
  x3do:name 'license' .
:meta dcterms:title "CadGeometryPrototypes.x3d" .
:meta dcterms:description "This scene provides tool developers with X3D Amendment 1 CAD Component node prototypes, providing backwards compatibility with VRML97 and X3D v3.0." .
:meta dcterms:creator "Travis Rauch, Alan Shaffer, Mounir Sidhom, Patrick Sullivan and Don Brutzman" .
:meta dcterms:created "28 April 2005" .
:meta dcterms:modified "2 December 2024" .
:meta dcterms:warning "Do not use these prototypes in an up-to-date X3D browser that already provides CAD support." .
:meta dcterms:info "Recommended practice: avoid using these prototypes, instead use native definitions for CAD nodes using an up-to-date X3D browser." .
:meta dcterms:info "These scenes are not intended for regular authoring - use X3D v3.2+ CAD component instead. Example scenes using these prototypes do not get support for making embdedded metadata values visible at run time, though metadata can certainly be saved in the scene file OK." .
:meta dcterms:reference "CadGeometryExternPrototypes.x3d" .
:meta dcterms:reference "https://www.web3d.org/files/specifications/19775-1/V3.3/Part01/components/CADGeometry.html" .
:meta dcterms:reference "https://www.web3d.org/files/specifications/19775-1/V3.3/Part01/CADInterchange.html" .
:meta dcterms:subject "CADAssembly CADFace CADLayer CADPart IndexedQuadSet QuadSet" .
:meta dcterms:identifier "https://www.web3d.org/x3d/content/examples/Basic/CAD/CadGeometryPrototypes.x3d" .
:meta dcterms:generator "X3D-Edit 3.3, https://www.web3d.org/x3d/tools/X3D-Edit" .
:meta dcterms:license "../license.html" .
:Scene a owl:NamedIndividual, x3do:Scene ;
  x3do:hasParent :X3D ;
  x3do:hasChildren :WorldInfo_2_1, :Anchor_2_9, :Transform_2_10, :Transform_2_11, :ProtoInstance_2_12 ;
  x3do:hasProtoDeclare :ProtoDeclare_2_2, :ProtoDeclare_2_3, :ProtoDeclare_2_4, :ProtoDeclare_2_5, :ProtoDeclare_2_6, :ProtoDeclare_2_7, :ProtoDeclare_2_8 .
:WorldInfo_2_1 a owl:NamedIndividual, x3do:WorldInfo ;
  x3do:hasParent :Scene ;
  x3do:title 'CadGeometryPrototypes.x3d' .
:ProtoDeclare_2_2 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_2_1 ;
  x3do:hasProtoBody :ProtoBody_2_2_2 ;
  x3do:appinfo 'The IndexedQuadSet node represents a 3D shape composed of a collection of individual quadrilaterals (quads). IndexedQuadSet uses the indices in its index field to specify the vertices of each quad from the coord field. Each quad is formed from a set of four vertices of the Coordinate node identified by four consecutive indices from the index field If the index field does not contain a multiple of four coordinate values the remaining vertices shall be ignored.' ;
  x3do:documentation 'https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/CADGeometry.html#IndexedQuadSet' ;
  x3do:name 'IndexedQuadSet' .
:ProtoInterface_2_2_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_2 ;
  x3do:hasField :field_2_2_1_1, :field_2_2_1_2, :field_2_2_1_3, :field_2_2_1_4, :field_2_2_1_5, :field_2_2_1_6, :field_2_2_1_7, :field_2_2_1_8, :field_2_2_1_9, :field_2_2_1_10, :field_2_2_1_11, :field_2_2_1_12, :field_2_2_1_13 .
:field_2_2_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:appinfo 'range [0..∞) or -1' ;
  x3do:name 'set_index' ;
  x3do:type 'MFInt32' .
:field_2_2_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DVertexAttributeNode]' ;
  x3do:name 'attrib' ;
  x3do:type 'MFNode' .
:field_2_2_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DColorNode]' ;
  x3do:name 'color' ;
  x3do:type 'SFNode' .
:field_2_2_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DCoordinateNode]' ;
  x3do:name 'coord' ;
  x3do:type 'SFNode' .
:field_2_2_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[FogCoordinate]' ;
  x3do:name 'fogCoord' ;
  x3do:type 'SFNode' .
:field_2_2_1_6 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DNormalNode]' ;
  x3do:name 'normal' ;
  x3do:type 'SFNode' .
:field_2_2_1_7 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DTextureCoordinateNode]' ;
  x3do:name 'texCoord' ;
  x3do:type 'SFNode' .
:field_2_2_1_8 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'ccw' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_2_1_9 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'colorPerVertex ignored in IndexedQuadSet, and always treated as true' ;
  x3do:name 'colorPerVertex' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_2_1_10 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'normalPerVertex' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_2_1_11 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'solid' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_2_1_12 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'range [0..∞) or -1' ;
  x3do:name 'index' ;
  x3do:type 'MFInt32' .
:field_2_2_1_13 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_2_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DMetadataObject]' ;
  x3do:name 'metadata' ;
  x3do:type 'SFNode' .
:ProtoBody_2_2_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_2 ;
  x3do:hasGeometry :RenderedIQS ;
  x3do:hasChildren :UnrenderedIQS .
:RenderedIQS a owl:NamedIndividual, x3do:IndexedFaceSet ;
  x3do:hasParent :ProtoBody_2_2_2 ;
  x3do:hasIS :IS_2_2_2_1_1 ;
  x3do:DEF 'RenderedIQS' .
:IS_2_2_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :RenderedIQS ;
  x3do:hasConnect :connect_2_2_2_1_1_1, :connect_2_2_2_1_1_2, :connect_2_2_2_1_1_3, :connect_2_2_2_1_1_4, :connect_2_2_2_1_1_5, :connect_2_2_2_1_1_6, :connect_2_2_2_1_1_7, :connect_2_2_2_1_1_8, :connect_2_2_2_1_1_9, :connect_2_2_2_1_1_10 .
:connect_2_2_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'attrib' ;
  x3do:protoField 'attrib' .
:connect_2_2_2_1_1_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'color' ;
  x3do:protoField 'color' .
:connect_2_2_2_1_1_3 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'colorPerVertex' ;
  x3do:protoField 'colorPerVertex' .
:connect_2_2_2_1_1_4 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'coord' ;
  x3do:protoField 'coord' .
:connect_2_2_2_1_1_5 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'fogCoord' ;
  x3do:protoField 'fogCoord' .
:connect_2_2_2_1_1_6 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'normal' ;
  x3do:protoField 'normal' .
:connect_2_2_2_1_1_7 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'texCoord' ;
  x3do:protoField 'texCoord' .
:connect_2_2_2_1_1_8 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'ccw' ;
  x3do:protoField 'ccw' .
:connect_2_2_2_1_1_9 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'normalPerVertex' ;
  x3do:protoField 'normalPerVertex' .
:connect_2_2_2_1_1_10 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_1_1 ;
  x3do:nodeField 'solid' ;
  x3do:protoField 'solid' .
:UnrenderedIQS a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_2_2 ;
  x3do:hasChildren :IndexedQuadSetToIndexedFaceSet, :Group_2_2_2_2_2 ;
  x3do:DEF 'UnrenderedIQS' .
:IndexedQuadSetToIndexedFaceSet a owl:NamedIndividual, x3do:Script ;
  x3do:hasParent :UnrenderedIQS ;
  x3do:hasField :field_2_2_2_2_1_1, :field_2_2_2_2_1_2, :field_2_2_2_2_1_3, :field_2_2_2_2_1_4, :field_2_2_2_2_1_5 ;
  x3do:hasIS :IS_2_2_2_2_1_6 ;
  x3do:DEF 'IndexedQuadSetToIndexedFaceSet' ;
  x3do:directOutput true ;
  x3do:sourceCode """
ecmascript:

function initialize()
{
	//colorPerVertex ignored in IndexedQuadSet, and always treated as "true"
	RenderedIQS.colorPerVertex = true;

	// index is an array of quad indices. The ordering of
	// the vertices is ccw (counter-clockwise).

	// ensure legal index values
	for (ii=0; ii <= index.length-1; ii++)
	{
	  if (index[ii] < -1)
	  {
		alwaysPrint ('error, index[' + ii + ']=' + index[ii] + ' is illegal value');
		return;
	  }
	}
	tracePrint ('index.length=' + index.length);
	tracePrint ('index=' + index);

	if (index.length < 4)
	{
		alwaysPrint ('warning, index.length=' + index.length + ' insufficient to construct a quad, IQS ignored');
		return;
	}

	coordIndexNew = new MFInt32 ();

	// ii walks through index array,
	// goal is to initialize coordIndexNew list to match quads
	for (ii=0; ii <= index.length-1; ii+=4)
	{
		if ((index[ii]   == index[ii+1]) || (index[ii]   == index[ii+2]) || (index[ii] == index[ii+3]) ||
		    (index[ii+1] == index[ii+2]) || (index[ii+1] == index[ii+3]) ||
		    (index[ii+2] == index[ii+3]))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, pair of equal indices in quad');
			return;
		}

		if (index[ii] >= 0)
		{
			// add another quad from latest 4 points of fan set to IQS
			// order is ccw, i.e. in correct halfplane direction
			// note: there is an implicit "malloc" here for the'length' element of the array
			coordIndexNew [coordIndexNew.length] = index[ii];
			coordIndexNew [coordIndexNew.length] = index[ii+1];
			coordIndexNew [coordIndexNew.length] = index[ii+2];
			coordIndexNew [coordIndexNew.length] = index[ii+3];
			coordIndexNew [coordIndexNew.length] = -1;
		}

		if (index.length % 4 != 0) {
			alwaysPrint ('error, index field does not contain a multiple of four coordinate values.');
			alwaysPrint ('The remaining vertices shall be ignored');
			return;
		}

	  // incremental trace of array being built
	  tracePrint ('coordIndexNew=' + coordIndexNew);
	}
	renderedIQS.set_coordIndex = coordIndexNew;
	tracePrint ('renderedIQS.coordIndex=' + renderedIQS.coordIndex);
	// match colorIndex if any Color node exists
//	if (nodesHolder.color)
//	{
//	  if (nodesHolder.color.color.length > 0)
//	  {
		//  Could implement color count check here
//	  }
//	}

	// no need to set colorIndex since indexedFaceSet semantics handles this
}
function set_index (value, timestamp)
{
	index = value;
	initialize ();
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	  Browser.println ('[IndexedQuadSet]' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[IndexedQuadSet]' + outputString);
}
""" .
:field_2_2_2_2_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :IndexedQuadSetToIndexedFaceSet ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'index' ;
  x3do:type 'MFInt32' .
:field_2_2_2_2_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :IndexedQuadSetToIndexedFaceSet ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'set_index' ;
  x3do:type 'MFInt32' .
:field_2_2_2_2_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :IndexedQuadSetToIndexedFaceSet ;
  x3do:hasGeometry :RenderedIQS-USE-1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'renderedIQS' ;
  x3do:type 'SFNode' .
:RenderedIQS-USE-1 a owl:NamedIndividual, x3do:IndexedFaceSet ;
  x3do:hasParent :field_2_2_2_2_1_3 ;
  owl:sameAs :RenderedIQS . # DEF matching this USE
:field_2_2_2_2_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :IndexedQuadSetToIndexedFaceSet ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'localTraceEnabled' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_2_2_2_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :IndexedQuadSetToIndexedFaceSet ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'coordIndexNew' ;
  x3do:type 'MFInt32' .
:IS_2_2_2_2_1_6 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :IndexedQuadSetToIndexedFaceSet ;
  x3do:hasConnect :connect_2_2_2_2_1_6_1, :connect_2_2_2_2_1_6_2 .
:connect_2_2_2_2_1_6_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_2_1_6 ;
  x3do:nodeField 'index' ;
  x3do:protoField 'index' .
:connect_2_2_2_2_1_6_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_2_1_6 ;
  x3do:nodeField 'set_index' ;
  x3do:protoField 'set_index' .
:Group_2_2_2_2_2 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :UnrenderedIQS ;
  x3do:hasMetadata :MetadataString_2_2_2_2_2_1 .
:MetadataString_2_2_2_2_2_1 a owl:NamedIndividual, x3do:MetadataString ;
  x3do:hasParent :Group_2_2_2_2_2 ;
  x3do:hasIS :IS_2_2_2_2_2_1_1 ;
  x3do:name 'metadataHolder' .
:IS_2_2_2_2_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :MetadataString_2_2_2_2_2_1 ;
  x3do:hasConnect :connect_2_2_2_2_2_1_1_1 .
:connect_2_2_2_2_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_2_2_2_2_1_1 ;
  x3do:nodeField 'metadata' ;
  x3do:protoField 'metadata' .
:ProtoDeclare_2_3 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_3_1 ;
  x3do:hasProtoBody :ProtoBody_2_3_2 ;
  x3do:appinfo 'The QuadSet node represents a 3D shape that represents a collection of individual planar quadrilaterals. The coord field contains a Coordinate node that defines the 3D vertices that define the quad. Each quad is formed from a consecutive set of four vertices of the coordinate node. If the coordinate node does not contain a multiple of four coordinate values the remaining vertices shall be ignored.' ;
  x3do:documentation 'https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/CadGeometry.html#QuadSet' ;
  x3do:name 'QuadSet' .
:ProtoInterface_2_3_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_3 ;
  x3do:hasField :field_2_3_1_1, :field_2_3_1_2, :field_2_3_1_3, :field_2_3_1_4, :field_2_3_1_5, :field_2_3_1_6, :field_2_3_1_7, :field_2_3_1_8, :field_2_3_1_9, :field_2_3_1_10, :field_2_3_1_11 .
:field_2_3_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DVertexAttributeNode]' ;
  x3do:name 'attrib' ;
  x3do:type 'MFNode' .
:field_2_3_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DColorNode]' ;
  x3do:name 'color' ;
  x3do:type 'SFNode' .
:field_2_3_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DCoordinateNode]' ;
  x3do:name 'coord' ;
  x3do:type 'SFNode' .
:field_2_3_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[FogCoordinate]' ;
  x3do:name 'fogCoord' ;
  x3do:type 'SFNode' .
:field_2_3_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DNormalNode]' ;
  x3do:name 'normal' ;
  x3do:type 'SFNode' .
:field_2_3_1_6 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DTextureCoordinateNode]' ;
  x3do:name 'texCoord' ;
  x3do:type 'SFNode' .
:field_2_3_1_7 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'ccw' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_3_1_8 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'colorPerVertex ignored in QuadSet, and always treated as true' ;
  x3do:name 'colorPerVertex' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_3_1_9 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'normalPerVertex' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_3_1_10 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'solid' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_3_1_11 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_3_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DMetadataObject]' ;
  x3do:name 'metadata' ;
  x3do:type 'SFNode' .
:ProtoBody_2_3_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_3 ;
  x3do:hasGeometry :RenderedQS ;
  x3do:hasChildren :UnrenderedQS .
:RenderedQS a owl:NamedIndividual, x3do:IndexedFaceSet ;
  x3do:hasParent :ProtoBody_2_3_2 ;
  x3do:hasIS :IS_2_3_2_1_1 ;
  x3do:DEF 'RenderedQS' .
:IS_2_3_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :RenderedQS ;
  x3do:hasConnect :connect_2_3_2_1_1_1, :connect_2_3_2_1_1_2, :connect_2_3_2_1_1_3, :connect_2_3_2_1_1_4, :connect_2_3_2_1_1_5, :connect_2_3_2_1_1_6, :connect_2_3_2_1_1_7, :connect_2_3_2_1_1_8, :connect_2_3_2_1_1_9, :connect_2_3_2_1_1_10 .
:connect_2_3_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'attrib' ;
  x3do:protoField 'attrib' .
:connect_2_3_2_1_1_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'color' ;
  x3do:protoField 'color' .
:connect_2_3_2_1_1_3 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'colorPerVertex' ;
  x3do:protoField 'colorPerVertex' .
:connect_2_3_2_1_1_4 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'coord' ;
  x3do:protoField 'coord' .
:connect_2_3_2_1_1_5 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'fogCoord' ;
  x3do:protoField 'fogCoord' .
:connect_2_3_2_1_1_6 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'normal' ;
  x3do:protoField 'normal' .
:connect_2_3_2_1_1_7 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'texCoord' ;
  x3do:protoField 'texCoord' .
:connect_2_3_2_1_1_8 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'ccw' ;
  x3do:protoField 'ccw' .
:connect_2_3_2_1_1_9 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'normalPerVertex' ;
  x3do:protoField 'normalPerVertex' .
:connect_2_3_2_1_1_10 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_1_1 ;
  x3do:nodeField 'solid' ;
  x3do:protoField 'solid' .
:UnrenderedQS a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_3_2 ;
  x3do:hasChildren :QuadSetToIndexedFaceSet, :Group_2_3_2_2_2 ;
  x3do:DEF 'UnrenderedQS' .
:QuadSetToIndexedFaceSet a owl:NamedIndividual, x3do:Script ;
  x3do:hasParent :UnrenderedQS ;
  x3do:hasField :field_2_3_2_2_1_1, :field_2_3_2_2_1_2, :field_2_3_2_2_1_3, :field_2_3_2_2_1_4, :field_2_3_2_2_1_5 ;
  x3do:DEF 'QuadSetToIndexedFaceSet' ;
  x3do:directOutput true ;
  x3do:sourceCode """
ecmascript:

function initialize()
{
	//colorPerVertex ignored in QuadSet, and always treated as "true"
	RenderedQS.colorPerVertex = true;

	// calculate index value from QuadSet coord values
	if (renderedQS.coord)
	{
		numberOfCoordinatePoints = renderedQS.coord.point.length;
	}
	else
	{
		tracePrint ('no Coordinate node found');
		return;
	}
	if (numberOfCoordinatePoints < 4)
	{
		alwaysPrint ('warning, numberOfCoordinatePoints=' + numberOfCoordinatePoints + ' insufficient to construct a quad, QuadSet ignored');
		return;
	}

	coordIndexNew = new MFInt32 ();

	// ii walks through index array,
	// goal is to initialize coordIndexNew list to match quads
	for (ii=0; ii <= numberOfCoordinatePoints-1; ii+=4)
	{
		// check if at least 4 vertices remaining to build a quad
		if ((numberOfCoordinatePoints - ii) < 4)
		{
			alwaysPrint ('error, index field does not contain a multiple' +
' of four coordinate values.');
			alwaysPrint ('The remaining vertices shall be ignored');
			return;
		}

		if ((index[ii]   == index[ii+1]) || (index[ii]   == index[ii+2]) || (index[ii] == index[ii+3]) ||
		    (index[ii+1] == index[ii+2]) || (index[ii+1] == index[ii+3]) ||
		    (index[ii+2] == index[ii+3]))
		{
			alwaysPrint ('index=' + index);
			alwaysPrint ('error, pair of equal indices in quad');
			return;
		}

		if (index[ii] >= 0)
		{
			// add another quad from latest 4 points of fan set to QS
			// order is ccw, i.e. in correct halfplane direction
			// note: there is an implicit "malloc" here for the'length' element of the array
			coordIndexNew [coordIndexNew.length] = index[ii];
			coordIndexNew [coordIndexNew.length] = index[ii+1];
			coordIndexNew [coordIndexNew.length] = index[ii+2];
			coordIndexNew [coordIndexNew.length] = index[ii+3];
			coordIndexNew [coordIndexNew.length] = -1;
		}

	  // incremental trace of array being built
	  tracePrint ('coordIndexNew=' + coordIndexNew);
	}
	renderedQS.set_coordIndex = coordIndexNew;
	tracePrint ('renderedQS.coordIndex=' + renderedQS.coordIndex);
	// match colorIndex if any Color node exists
//	if (nodesHolder.color)
//	{
//	  if (nodesHolder.color.color.length > 0)
//	  {
		//  Could implement color count check here
//	  }
//	}

	// no need to set colorIndex since indexedFaceSet semantics handles this
}
function set_index (value, timestamp)
{
	index = value;
	initialize ();
}
function tracePrint(outputString)
{
    if (localTraceEnabled)
	  Browser.println ('[IndexedQuadSet]' + outputString);
}
function alwaysPrint(outputString)
{
	Browser.println ('[IndexedQuadSet]' + outputString);
}
""" .
:field_2_3_2_2_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :QuadSetToIndexedFaceSet ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'index' ;
  x3do:type 'MFInt32' .
:field_2_3_2_2_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :QuadSetToIndexedFaceSet ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'set_index' ;
  x3do:type 'MFInt32' .
:field_2_3_2_2_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :QuadSetToIndexedFaceSet ;
  x3do:hasGeometry :RenderedQS-USE-1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'renderedQS' ;
  x3do:type 'SFNode' .
:RenderedQS-USE-1 a owl:NamedIndividual, x3do:IndexedFaceSet ;
  x3do:hasParent :field_2_3_2_2_1_3 ;
  owl:sameAs :RenderedQS . # DEF matching this USE
:field_2_3_2_2_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :QuadSetToIndexedFaceSet ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'localTraceEnabled' ;
  x3do:type 'SFBool' ;
  x3do:value true .
:field_2_3_2_2_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :QuadSetToIndexedFaceSet ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'coordIndexNew' ;
  x3do:type 'MFInt32' .
:Group_2_3_2_2_2 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :UnrenderedQS ;
  x3do:hasMetadata :MetadataString_2_3_2_2_2_1 .
:MetadataString_2_3_2_2_2_1 a owl:NamedIndividual, x3do:MetadataString ;
  x3do:hasParent :Group_2_3_2_2_2 ;
  x3do:hasIS :IS_2_3_2_2_2_1_1 ;
  x3do:name 'metadataHolder' .
:IS_2_3_2_2_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :MetadataString_2_3_2_2_2_1 ;
  x3do:hasConnect :connect_2_3_2_2_2_1_1_1 .
:connect_2_3_2_2_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_3_2_2_2_1_1 ;
  x3do:nodeField 'metadata' ;
  x3do:protoField 'metadata' .
:ProtoDeclare_2_4 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_4_1 ;
  x3do:hasProtoBody :ProtoBody_2_4_2 ;
  x3do:appinfo 'The CADAssembly node holds a set of assemblies or parts grouped together.' ;
  x3do:name 'CADAssembly' .
:ProtoInterface_2_4_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_4 ;
  x3do:hasField :field_2_4_1_1, :field_2_4_1_2, :field_2_4_1_3, :field_2_4_1_4, :field_2_4_1_5, :field_2_4_1_6, :field_2_4_1_7 .
:field_2_4_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_4_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'addChildren' ;
  x3do:type 'MFNode' .
:field_2_4_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_4_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'removeChildren' ;
  x3do:type 'MFNode' .
:field_2_4_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_4_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'The children field can contain X3DProductStructureChildNode types. Each child will be either a sub-assembly or a part.' ;
  x3do:name 'children' ;
  x3do:type 'MFNode' .
:field_2_4_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_4_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'The name field documents the name of this CADAssembly.' ;
  x3do:name 'name' ;
  x3do:type 'SFString' .
:field_2_4_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_4_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'Bounding box center: position offset from origin of local coordinate system.' ;
  x3do:name 'bboxCenter' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 0 0 0 ) .
:field_2_4_1_6 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_4_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'Bounding box size: automatically calculated can be specified as an optimization or constraint.' ;
  x3do:name 'bboxSize' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( -1 -1 -1 ) .
:field_2_4_1_7 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_4_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DMetadataObject]' ;
  x3do:name 'metadata' ;
  x3do:type 'SFNode' .
:ProtoBody_2_4_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_4 ;
  x3do:hasChildren :Group_2_4_2_1, :Group_2_4_2_2 .
:Group_2_4_2_1 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_4_2 ;
  x3do:hasIS :IS_2_4_2_1_1 .
:IS_2_4_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Group_2_4_2_1 ;
  x3do:hasConnect :connect_2_4_2_1_1_1, :connect_2_4_2_1_1_2, :connect_2_4_2_1_1_3, :connect_2_4_2_1_1_4, :connect_2_4_2_1_1_5 .
:connect_2_4_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_4_2_1_1 ;
  x3do:nodeField 'addChildren' ;
  x3do:protoField 'addChildren' .
:connect_2_4_2_1_1_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_4_2_1_1 ;
  x3do:nodeField 'removeChildren' ;
  x3do:protoField 'removeChildren' .
:connect_2_4_2_1_1_3 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_4_2_1_1 ;
  x3do:nodeField 'children' ;
  x3do:protoField 'children' .
:connect_2_4_2_1_1_4 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_4_2_1_1 ;
  x3do:nodeField 'bboxCenter' ;
  x3do:protoField 'bboxCenter' .
:connect_2_4_2_1_1_5 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_4_2_1_1 ;
  x3do:nodeField 'bboxSize' ;
  x3do:protoField 'bboxSize' .
:Group_2_4_2_2 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_4_2 ;
  x3do:hasMetadata :MetadataString_2_4_2_2_1 ;
  x3do:hasChildren :Anchor_2_4_2_2_2 .
:MetadataString_2_4_2_2_1 a owl:NamedIndividual, x3do:MetadataString ;
  x3do:hasParent :Group_2_4_2_2 ;
  x3do:hasIS :IS_2_4_2_2_1_1 ;
  x3do:name 'metadataHolder' .
:IS_2_4_2_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :MetadataString_2_4_2_2_1 ;
  x3do:hasConnect :connect_2_4_2_2_1_1_1 .
:connect_2_4_2_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_4_2_2_1_1 ;
  x3do:nodeField 'metadata' ;
  x3do:protoField 'metadata' .
:Anchor_2_4_2_2_2 a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :Group_2_4_2_2 ;
  x3do:hasIS :IS_2_4_2_2_2_1 ;
  x3do:url '"#hideWarning1"' .
:IS_2_4_2_2_2_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Anchor_2_4_2_2_2 ;
  x3do:hasConnect :connect_2_4_2_2_2_1_1 .
:connect_2_4_2_2_2_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_4_2_2_2_1 ;
  x3do:nodeField 'description' ;
  x3do:protoField 'name' .
:ProtoDeclare_2_5 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_5_1 ;
  x3do:hasProtoBody :ProtoBody_2_5_2 ;
  x3do:appinfo 'local dummy node to hold value for CADFace' ;
  x3do:name 'ShapeHolder' .
:ProtoInterface_2_5_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_5 ;
  x3do:hasField :field_2_5_1_1 .
:field_2_5_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_5_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'shape' ;
  x3do:type 'SFNode' .
:ProtoBody_2_5_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_5 ;
  x3do:hasChildren :HoldShapeNodeScript .
:HoldShapeNodeScript a owl:NamedIndividual, x3do:Script ;
  x3do:hasParent :ProtoBody_2_5_2 ;
  x3do:hasField :field_2_5_2_1_1 ;
  x3do:hasIS :IS_2_5_2_1_2 ;
  x3do:DEF 'HoldShapeNodeScript' ;
  x3do:directOutput true ;
  x3do:sourceCode """
ecmascript:
// no script code, this node is simply a container

// silence warning: no function provided that includes shape = something;
""" .
:field_2_5_2_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :HoldShapeNodeScript ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'holder for IS field' ;
  x3do:name 'shape' ;
  x3do:type 'SFNode' .
:IS_2_5_2_1_2 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :HoldShapeNodeScript ;
  x3do:hasConnect :connect_2_5_2_1_2_1 .
:connect_2_5_2_1_2_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_5_2_1_2 ;
  x3do:nodeField 'shape' ;
  x3do:protoField 'shape' .
:ProtoDeclare_2_6 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_6_1 ;
  x3do:hasProtoBody :ProtoBody_2_6_2 ;
  x3do:appinfo 'The CADFace node holds the geometry representing a face of a part.' ;
  x3do:documentation 'https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/CadGeometry.html#CADFace' ;
  x3do:name 'CADFace' .
:ProtoInterface_2_6_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_6 ;
  x3do:hasField :field_2_6_1_1, :field_2_6_1_2, :field_2_6_1_3, :field_2_6_1_4, :field_2_6_1_5 .
:field_2_6_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_6_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'The name field documents the name of this CADFace.' ;
  x3do:name 'name' ;
  x3do:type 'SFString' .
:field_2_6_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_6_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DShapeNode | LOD]' ;
  x3do:name 'shape' ;
  x3do:type 'SFNode' .
:field_2_6_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_6_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'Bounding box center: position offset from origin of local coordinate system.' ;
  x3do:name 'bboxCenter' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 0 0 0 ) .
:field_2_6_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_6_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'Bounding box size: automatically calculated can be specified as an optimization or constraint.' ;
  x3do:name 'bboxSize' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( -1 -1 -1 ) .
:field_2_6_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_6_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DMetadataObject]' ;
  x3do:name 'metadata' ;
  x3do:type 'SFNode' .
:ProtoBody_2_6_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_6 ;
  x3do:hasChildren :ProtoInstance_2_6_2_1, :Group_2_6_2_2 .
:ProtoInstance_2_6_2_1 a owl:NamedIndividual, x3do:ProtoInstance ;
  x3do:hasParent :ProtoBody_2_6_2 ;
  x3do:hasIS :IS_2_6_2_1_1 ;
  x3do:name 'ShapeHolder' .
:IS_2_6_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :ProtoInstance_2_6_2_1 ;
  x3do:hasConnect :connect_2_6_2_1_1_1 .
:connect_2_6_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_6_2_1_1 ;
  x3do:nodeField 'shape' ;
  x3do:protoField 'shape' .
:Group_2_6_2_2 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_6_2 ;
  x3do:hasIS :IS_2_6_2_2_1 ;
  x3do:hasMetadata :MetadataString_2_6_2_2_2 ;
  x3do:hasChildren :Anchor_2_6_2_2_3 .
:IS_2_6_2_2_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Group_2_6_2_2 ;
  x3do:hasConnect :connect_2_6_2_2_1_1, :connect_2_6_2_2_1_2 .
:connect_2_6_2_2_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_6_2_2_1 ;
  x3do:nodeField 'bboxCenter' ;
  x3do:protoField 'bboxCenter' .
:connect_2_6_2_2_1_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_6_2_2_1 ;
  x3do:nodeField 'bboxSize' ;
  x3do:protoField 'bboxSize' .
:MetadataString_2_6_2_2_2 a owl:NamedIndividual, x3do:MetadataString ;
  x3do:hasParent :Group_2_6_2_2 ;
  x3do:hasIS :IS_2_6_2_2_2_1 ;
  x3do:name 'metadataHolder' .
:IS_2_6_2_2_2_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :MetadataString_2_6_2_2_2 ;
  x3do:hasConnect :connect_2_6_2_2_2_1_1 .
:connect_2_6_2_2_2_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_6_2_2_2_1 ;
  x3do:nodeField 'metadata' ;
  x3do:protoField 'metadata' .
:Anchor_2_6_2_2_3 a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :Group_2_6_2_2 ;
  x3do:hasIS :IS_2_6_2_2_3_1 ;
  x3do:url '"#hideWarning2"' .
:IS_2_6_2_2_3_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Anchor_2_6_2_2_3 ;
  x3do:hasConnect :connect_2_6_2_2_3_1_1 .
:connect_2_6_2_2_3_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_6_2_2_3_1 ;
  x3do:nodeField 'description' ;
  x3do:protoField 'name' .
:ProtoDeclare_2_7 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_7_1 ;
  x3do:hasProtoBody :ProtoBody_2_7_2 ;
  x3do:appinfo 'The CADLayer node defines a hierarchy of nodes used for showing layer structure.' ;
  x3do:documentation 'https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/CadGeometry.html#CADPart' ;
  x3do:name 'CADLayer' .
:ProtoInterface_2_7_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_7 ;
  x3do:hasField :field_2_7_1_1, :field_2_7_1_2, :field_2_7_1_3, :field_2_7_1_4, :field_2_7_1_5, :field_2_7_1_6, :field_2_7_1_7, :field_2_7_1_8 .
:field_2_7_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'addChildren' ;
  x3do:type 'MFNode' .
:field_2_7_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'removeChildren' ;
  x3do:type 'MFNode' .
:field_2_7_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'The children field can contain X3DChildNode types.' ;
  x3do:name 'children' ;
  x3do:type 'MFNode' .
:field_2_7_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'The name field documents the name of this CADLayer.' ;
  x3do:name 'name' ;
  x3do:type 'SFString' .
:field_2_7_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'specifies whether a particular child and its subchildren are visible. If the number of values is less than the number of children the remaining children shall be visible.' ;
  x3do:name 'visible' ;
  x3do:type 'MFBool' .
:field_2_7_1_6 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'Bounding box center: position offset from origin of local coordinate system.' ;
  x3do:name 'bboxCenter' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 0 0 0 ) .
:field_2_7_1_7 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:appinfo 'Bounding box size: automatically calculated can be specified as an optimization or constraint.' ;
  x3do:name 'bboxSize' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( -1 -1 -1 ) .
:field_2_7_1_8 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_7_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DMetadataObject]' ;
  x3do:name 'metadata' ;
  x3do:type 'SFNode' .
:ProtoBody_2_7_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_7 ;
  x3do:hasChildren :Group_2_7_2_1, :Group_2_7_2_2, :HoldMFBoolFieldScript .
:Group_2_7_2_1 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_7_2 ;
  x3do:hasIS :IS_2_7_2_1_1 .
:IS_2_7_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Group_2_7_2_1 ;
  x3do:hasConnect :connect_2_7_2_1_1_1, :connect_2_7_2_1_1_2, :connect_2_7_2_1_1_3, :connect_2_7_2_1_1_4, :connect_2_7_2_1_1_5 .
:connect_2_7_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_1_1 ;
  x3do:nodeField 'addChildren' ;
  x3do:protoField 'addChildren' .
:connect_2_7_2_1_1_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_1_1 ;
  x3do:nodeField 'removeChildren' ;
  x3do:protoField 'removeChildren' .
:connect_2_7_2_1_1_3 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_1_1 ;
  x3do:nodeField 'children' ;
  x3do:protoField 'children' .
:connect_2_7_2_1_1_4 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_1_1 ;
  x3do:nodeField 'bboxCenter' ;
  x3do:protoField 'bboxCenter' .
:connect_2_7_2_1_1_5 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_1_1 ;
  x3do:nodeField 'bboxSize' ;
  x3do:protoField 'bboxSize' .
:Group_2_7_2_2 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_7_2 ;
  x3do:hasMetadata :MetadataString_2_7_2_2_1 ;
  x3do:hasChildren :Anchor_2_7_2_2_2 .
:MetadataString_2_7_2_2_1 a owl:NamedIndividual, x3do:MetadataString ;
  x3do:hasParent :Group_2_7_2_2 ;
  x3do:hasIS :IS_2_7_2_2_1_1 ;
  x3do:name 'metadataHolder' .
:IS_2_7_2_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :MetadataString_2_7_2_2_1 ;
  x3do:hasConnect :connect_2_7_2_2_1_1_1 .
:connect_2_7_2_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_2_1_1 ;
  x3do:nodeField 'metadata' ;
  x3do:protoField 'metadata' .
:Anchor_2_7_2_2_2 a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :Group_2_7_2_2 ;
  x3do:hasIS :IS_2_7_2_2_2_1 ;
  x3do:url '"#hideWarning3"' .
:IS_2_7_2_2_2_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Anchor_2_7_2_2_2 ;
  x3do:hasConnect :connect_2_7_2_2_2_1_1 .
:connect_2_7_2_2_2_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_2_2_1 ;
  x3do:nodeField 'description' ;
  x3do:protoField 'name' .
:HoldMFBoolFieldScript a owl:NamedIndividual, x3do:Script ;
  x3do:hasParent :ProtoBody_2_7_2 ;
  x3do:hasField :field_2_7_2_3_1 ;
  x3do:hasIS :IS_2_7_2_3_2 ;
  x3do:DEF 'HoldMFBoolFieldScript' ;
  x3do:sourceCode """
ecmascript:
// no script code, this node is simply a container
""" .
:field_2_7_2_3_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :HoldMFBoolFieldScript ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'visible' ;
  x3do:type 'MFBool' .
:IS_2_7_2_3_2 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :HoldMFBoolFieldScript ;
  x3do:hasConnect :connect_2_7_2_3_2_1 .
:connect_2_7_2_3_2_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_7_2_3_2 ;
  x3do:nodeField 'visible' ;
  x3do:protoField 'visible' .
:ProtoDeclare_2_8 a owl:NamedIndividual, x3do:ProtoDeclare ;
  x3do:hasParent :Scene ;
  x3do:hasProtoInterface :ProtoInterface_2_8_1 ;
  x3do:hasProtoBody :ProtoBody_2_8_2 ;
  x3do:appinfo 'CADPart represents the location and faces that constitute apart' ;
  x3do:documentation 'https://www.web3d.org/specifications/X3Dv4/ISO-IEC19775-1v4-IS/Part01/components/CadGeometry.html#CADPart' ;
  x3do:name 'CADPart' .
:ProtoInterface_2_8_1 a owl:NamedIndividual, x3do:ProtoInterface ;
  x3do:hasParent :ProtoDeclare_2_8 ;
  x3do:hasField :field_2_8_1_1, :field_2_8_1_2, :field_2_8_1_3, :field_2_8_1_4, :field_2_8_1_5, :field_2_8_1_6, :field_2_8_1_7, :field_2_8_1_8, :field_2_8_1_9, :field_2_8_1_10, :field_2_8_1_11, :field_2_8_1_12 .
:field_2_8_1_1 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'addChildren' ;
  x3do:type 'MFNode' .
:field_2_8_1_2 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOnly' ;
  x3do:name 'removeChildren' ;
  x3do:type 'MFNode' .
:field_2_8_1_3 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo 'The children field can only contain CADFace nodes.' ;
  x3do:name 'children' ;
  x3do:type 'MFNode' .
:field_2_8_1_4 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'name' ;
  x3do:type 'SFString' .
:field_2_8_1_5 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'translation' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 0 0 0 ) .
:field_2_8_1_6 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'rotation' ;
  x3do:type 'SFRotation' ;
  x3do:value ( 0 0 1 0 ) .
:field_2_8_1_7 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'center' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 0 0 0 ) .
:field_2_8_1_8 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'scale' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 1 1 1 ) .
:field_2_8_1_9 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:name 'scaleOrientation' ;
  x3do:type 'SFRotation' ;
  x3do:value ( 0 0 1 0 ) .
:field_2_8_1_10 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'bboxCenter' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( 0 0 0 ) .
:field_2_8_1_11 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'initializeOnly' ;
  x3do:name 'bboxSize' ;
  x3do:type 'SFVec3f' ;
  x3do:value ( -1 -1 -1 ) .
:field_2_8_1_12 a owl:NamedIndividual, x3do:field ;
  x3do:hasParent :ProtoInterface_2_8_1 ;
  x3do:accessType 'inputOutput' ;
  x3do:appinfo '[X3DMetadataObject]' ;
  x3do:name 'metadata' ;
  x3do:type 'SFNode' .
:ProtoBody_2_8_2 a owl:NamedIndividual, x3do:ProtoBody ;
  x3do:hasParent :ProtoDeclare_2_8 ;
  x3do:hasChildren :Transform_2_8_2_1, :Group_2_8_2_2 .
:Transform_2_8_2_1 a owl:NamedIndividual, x3do:Transform ;
  x3do:hasParent :ProtoBody_2_8_2 ;
  x3do:hasIS :IS_2_8_2_1_1 .
:IS_2_8_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Transform_2_8_2_1 ;
  x3do:hasConnect :connect_2_8_2_1_1_1, :connect_2_8_2_1_1_2, :connect_2_8_2_1_1_3, :connect_2_8_2_1_1_4, :connect_2_8_2_1_1_5, :connect_2_8_2_1_1_6, :connect_2_8_2_1_1_7, :connect_2_8_2_1_1_8, :connect_2_8_2_1_1_9, :connect_2_8_2_1_1_10 .
:connect_2_8_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'children' ;
  x3do:protoField 'children' .
:connect_2_8_2_1_1_2 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'addChildren' ;
  x3do:protoField 'addChildren' .
:connect_2_8_2_1_1_3 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'removeChildren' ;
  x3do:protoField 'removeChildren' .
:connect_2_8_2_1_1_4 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'translation' ;
  x3do:protoField 'translation' .
:connect_2_8_2_1_1_5 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'rotation' ;
  x3do:protoField 'rotation' .
:connect_2_8_2_1_1_6 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'center' ;
  x3do:protoField 'center' .
:connect_2_8_2_1_1_7 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'scale' ;
  x3do:protoField 'scale' .
:connect_2_8_2_1_1_8 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'scaleOrientation' ;
  x3do:protoField 'scaleOrientation' .
:connect_2_8_2_1_1_9 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'bboxCenter' ;
  x3do:protoField 'bboxCenter' .
:connect_2_8_2_1_1_10 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_1_1 ;
  x3do:nodeField 'bboxSize' ;
  x3do:protoField 'bboxSize' .
:Group_2_8_2_2 a owl:NamedIndividual, x3do:Group ;
  x3do:hasParent :ProtoBody_2_8_2 ;
  x3do:hasMetadata :MetadataString_2_8_2_2_1 ;
  x3do:hasChildren :Anchor_2_8_2_2_2 .
:MetadataString_2_8_2_2_1 a owl:NamedIndividual, x3do:MetadataString ;
  x3do:hasParent :Group_2_8_2_2 ;
  x3do:hasIS :IS_2_8_2_2_1_1 ;
  x3do:name 'metadataHolder' .
:IS_2_8_2_2_1_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :MetadataString_2_8_2_2_1 ;
  x3do:hasConnect :connect_2_8_2_2_1_1_1 .
:connect_2_8_2_2_1_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_2_1_1 ;
  x3do:nodeField 'metadata' ;
  x3do:protoField 'metadata' .
:Anchor_2_8_2_2_2 a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :Group_2_8_2_2 ;
  x3do:hasIS :IS_2_8_2_2_2_1 ;
  x3do:url '"#hideWarning4"' .
:IS_2_8_2_2_2_1 a owl:NamedIndividual, x3do:IS ;
  x3do:hasParent :Anchor_2_8_2_2_2 ;
  x3do:hasConnect :connect_2_8_2_2_2_1_1 .
:connect_2_8_2_2_2_1_1 a owl:NamedIndividual, x3do:connect ;
  x3do:hasParent :IS_2_8_2_2_2_1 ;
  x3do:nodeField 'description' ;
  x3do:protoField 'name' .
:Anchor_2_9 a owl:NamedIndividual, x3do:Anchor ;
  x3do:hasParent :Scene ;
  x3do:hasChildren :Shape_2_9_1 ;
  x3do:description 'CadGeometryExternPrototypes' ;
  x3do:parameter '"target=_blank"' ;
  x3do:url '"CadGeometryExternPrototypes.x3d" "https://www.web3d.org/x3d/content/examples/Basic/development/CadGeometryExternPrototypes.x3d" "CadGeometryExternPrototypes.wrl" "https://www.web3d.org/x3d/content/examples/Basic/development/CadGeometryExternPrototypes.wrl"' .
:Shape_2_9_1 a owl:NamedIndividual, x3do:Shape ;
  x3do:hasParent :Anchor_2_9 ;
  x3do:hasGeometry :Text_2_9_1_1 ;
  x3do:hasAppearance :Appearance_2_9_1_2 .
:Text_2_9_1_1 a owl:NamedIndividual, x3do:Text ;
  x3do:hasParent :Shape_2_9_1 ;
  x3do:hasFontStyle :FontStyle_2_9_1_1_1 ;
  x3do:string '"CadGeometryExternPrototypes" "defines prototype examples" "" "Click text to see" "CadGeometryExternPrototypes"' .
:FontStyle_2_9_1_1_1 a owl:NamedIndividual, x3do:FontStyle ;
  x3do:hasParent :Text_2_9_1_1 ;
  x3do:justify '"MIDDLE" "MIDDLE"' ;
  x3do:size 0.9 .
:Appearance_2_9_1_2 a owl:NamedIndividual, x3do:Appearance ;
  x3do:hasParent :Shape_2_9_1 ;
  x3do:hasMaterial :Material_2_9_1_2_1 .
:Material_2_9_1_2_1 a owl:NamedIndividual, x3do:Material ;
  x3do:hasParent :Appearance_2_9_1_2 ;
  x3do:diffuseColor ( 1 1 0.2 ) .
:Transform_2_10 a owl:NamedIndividual, x3do:Transform ;
  x3do:hasParent :Scene ;
  x3do:hasChildren :Shape_2_10_1 ;
  x3do:translation ( -3 2 0 ) .
:Shape_2_10_1 a owl:NamedIndividual, x3do:Shape ;
  x3do:hasParent :Transform_2_10 ;
  x3do:hasAppearance :White ;
  x3do:hasGeometry :ProtoInstance_2_10_1_2 .
:White a owl:NamedIndividual, x3do:Appearance ;
  x3do:hasParent :Shape_2_10_1 ;
  x3do:hasMaterial :Material_2_10_1_1_1 ;
  x3do:DEF 'White' .
:Material_2_10_1_1_1 a owl:NamedIndividual, x3do:Material ;
  x3do:hasParent :White ;
  x3do:diffuseColor ( 1 1 1 ) .
:ProtoInstance_2_10_1_2 a owl:NamedIndividual, x3do:ProtoInstance ;
  x3do:hasParent :Shape_2_10_1 ;
  x3do:hasFieldValue :fieldValue_2_10_1_2_1, :fieldValue_2_10_1_2_2 ;
  x3do:name 'IndexedQuadSet' .
:fieldValue_2_10_1_2_1 a owl:NamedIndividual, x3do:fieldValue ;
  x3do:hasParent :ProtoInstance_2_10_1_2 ;
  x3do:name 'index' ;
  x3do:value ( 0 3 2 1 4 5 6 7 2 7 9 8 2 3 4 7 ) .
:fieldValue_2_10_1_2_2 a owl:NamedIndividual, x3do:fieldValue ;
  x3do:hasParent :ProtoInstance_2_10_1_2 ;
  x3do:hasCoord :Coordinate_2_10_1_2_2_1 ;
  x3do:name 'coord' .
:Coordinate_2_10_1_2_2_1 a owl:NamedIndividual, x3do:Coordinate ;
  x3do:hasParent :fieldValue_2_10_1_2_2 ;
  x3do:point ( -1.5 0 0 -1.5 1 -1 -0.5 1 -1 -0.5 0 0 0.5 0 0 1.5 0 0 1.5 1 -1 0.5 1 -1 -0.5 2 -1 0.5 2 -1 ) .
:Transform_2_11 a owl:NamedIndividual, x3do:Transform ;
  x3do:hasParent :Scene ;
  x3do:hasChildren :Shape_2_11_1 ;
  x3do:translation ( 3 2 0 ) .
:Shape_2_11_1 a owl:NamedIndividual, x3do:Shape ;
  x3do:hasParent :Transform_2_11 ;
  x3do:hasAppearance :White-USE-1 ;
  x3do:hasGeometry :ProtoInstance_2_11_1_2 .
:White-USE-1 a owl:NamedIndividual, x3do:Appearance ;
  x3do:hasParent :Shape_2_11_1 ;
  owl:sameAs :White . # DEF matching this USE
:ProtoInstance_2_11_1_2 a owl:NamedIndividual, x3do:ProtoInstance ;
  x3do:hasParent :Shape_2_11_1 ;
  x3do:hasFieldValue :fieldValue_2_11_1_2_1 ;
  x3do:name 'QuadSet' .
:fieldValue_2_11_1_2_1 a owl:NamedIndividual, x3do:fieldValue ;
  x3do:hasParent :ProtoInstance_2_11_1_2 ;
  x3do:hasCoord :Coordinate_2_11_1_2_1_1 ;
  x3do:name 'coord' .
:Coordinate_2_11_1_2_1_1 a owl:NamedIndividual, x3do:Coordinate ;
  x3do:hasParent :fieldValue_2_11_1_2_1 ;
  x3do:point ( -1.5 0 0 -1.5 1 -1 -0.5 1 -1 -0.5 0 0 0.5 0 0 1.5 0 0 1.5 1 -1 0.5 1 -1 ) .
:ProtoInstance_2_12 a owl:NamedIndividual, x3do:ProtoInstance ;
  x3do:hasParent :Scene ;
  x3do:hasFieldValue :fieldValue_2_12_1 ;
  x3do:name 'CADLayer' .
:fieldValue_2_12_1 a owl:NamedIndividual, x3do:fieldValue ;
  x3do:hasParent :ProtoInstance_2_12 ;
  x3do:hasChildren :ProtoInstance_2_12_1_1 ;
  x3do:name 'children' .
:ProtoInstance_2_12_1_1 a owl:NamedIndividual, x3do:ProtoInstance ;
  x3do:hasParent :fieldValue_2_12_1 ;
  x3do:hasFieldValue :fieldValue_2_12_1_1_1 ;
  x3do:name 'CADAssembly' .
:fieldValue_2_12_1_1_1 a owl:NamedIndividual, x3do:fieldValue ;
  x3do:hasParent :ProtoInstance_2_12_1_1 ;
  x3do:hasChildren :ProtoInstance_2_12_1_1_1_1 ;
  x3do:name 'children' .
:ProtoInstance_2_12_1_1_1_1 a owl:NamedIndividual, x3do:ProtoInstance ;
  x3do:hasParent :fieldValue_2_12_1_1_1 ;
  x3do:hasFieldValue :fieldValue_2_12_1_1_1_1_1 ;
  x3do:name 'CADPart' .
:fieldValue_2_12_1_1_1_1_1 a owl:NamedIndividual, x3do:fieldValue ;
  x3do:hasParent :ProtoInstance_2_12_1_1_1_1 ;
  x3do:hasChildren :ProtoInstance_2_12_1_1_1_1_1_1 ;
  x3do:name 'children' .
:ProtoInstance_2_12_1_1_1_1_1_1 a owl:NamedIndividual, x3do:ProtoInstance ;
  x3do:hasParent :fieldValue_2_12_1_1_1_1_1 ;
  x3do:hasFieldValue :fieldValue_2_12_1_1_1_1_1_1_1 ;
  x3do:name 'CADFace' .
:fieldValue_2_12_1_1_1_1_1_1_1 a owl:NamedIndividual, x3do:fieldValue ;
  x3do:hasParent :ProtoInstance_2_12_1_1_1_1_1_1 ;
  x3do:hasChildren :Shape_2_12_1_1_1_1_1_1_1_1 ;
  x3do:name 'shape' .
:Shape_2_12_1_1_1_1_1_1_1_1 a owl:NamedIndividual, x3do:Shape ;
  x3do:hasParent :fieldValue_2_12_1_1_1_1_1_1_1 ;
  x3do:hasGeometry :Cylinder_2_12_1_1_1_1_1_1_1_1_1 ;
  x3do:hasAppearance :Appearance_2_12_1_1_1_1_1_1_1_1_2 .
:Cylinder_2_12_1_1_1_1_1_1_1_1_1 a owl:NamedIndividual, x3do:Cylinder ;
  x3do:hasParent :Shape_2_12_1_1_1_1_1_1_1_1 ;
  x3do:bottom false ;
  x3do:height 0.000001 ;
  x3do:radius 0.000001 ;
  x3do:side false .
:Appearance_2_12_1_1_1_1_1_1_1_1_2 a owl:NamedIndividual, x3do:Appearance ;
  x3do:hasParent :Shape_2_12_1_1_1_1_1_1_1_1 ;
  x3do:hasMaterial :Material_2_12_1_1_1_1_1_1_1_1_2_1 .
:Material_2_12_1_1_1_1_1_1_1_1_2_1 a owl:NamedIndividual, x3do:Material ;
  x3do:hasParent :Appearance_2_12_1_1_1_1_1_1_1_1_2 .
