﻿<?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="180.0"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="typeAngle">
		<xs:restriction base="xs:decimal">
			<xs:minInclusive value="0.0"/>
			<xs:maxInclusive value="180.0"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="typePositiveDouble">
		<xs:restriction base="xs:double">
			<xs:minInclusive value="0.0"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="typeColorIndex">
		<xs:restriction base="xs:unsignedByte" />
	</xs:simpleType>

	<xs:simpleType name="typeHoleStyleSubType">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="General"/>
			<xs:enumeration value="DrillSize"/>
			<xs:enumeration value="DrillLetter"/>
			<xs:enumeration value="DrillNumber"/>
			<xs:enumeration value="FastenerClearance"/>
			<xs:enumeration value="DowelPin"/>
			<xs:enumeration value="ButtonHead"/>
			<xs:enumeration value="HeavyHexBolt"/>
			<xs:enumeration value="HexBolt"/>
			<xs:enumeration value="HexCapScrew"/>
			<xs:enumeration value="HexHeadMachineScrew"/>
			<xs:enumeration value="HexWasherHead"/>
			<xs:enumeration value="HexHeadWasherScrew"/>
			<xs:enumeration value="PanHead"/>
			<xs:enumeration value="ShoulderScrew"/>
			<xs:enumeration value="SocketHeadCapScrew"/>
			<xs:enumeration value="Machine"/>
			<xs:enumeration value="MachineDegree82"/>
			<xs:enumeration value="MachineDegree90"/>
			<xs:enumeration value="MachineDegree100"/>
			<xs:enumeration value="SocketFlatHead"/>
			<xs:enumeration value="StandardThread"/>
			<xs:enumeration value="TaperedThread"/>
			<xs:enumeration value="Thread_UNF"/>
			<xs:enumeration value="Thread_UNEF"/>
			<xs:enumeration value="Thread_UNC"/>
			<xs:enumeration value="Thread_UN"/>
			<xs:enumeration value="Thread_G1"/>
			<xs:enumeration value="Thread_G2"/>
			<xs:enumeration value="Thread_G3"/>
			<xs:enumeration value="Thread_G4"/>
			<xs:enumeration value="Thread_G5"/>
			<xs:enumeration value="Thread_G6"/>
			<xs:enumeration value="Thread_G7"/>
			<xs:enumeration value="Thread_M"/>
			<xs:enumeration value="Thread_Mx0_2"/>
			<xs:enumeration value="Thread_Mx0_25"/>			
			<xs:enumeration value="Thread_Mx0_35"/>
			<xs:enumeration value="Thread_Mx0_5"/>
			<xs:enumeration value="Thread_Mx0_75"/>
			<xs:enumeration value="Thread_Mx1"/>
			<xs:enumeration value="Thread_Mx1_25"/>
			<xs:enumeration value="Thread_Mx1_5"/>
			<xs:enumeration value="Thread_Mx2"/>
			<xs:enumeration value="Thread_Mx3"/>
			<xs:enumeration value="Thread_Mx4"/>
			<xs:enumeration value="Thread_Pg"/>
			<xs:enumeration value="Thread_R"/>
			<xs:enumeration value="Thread_Rd"/>
			<xs:enumeration value="Thread_Trx1_5"/>
			<xs:enumeration value="Thread_Trx2"/>
			<xs:enumeration value="Thread_Trx3"/>
			<xs:enumeration value="Thread_Trx4"/>
			<xs:enumeration value="Thread_Trx5"/>
			<xs:enumeration value="Thread_Trx6"/>
			<xs:enumeration value="Thread_Trx7"/>
			<xs:enumeration value="Thread_Trx8"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="typeHoleFit">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="None"/>
			<xs:enumeration value="Normal"/>
			<xs:enumeration value="Loose"/>
			<xs:enumeration value="Close"/>
			<xs:enumeration value="Nominal"/>
			<xs:enumeration value="Clearance"/>
			<xs:enumeration value="Press"/>
			<xs:enumeration value="Transitional"/>
			<xs:enumeration value="Tapped"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="typeSimpleLetterDrill">
		<xs:restriction base="xs:string">
			<xs:maxLength value="1"/>
			<xs:pattern value="[A-Z]"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="typeSimpleNumberDrill">
		<xs:restriction base="xs:string">
			<xs:maxLength value="3"/>
			<xs:pattern value="[0-9][0-9][0-9]"/>
		</xs:restriction>
	</xs:simpleType>

	<!-- Simple -->
	<xs:complexType name="typeSimple">
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
		<!-- Hole Size Name -->
		<xs:attribute name="HoleSizeName" type="xs:string" use="optional" />
		<!-- Hole Standard -->
		<xs:attribute name="HoleStandard" type="xs:string" use="optional" />
		<!-- Hole Sub Type -->
		<xs:attribute name="HoleSubType" type="typeHoleStyleSubType" use="optional" />
		<!-- Letter Drill Type -->
		<xs:attribute name="HoleDrillLetterType" type="typeSimpleLetterDrill" use="optional" />
		<!-- Number Drill Type -->
		<xs:attribute name="HoleDrillNumberType" type="typeSimpleNumberDrill" use="optional" />
		<!-- Hole Fit Type -->
		<xs:attribute name="HoleFit" type="typeHoleFit" use="optional" />
	</xs:complexType>

	<!-- ISolidsHoleCounterboreStyle -->
	<xs:complexType name="typeCounterbore">

		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
		<!-- Depth of the Counterbore segment. -->
		<xs:attribute name="Depth" type="typePositiveDouble" use="required" />
		<!-- Diameter of the Counterbore segment. -->
		<xs:attribute name="Diameter" type="typePositiveDouble" use="required" />
		<!-- Chamfer offset on middle segment. -->
		<xs:attribute name="NeckChamferOffset" type="typePositiveDouble" use="optional" />
		<!-- Chamfer angle on middle segment. -->
		<xs:attribute name="NeckChamferAngle" type="typePositiveDouble" use="optional" />
		<!-- Hole Size Name -->
		<xs:attribute name="HoleSizeName" type="xs:string" use="optional" />
		<!-- Hole Standard -->
		<xs:attribute name="HoleStandard" type="xs:string" use="optional" />
		<!-- Hole Sub Type -->
		<xs:attribute name="HoleSubType" type="typeHoleStyleSubType" use="optional" />
		<!-- Hole Fit Type -->
		<xs:attribute name="HoleFit" type="typeHoleFit" use="optional" />
	</xs:complexType>

	<!-- ISolidsHoleCounterdrillStyle (deprecated - use countersink with head clearance) -->
	<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" />
		<!-- Angle of the Countersink segment. -->
		<xs:attribute name="Angle" type="typeAngle" use="required" />
		<!-- Diameter of the Countersink segment. -->
		<xs:attribute name="Diameter" type="typePositiveDouble" use="required" />
		<!-- Depth of the head clearance (top) Countersink segment. -->
		<xs:attribute name="Depth" type="typePositiveDouble" use="optional" />
		<!-- Hole Size Name -->
		<xs:attribute name="HoleSizeName" type="xs:string" use="optional" />
		<!-- Hole Standard -->
		<xs:attribute name="HoleStandard" type="xs:string" use="optional" />
		<!-- Hole Sub Type -->
		<xs:attribute name="HoleSubType" type="typeHoleStyleSubType" use="optional" />
		<!-- Hole Fit Type -->
		<xs:attribute name="HoleFit" type="typeHoleFit" use="optional" />
		<!-- Is head clearance counterbore style - default false-->
		<xs:attribute name="IsHeadClearanceCounterbore" type="xs:boolean" use="optional" />
	</xs:complexType>

	<!-- ISolidsHoleTaperStyle -->
	<xs:complexType name="typeTaper">
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
		<xs:attribute name="Angle" type="typeAngle" use="required" />
		<!-- Hole Size Name -->
		<xs:attribute name="HoleSizeName" type="xs:string" use="optional" />
		<!-- Hole Standard -->
		<xs:attribute name="HoleStandard" type="xs:string" use="optional" />
		<!-- Hole Sub Type -->
		<xs:attribute name="HoleSubType" type="typeHoleStyleSubType" use="optional" />
	</xs:complexType>

	<xs:simpleType name="typeThreadedHoleDiameter">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="TapDrill"/>
			<xs:enumeration value="Cosmetic"/>
		</xs:restriction>
	</xs:simpleType>

	<!-- ISolidsHoleThreadedStyle -->
	<xs:complexType name="typeThreaded">
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
		<!-- Hole Standard -->
		<xs:attribute name="HoleStandard" type="xs:string" use="optional" />
		<!-- Hole Diameter type -->
		<xs:attribute name="HoleSizeName" type="xs:string" use="required" />
		<!-- Hole Tap Diameter -->
		<xs:attribute name="TapDiameter" type="typePositiveDouble" use="required" />
		<!-- Hole Thread Pitch -->
		<xs:attribute name="ThreadPitch" type="typePositiveDouble" use="required" />
		<!-- Hole Thread Family -->
		<xs:attribute name="ThreadFamily" type="xs:string" use="optional" />
		<!-- Hole Thread Direction - true == LH, false == RH -->
		<xs:attribute name="HoleThreadDirectionLeftHand" type="xs:boolean" use="required" />
		<!-- Hole Thread Extent full or partial - true == full -->
		<xs:attribute name="HoleThreadExtentFull" type="xs:boolean" use="optional" />
		<!-- Hole Thread Extent partial value - percentage of hole that has thread -->
		<xs:attribute name="HoleThreadExtentPartialValue" type="typePositiveDouble" use="optional" />
		<!-- Hole Sub Type -->
		<xs:attribute name="HoleSubType" type="typeHoleStyleSubType" use="optional" />
	</xs:complexType>

	<!-- ISolidsHoleFilletSegment -->
	<xs:complexType name="typeFilletSegment">
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />

		<xs:attribute name="Radius" type="typePositiveDouble" use="required" />
		<xs:attribute name="Convex" type="xs:boolean" use="required" />
	</xs:complexType>

	<!-- ISolidsHoleChamferSegment -->
	<xs:complexType name="typeChamferSegment">
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
		<xs:attribute name="UpperDiameter" type="typePositiveDouble" use="required" />
		<xs:attribute name="LowerDiameter" type="typePositiveDouble" use="required" />
	</xs:complexType>

	<!-- ISolidsHoleCustomSegment -->
	<xs:complexType name="typeSegment">
		<xs:sequence>
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="Straight" type="typeSimple"/>
				<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="Threaded" type="typeThreaded"/>
				<xs:element name="Fillet" type="typeFilletSegment"/>
			</xs:choice>
		</xs:sequence>
		<xs:attribute name="IsMetric" type="xs:boolean" use="required" />
		<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="optional" />
	</xs:complexType>

	<!-- Top Chamfer type (Old Style) -->
	<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" />
		<!-- Half angle of chamfer. -->
		<xs:attribute name="Angle" type="typeAngle" use="required" />
	</xs:complexType>

	<xs:simpleType name="typeEdgeTreatmentStyle">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="Chamfer"/>
			<xs:enumeration value="Fillet"/>
		</xs:restriction>
	</xs:simpleType>

	<!-- Edge Treatment Version-->
	<xs:complexType name="typeEdgeTreatmentOptions">
		<xs:attribute name="Style" type="typeEdgeTreatmentStyle" use="required" />
		<xs:attribute name="Angle" type="typeAngle" use="required" />
		<xs:attribute name="Radius" type="typePositiveDouble" use="required" />
		<xs:attribute name="Distance" type="typePositiveDouble" use="required" />
		<xs:attribute name="MatchTopBottom" type="xs:boolean" use="optional" />
		<xs:attribute name="IsEnabled" type="xs:boolean" use="optional" />
	</xs:complexType>

	<!-- Edge Treatment Options-->
	<xs:complexType name="typeEdgeTreatment">
		<xs:sequence>
			<!-- Add new version to support different data -->
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="TopEdgeTreatment" type="typeEdgeTreatmentOptions"/>
			</xs:choice>
			<!-- Add new version to support different data -->
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="BottomEdgeTreatment" type="typeEdgeTreatmentOptions"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>


	<xs:complexType name="typeHoleFitValue">
		<xs:attribute name="Fit" type="typeHoleFit" use="required" />
		<xs:attribute name="Diameter" type="typePositiveDouble" use="required" />
	</xs:complexType>

	<xs:complexType name="typeHoleFitCollection">
		<xs:sequence>
			<xs:element name="HoleFit" type="typeHoleFitValue" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>

	<!-- ISolidsHoleOperation -->
	<xs:complexType name="typeOperation">
		<xs:sequence>
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="TopChamfer" type="typeChamfer"/>
				<xs:element name="EdgeTreatment" type="typeEdgeTreatment"/>
			</xs:choice>
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="HoleFitValues" type="typeHoleFitCollection"/>
			</xs:choice>
			<xs:choice minOccurs="0" maxOccurs="1">
				<xs:element name="Simple" type="typeSimple"/>
				<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="Threaded" type="typeThreaded"/>
				<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="DepthToTipEnd" type="xs:boolean" use="optional" />
		<xs:attribute name="ColorIndex" type="typeColorIndex" use="optional" />
	</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" minOccurs="0" />
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="Name" type="xs:string" use="required" />
		<xs:attribute name="IsStandard" type="xs:boolean" use="optional" />
	</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>