<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="targetGeometry">
    <xs:complexType>
      <xs:group minOccurs="0" maxOccurs="unbounded" ref="geometry-element"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="geometryGroup" type="geometryGroup-content"/>
  <xs:complexType name="geometryGroup-content">
    <xs:group maxOccurs="unbounded" ref="geometry-element"/>
    <xs:attribute name="name" use="required" type="xs:token"/>
  </xs:complexType>
  <xs:group name="geometry-element">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="component"/>
        <xs:element ref="geometryGroup"/>
      </xs:choice>
    </xs:sequence>
  </xs:group>
  <xs:element name="component">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="description"/>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element ref="cylinder"/>
          <xs:element ref="ellipsoid"/>
          <xs:element ref="faceSet"/>
          <xs:element ref="tube"/>
          <xs:element ref="sphere"/>
          <xs:element ref="box"/>
          <xs:element ref="extrusion"/>
        </xs:choice>
      </xs:sequence>
      <xs:attributeGroup ref="name-attribute"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="translation">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="three-doubles-list">
          <xs:attributeGroup ref="dimension-attribute"/>
          <xs:attributeGroup ref="Length-attribute"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="rotation">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="three-doubles-list">
          <xs:attributeGroup ref="dimension-attribute"/>
          <xs:attributeGroup ref="Length-attribute"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="about">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="three-doubles-list">
          <xs:attributeGroup ref="dimension-attribute"/>
          <xs:attributeGroup ref="Length-attribute"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="length">
    <xs:complexType>
      <xs:simpleContent>
        <xs:restriction base="xs:anyType">
          <xs:simpleType>
            <xs:restriction base="xs:double">
              <xs:minExclusive value="0"/>
            </xs:restriction>
          </xs:simpleType>
          <xs:attributeGroup ref="dimension-attribute"/>
          <xs:attributeGroup ref="Length-attribute"/>
        </xs:restriction>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="radius">
    <xs:complexType>
      <xs:simpleContent>
        <xs:restriction base="xs:anyType">
          <xs:simpleType>
            <xs:restriction base="xs:double">
              <xs:minExclusive value="0"/>
            </xs:restriction>
          </xs:simpleType>
          <xs:attributeGroup ref="dimension-attribute"/>
          <xs:attributeGroup ref="Length-attribute"/>
        </xs:restriction>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="base1">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="three-doubles-list">
          <xs:attributeGroup ref="dimension-attribute"/>
          <xs:attributeGroup ref="Length-attribute"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="base2">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="three-doubles-list">
          <xs:attributeGroup ref="dimension-attribute"/>
          <xs:attributeGroup ref="Length-attribute"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="transform">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="translation"/>
        <xs:element minOccurs="0" ref="rotation"/>
        <xs:element minOccurs="0" ref="about"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="cyl-transform">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="translation"/>
        <xs:element minOccurs="0" ref="rotation"/>
        <xs:element minOccurs="0" ref="about"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="cylinder">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="radius"/>
        <xs:choice>
          <xs:choice>
            <xs:element ref="length"/>
            <xs:element ref="cyl-transform"/>
          </xs:choice>
          <xs:choice>
            <xs:element ref="base1"/>
            <xs:element ref="base2"/>
            <xs:element minOccurs="0" maxOccurs="unbounded" ref="transform"/>
          </xs:choice>
        </xs:choice>
        <xs:element ref="description"/>
        <xs:element ref="vMaterial"/>
      </xs:choice>
      <xs:attributeGroup ref="name-attribute"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="ellipsoid">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="radius">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="three-doubles-list">
                <xs:attributeGroup ref="length-attribute"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element ref="vMaterial"/>
        <xs:element ref="transform"/>
      </xs:choice>
      <xs:attributeGroup ref="name-attribute"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="faceSet">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="description"/>
        <xs:element ref="vertex_normals"/>
        <xs:element ref="vertices"/>
        <xs:element ref="facets"/>
        <xs:group ref="optional-content"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:token"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="facets" type="facets-content"/>
  <xs:simpleType name="facets-content">
    <xs:restriction base="integer-list"/>
  </xs:simpleType>
  <xs:element name="vertex_normals" type="vertex_normals-content"/>
  <xs:complexType name="vertex_normals-content">
    <xs:simpleContent>
      <xs:restriction base="xs:anyType">
        <xs:simpleType>
          <xs:restriction>
            <xs:simpleType>
              <xs:list>
                <xs:simpleType>
                  <xs:union>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                  </xs:union>
                </xs:simpleType>
              </xs:list>
            </xs:simpleType>
            <xs:minLength value="9"/>
          </xs:restriction>
        </xs:simpleType>
        <xs:attributeGroup ref="length-attribute"/>
      </xs:restriction>
    </xs:simpleContent>
  </xs:complexType>
  <xs:element name="vertices" type="vertices-content"/>
  <xs:complexType name="vertices-content">
    <xs:simpleContent>
      <xs:restriction base="xs:anyType">
        <xs:simpleType>
          <xs:restriction>
            <xs:simpleType>
              <xs:list>
                <xs:simpleType>
                  <xs:union>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                  </xs:union>
                </xs:simpleType>
              </xs:list>
            </xs:simpleType>
            <xs:minLength value="9"/>
          </xs:restriction>
        </xs:simpleType>
        <xs:attributeGroup ref="length-attribute"/>
      </xs:restriction>
    </xs:simpleContent>
  </xs:complexType>
  <xs:element name="tube" type="tube-content"/>
  <xs:complexType name="tube-content">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="spine"/>
      <xs:element ref="radius"/>
      <xs:group ref="optional-content"/>
    </xs:choice>
    <xs:attributeGroup ref="name-attribute"/>
  </xs:complexType>
  <xs:element name="spine" type="spine-content"/>
  <xs:complexType name="spine-content">
    <xs:simpleContent>
      <xs:restriction base="xs:anyType">
        <xs:simpleType>
          <xs:restriction>
            <xs:simpleType>
              <xs:list>
                <xs:simpleType>
                  <xs:union>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                  </xs:union>
                </xs:simpleType>
              </xs:list>
            </xs:simpleType>
            <xs:minLength value="6"/>
          </xs:restriction>
        </xs:simpleType>
        <xs:attributeGroup ref="length-attribute"/>
      </xs:restriction>
    </xs:simpleContent>
  </xs:complexType>
  <xs:element name="sphere" type="sphere-content"/>
  <xs:complexType name="sphere-content">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="radius"/>
      <xs:element ref="position"/>
    </xs:choice>
    <xs:attributeGroup ref="name-attribute"/>
  </xs:complexType>
  <xs:element name="position" type="position-content"/>
  <xs:complexType name="position-content">
    <xs:simpleContent>
      <xs:extension base="three-doubles-list">
        <xs:attributeGroup ref="length-attribute"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:element name="box" type="box-content"/>
  <xs:complexType name="box-content">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="size"/>
      <xs:choice>
        <xs:element ref="position"/>
        <xs:element ref="transform"/>
      </xs:choice>
    </xs:choice>
    <xs:attributeGroup ref="name-attribute"/>
  </xs:complexType>
  <xs:element name="size" type="size-content"/>
  <xs:complexType name="size-content">
    <xs:simpleContent>
      <xs:extension base="three-doubles-list">
        <xs:attributeGroup ref="length-attribute"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:element name="extrusion" type="extrusion-content"/>
  <xs:complexType name="extrusion-content">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="spine"/>
      <xs:element ref="scale"/>
      <xs:element ref="crossSection"/>
      <xs:group ref="optional-content"/>
    </xs:choice>
    <xs:attributeGroup ref="name-attribute"/>
  </xs:complexType>
  <xs:element name="scale" type="scale-content"/>
  <xs:simpleType name="scale-content">
    <xs:restriction>
      <xs:simpleType>
        <xs:list>
          <xs:simpleType>
            <xs:union memberTypes="xs:double xs:double"/>
          </xs:simpleType>
        </xs:list>
      </xs:simpleType>
      <xs:minLength value="2"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="crossSection" type="crossSection-content"/>
  <xs:complexType name="crossSection-content">
    <xs:simpleContent>
      <xs:restriction base="xs:anyType">
        <xs:simpleType>
          <xs:restriction>
            <xs:simpleType>
              <xs:list>
                <xs:simpleType>
                  <xs:union>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                    <xs:simpleType>
                      <xs:union memberTypes="xs:double xs:double xs:double"/>
                    </xs:simpleType>
                  </xs:union>
                </xs:simpleType>
              </xs:list>
            </xs:simpleType>
            <xs:minLength value="9"/>
          </xs:restriction>
        </xs:simpleType>
        <xs:attributeGroup ref="length-attribute"/>
        <xs:attributeGroup ref="closed-attribute"/>
      </xs:restriction>
    </xs:simpleContent>
  </xs:complexType>
  <xs:attributeGroup name="closed-attribute">
    <xs:attribute name="closed" use="required" type="xs:boolean"/>
  </xs:attributeGroup>
  <xs:group name="optional-content">
    <xs:annotation>
      <xs:documentation>global #############</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="transform"/>
        <xs:element ref="vMaterial"/>
      </xs:choice>
    </xs:sequence>
  </xs:group>
  <xs:element name="description" type="xs:string"/>
  <xs:attributeGroup name="length-attribute">
    <xs:attributeGroup ref="dimension-attribute"/>
    <xs:attributeGroup ref="Length-attribute"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="dimension-attribute">
    <xs:attribute name="dimension" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="L"/>
          <xs:enumeration value="F"/>
          <xs:enumeration value="M"/>
          <xs:enumeration value="T"/>
          <xs:enumeration value="F/L"/>
          <xs:enumeration value="F/LL"/>
          <xs:enumeration value="F/LLL"/>
          <xs:enumeration value="F/T"/>
          <xs:enumeration value="F/TT"/>
          <xs:enumeration value="F/TTT"/>
          <xs:enumeration value="L/T"/>
          <xs:enumeration value="L/TT"/>
          <xs:enumeration value="LLLLL"/>
          <xs:enumeration value="D/D"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:attributeGroup name="Length-attribute">
    <xs:attribute name="Length" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="meter"/>
          <xs:enumeration value="m"/>
          <xs:enumeration value="foot"/>
          <xs:enumeration value="f"/>
          <xs:enumeration value="inch"/>
          <xs:enumeration value="in"/>
          <xs:enumeration value="centimeter"/>
          <xs:enumeration value="cm"/>
          <xs:enumeration value="decimeter"/>
          <xs:enumeration value="dm"/>
          <xs:enumeration value="millimeter"/>
          <xs:enumeration value="mm"/>
          <xs:enumeration value="degree"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:attributeGroup name="Time-attribute">
    <xs:attribute name="Time" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="second"/>
          <xs:enumeration value="s"/>
          <xs:enumeration value="sec"/>
          <xs:enumeration value="minute"/>
          <xs:enumeration value="min"/>
          <xs:enumeration value="hour"/>
          <xs:enumeration value="hr"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:attributeGroup name="Force-attribute">
    <xs:attribute name="Force" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="newton"/>
          <xs:enumeration value="n"/>
          <xs:enumeration value="pound"/>
          <xs:enumeration value="grain"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:attributeGroup name="Mass-attribute">
    <xs:attribute name="Mass" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="kilogram"/>
          <xs:enumeration value="kg"/>
          <xs:enumeration value="gram"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:attributeGroup name="Dimensionless-attribute">
    <xs:attribute name="Dimensionless" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="radian"/>
          <xs:enumeration value="rad"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:simpleType name="three-doubles-list">
    <xs:restriction>
      <xs:simpleType>
        <xs:list>
          <xs:simpleType>
            <xs:union memberTypes="xs:double xs:double xs:double"/>
          </xs:simpleType>
        </xs:list>
      </xs:simpleType>
      <xs:length value="3"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="integer-list">
    <xs:restriction>
      <xs:simpleType>
        <xs:list>
          <xs:simpleType>
            <xs:union memberTypes="xs:integer xs:integer"/>
          </xs:simpleType>
        </xs:list>
      </xs:simpleType>
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:attributeGroup name="name-attribute">
    <xs:attribute name="name" use="required" type="xs:token"/>
  </xs:attributeGroup>
  <xs:attributeGroup name="description-attribute">
    <xs:attribute name="description" use="required"/>
  </xs:attributeGroup>
  <xs:element name="vMaterial">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="diffuseColor"/>
        <xs:element minOccurs="0" ref="emissiveColor"/>
        <xs:element minOccurs="0" ref="specularColor"/>
        <xs:element minOccurs="0" ref="shininess"/>
        <xs:element minOccurs="0" ref="transparency"/>
        <xs:element minOccurs="0" ref="ambientIntensity"/>
        <xs:element minOccurs="0" ref="DEF"/>
        <xs:element minOccurs="0" ref="USE"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="diffuseColor" type="xs:string"/>
  <xs:element name="emissiveColor" type="xs:string"/>
  <xs:element name="specularColor" type="xs:string"/>
  <xs:element name="shininess" type="xs:string"/>
  <xs:element name="transparency" type="xs:string"/>
  <xs:element name="ambientIntensity" type="xs:string"/>
  <xs:element name="DEF" type="xs:string"/>
  <xs:element name="USE" type="xs:string"/>
</xs:schema>