<?xml version="1.0" encoding="ISO-8859-1"?>
<ss:description type="action" id="com.autodesk.XML.TessellateFilesII"
		xmlns:ss="urn:Autodesk:Server"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="urn:Autodesk:Server Schema.xsd">
	<ss:title>Tessellate Files</ss:title>
	<ss:section>Aruba</ss:section>
	<ss:input>com.autodesk.objects.FilesObject</ss:input>
	<ss:output>com.autodesk.objects.FilesObject</ss:output>
	<ss:options>
		<ss:label/>
		<ss:group>
			<ss:label>Tessellation Settings</ss:label>
			<ss:option name="adaptive">
				<ss:label>Adaptive</ss:label>
				<ss:tooltip>Should the tesselation be adaptive.</ss:tooltip>
				<ss:checkbox default="true"/>
			</ss:option>
			<ss:group>
				<ss:label>Adaptive Settings</ss:label>
				<ss:option name="deviation" if="adaptive">
					<ss:label>Chord Deviation</ss:label>
					<ss:tooltip>Minimum value = 0.001, Maximum value = 0.1</ss:tooltip>
					<ss:spinner>
						<ss:double min="0.001" max="0.1" default="0.05"/>
					</ss:spinner>
				</ss:option>
				<ss:option name="length" if="adaptive">
					<ss:label>Maximum Chord Length</ss:label>
					<ss:tooltip>Minimum value = 0.01, Maximum value = 1.0</ss:tooltip>
					<ss:spinner>
						<ss:double min="0.01" max="1.0" default="0.01"/>
					</ss:spinner>
				</ss:option>
				<ss:option name="tolerance" if="adaptive">
					<ss:label>Normal tolerance</ss:label>
					<ss:tooltip>Minimum value = 5, Maximum value = 90</ss:tooltip>
					<ss:spinner>
						<ss:double min="5" max="90" default="5" step="1"/>
					</ss:spinner>
				</ss:option>
			</ss:group>
			<ss:group>
				<ss:label>Non-Adaptive Settings</ss:label>
				<ss:option name="samples" unless="adaptive">
					<ss:label>Number of samples</ss:label>
					<ss:tooltip>Minimum value = 4, Maximum value = 8</ss:tooltip>
					<ss:spinner>
						<ss:integer min="4" max="20" default="8" step="1"/>
					</ss:spinner>
				</ss:option>
				<ss:option name="type" unless="adaptive">
					<ss:label>Sample Type</ss:label>
					<ss:enumeration default="0">
						<ss:label value="entiredomain">Entire Domain</ss:label>
						<ss:label value="g1segments">G1 Segments</ss:label>
						<ss:label value="perspan">Per Span</ss:label>
					</ss:enumeration>
				</ss:option>
			</ss:group>
		</ss:group>
		<ss:option name="suffix">
			<ss:label>File Type</ss:label>
			<ss:enumeration default="0">
				<ss:label value=".wire">Alias Wire File</ss:label>
				<ss:label value=".apf">Aruba Packet File</ss:label>
			</ss:enumeration>
		</ss:option>
	</ss:options>
	<ss:code>
import os
from com.autodesk.workflows import Autodesk
from com.autodesk.objects import FilesObject
from java.io import File

def access(filename):
	# os.access() isn't implemented in this version of jython so I
	# have to work around this absence. This could be beefed up to
	# support R_OK et al.
	file = File(filename)
	return file.canRead()

def tmpfile():
	# And, not surprisingly os.tmpfile() is also not implemented so
	# this code attempts to provide an alternative. However unlike
	# a file returned by tmpfile() the file returned by this
	# function is not automatically deleted when the last
	# handle to it is deleted.
	file = File.createTempFile("tempJournalFile", None)
	return file.getPath()

def createJournalFile(srcFile, dstFile, adaptive, deviation, length, samples, type, tolerance):
	jFileName = tmpfile()
	jFile = open(jFileName, "w+b")
	jFile.write("input \"" + srcFile + "\"\n")
	jFile.write("create unloadfile\n")
	jFile.write("create splinefit 1 1\n")
	jFile.write("create tessellationsettings settings\n")
	if adaptive:
		jFile.write("edit tesselationsettings settings adaptive true\n")
		jFile.write("edit tesselationsettings settings maxchordlength " + length.toString() + "\n")
		jFile.write("edit tesselationsettings settings chorddeviation " + deviation.toString() + "\n")
		jFile.write("edit tesselationsettings settings normaltolerance " + tolerance.toString() + "\n")
	else:
		jFile.write("edit tesselationsettings settings adaptive false\n")
		jFile.write("edit tesselationsettings settings sampletype " + type + "\n")
 		jFile.write("edit tesselationsettings settings numsamples " + samples.toString() + "\n")

	jFile.write("output \"" + dstFile + "\"\n")
	jFile.close()
	return jFileName

def tessellate(srcFile, dstFile, adaptive, deviation, length, samples, type, tolerance):
	# Check that the given file actually exists.
	if not access(srcFile):
		print "Error: Unable to read " + srcFile + "."
		return 0

	settings = createJournalFile(srcFile, dstFile, adaptive, deviation, length, samples, type, tolerance)
	if not access(settings):
		print "Error: Unable to find " + settings + "."
		return 0

	response = Autodesk.tessellate(srcFile, dstFile, settings)
	os.unlink(settings)
	if response == None:
		print "Error: No response from tessellator."
		return 0

	status = response.getJobExitValue()
	if status == 2:
		print "Error: Tessellation failed due to an internal error."
		print response.getJobStdout()
		print response.getJobStderr()
		return 0

	if status == 6:
		print "Error: No license for tessellations."
		return 0

	if not access(dstFile):
		print "Error: Failed to tessellate " + srcFile + "."
		return 0

	return 1

def tessellateFile(file, adaptive, deviation, length, samples, type, suffix, tolerance):
	if file == None:
		return None

	src = file.getPath()
	if not os.path.isfile(src):
		return None

	(root,ext) = os.path.splitext(src)
	dst = root + suffix

	if tessellate(src, dst, adaptive, deviation, length, samples, type, tolerance):
		return dst
	else:
		return None

def main(input, adaptive, deviation, length, samples, type, suffix, tolerance):
	if input != None:
		base = input.getBaseDirectory()
		if base == None:
			baseStr = None
		else:
			baseStr = base.getPath()
		files = input.getFiles()
		results = []
		if files != None:
			for file in files:
				if file != None:
					result = tessellateFile(file, adaptive, deviation, length, samples, type, suffix, tolerance)
					if result != None:
						results.append(result)

			if len(results) > 0:
				return FilesObject(baseStr, results)
	return None

	</ss:code>
</ss:description>
