﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- ISolidsHoleOperation::DepthMethod -->
  <xs:simpleType name="typeDepthMethod">
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="Distance"/>
      <xs:enumeration value="ThroughAll"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="typeBottomAngle">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="0.0"/>
      <xs:maxInclusive value="179.0"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="typeAngle">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="1.0"/>
      <xs:maxInclusive value="179.0"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="typePositiveDouble">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0.5e-5"/>
    </xs:restriction>
  </xs:simpleType>

	<xs:simpleType name="typeColorIndex">
		<xs:restriction base="xs:unsignedByte" />
	</xs:simpleType>

	<!-- Chamfer -->
  <xs:complexType name="typeChamfer">
    <xs:attribute name="IsMetric" type="xs:boolean" use="required" />
    <!-- Diameter represents a percentage value, and is deprecated. -->
    <xs:attribute name="Diameter" type="typePositiveDouble" use="optional" />
    <!-- DiameterAbsolute represents an absolute diameter value. -->
    <xs:attribute name="DiameterAbsolute" type="typePositiveDouble" use="required" />
    <xs:attribute name="Angle" type="typeAngle" use="required" />
  </xs:complexType>

  <!-- ISolidsHoleOperation -->
  <xs:complexType name="typeOperation">
    <xs:sequence>
      <xs:element name="TopChamfer" type="typeChamfer" minOccurs="0" maxOccurs="1"/>
      <xs:choice minOccurs="0" maxOccurs="1">
        <xs:element name="Counterbore" type="typeCounterbore"/>
        <xs:element name="Counterdrill" type="typeCounterdrill"/>
        <xs:element name="Countersink" type="typeCountersink"/>
        <xs:element name="Taper" type="typeTaper"/>
        <xs:element name="Custom" type="typeCustom"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="Name" type="xs:string" use="required" />
    <xs:attribute name="IsMetric" type="xs:boolean" use="required" />
    <xs:attribute name="Diameter" type="typePositiveDouble" use="required" />
    <xs:attribute name="SetDepthBy" type="typeDepthMethod" use="required" />
    <xs:attribute name="Depth" type="typePositiveDouble" use="required" />
    <xs:attribute name="BottomAngle" type="typeBottomAngle" use="required" />
    <xs:attribute name="ColorIndex" type="typeColorIndex" use="optional" />
  </xs:complexType>

  <!-- ISolidsHoleCounterboreStyle -->
  <xs:complexType name="typeCounterbore">
    <xs:attribute name="IsMetric" type="xs:boolean" use="required" />
    <xs:attribute name="Depth" type="typePositiveDouble" use="required" />
    <xs:attribute name="Diameter" type="typePositiveDouble" use="required" />
  </xs:complexType>

  <!-- ISolidsHoleCounterdrillStyle -->
  <xs:complexType name="typeCounterdrill">
    <xs:attribute name="IsMetric" type="xs:boolean" use="required" />
    <xs:attribute name="Angle" type="typeAngle" use="required" />
    <xs:attribute name="Depth" type="typePositiveDouble" use="required" />
    <xs:attribute name="Diameter" type="typePositiveDouble" use="required" />
  </xs:complexType>

  <!-- ISolidsHoleCountersinkStyle -->
  <xs:complexType name="typeCountersink">
    <xs:attribute name="IsMetric" type="xs:boolean" use="required" />
    <xs:attribute name="Angle" type="typeAngle" use="required" />
    <xs:attribute name="Diameter" type="typePositiveDouble" use="required" />
  </xs:complexType>

	<!-- ISolidsHoleTaperStyle -->
	<xs:complexType name="typeTaper">
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
		<xs:attribute name="Angle" type="typeAngle" use="required" />
	</xs:complexType>

  <!-- ISolidsHoleCustomSegment -->
  <xs:complexType name="typeSegment">
	  <xs:attribute name="TopDiameter" type="typePositiveDouble" use="required" />
	  <xs:attribute name="Depth" type="typePositiveDouble" use="required" />
	  <xs:attribute name="BottomDiameter" type="typePositiveDouble" use="required" />
  </xs:complexType>

	<!-- ISolidsHoleCustomStyle -->
	<xs:complexType name="typeCustom">
		<xs:sequence>
			<xs:element name="Segments">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="Segment" type="typeSegment" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
	</xs:complexType>

	<!-- ISolidsHoleOperationCategory -->
  <xs:complexType name="typeCategory">
    <xs:sequence>
      <xs:element name="Presets">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Preset" type="typeOperation" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="Name" type="xs:string" use="required" />
  </xs:complexType>

  <!-- XML Root -->
  <xs:element name="Categories">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Category" type="typeCategory" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>