summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordoomsay <doomsay@cb376a5e-1013-0410-a455-b6b1f9ac8223>2009-01-16 03:36:53 +0000
committerdoomsay <doomsay@cb376a5e-1013-0410-a455-b6b1f9ac8223>2009-01-16 03:36:53 +0000
commit5fbba2854b6e242c44a136c51e4cd65c3ceefd47 (patch)
tree19751bb42ce6ba5ceab9445f03f5d8f4ba8650ca
parent6b8a5e2034df587b6d7cdacb6b727899e19c0cf6 (diff)
downloadreprap-backup-5fbba2854b6e242c44a136c51e4cd65c3ceefd47.tar.gz
reprap-backup-5fbba2854b6e242c44a136c51e4cd65c3ceefd47.zip
carve, inset and wipe added
slice_shape and nozzle_wipe removed git-svn-id: https://reprap.svn.sourceforge.net/svnroot/reprap@2402 cb376a5e-1013-0410-a455-b6b1f9ac8223
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge.html42
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze.html6
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.enrique.html6
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.gRead.html6
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.preview.html2
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.comment.html8
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.gifscene.html121
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.skeinview.html6
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.statistic.html11
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.vectorwrite.html12
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.carve.html192
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.clip.html36
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.comb.html46
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.cool.html32
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export.html22
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.binary_16_byte.html10
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_small.html6
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_step.html10
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fill.html71
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fillet.html60
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.hop.html32
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.html12
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.gts.html83
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.html7
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.slc.html152
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.stl.html18
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.svg.html130
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_translator.html120
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.inset.html188
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.material.html2
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.multiply.html32
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.nozzle_wipe.html180
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.oozebane.html47
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.polyfile.html10
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.raft.html74
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.euclidean.html213
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.gcodec.html36
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.html10
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.intercircle.html95
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.interpret.html68
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.preferences.html6
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.triangle_mesh.html100
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vec3.html95
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vector3.html171
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.slice_shape.html237
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.speed.html44
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.stretch.html36
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.tower.html32
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.unpause.html22
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.wipe.html181
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge.py62
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze.py32
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/enrique.py10
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/gRead.py10
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/preview.py4
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/comment.py38
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/skeinview.py32
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/statistic.py62
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/vectorwrite.py50
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/carve.py399
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/clip.py46
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/comb.py51
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/cool.py46
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export.py38
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/binary_16_byte.py48
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_small.py22
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_step.py54
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fill.py127
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fillet.py110
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/hop.py62
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/gts.py94
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/slc.py200
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/stl.py26
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/svg.py199
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/inset.py601
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/material.py8
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/multiply.py48
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/oozebane.py74
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/polyfile.py38
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/raft.py129
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/euclidean.py12
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/gcodec.py129
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/interpret.py59
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/preferences.py36
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/triangle_mesh.py515
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/slice_shape.py929
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/speed.py58
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/stretch.py46
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/tower.py56
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/unpause.py42
-rw-r--r--trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/wipe.py (renamed from trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/nozzle_wipe.py)191
91 files changed, 4763 insertions, 3168 deletions
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge.html
index 17dd72b4..e9aeedbb 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge.html
@@ -11,11 +11,11 @@
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge.py</a></font></td></tr></table>
<p><tt>Introduction<br>
&nbsp;<br>
-Skeinforge&nbsp;is&nbsp;a&nbsp;tool&nbsp;chain&nbsp;to&nbsp;forge&nbsp;a&nbsp;gcode&nbsp;skein&nbsp;for&nbsp;a&nbsp;model.<br>
+Skeinforge&nbsp;is&nbsp;a&nbsp;GPL&nbsp;tool&nbsp;chain&nbsp;to&nbsp;forge&nbsp;a&nbsp;gcode&nbsp;skein&nbsp;for&nbsp;a&nbsp;model.<br>
&nbsp;<br>
-The&nbsp;tool&nbsp;chain&nbsp;starts&nbsp;with&nbsp;slice_shape,&nbsp;which&nbsp;slices&nbsp;the&nbsp;model&nbsp;into&nbsp;layers,&nbsp;then&nbsp;the&nbsp;layers&nbsp;are&nbsp;modified&nbsp;by&nbsp;other&nbsp;tools&nbsp;in&nbsp;turn&nbsp;like<br>
-fill,&nbsp;comb,&nbsp;tower,&nbsp;raft,&nbsp;stretch,&nbsp;hop,&nbsp;nozzle_wipe,&nbsp;oozebane,&nbsp;fillet&nbsp;&amp;&nbsp;export.&nbsp;&nbsp;Each&nbsp;tool&nbsp;automatically&nbsp;gets&nbsp;the&nbsp;gcode&nbsp;from&nbsp;the<br>
-previous&nbsp;tool.&nbsp;&nbsp;So&nbsp;if&nbsp;you&nbsp;want&nbsp;a&nbsp;sliced&nbsp;&amp;&nbsp;filled&nbsp;gcode,&nbsp;call&nbsp;the&nbsp;fill&nbsp;tool&nbsp;and&nbsp;it&nbsp;will&nbsp;call&nbsp;slice_shape,&nbsp;then&nbsp;it&nbsp;will&nbsp;fill&nbsp;and&nbsp;output&nbsp;the<br>
+The&nbsp;tool&nbsp;chain&nbsp;starts&nbsp;with&nbsp;carve,&nbsp;which&nbsp;carves&nbsp;the&nbsp;model&nbsp;into&nbsp;layers,&nbsp;then&nbsp;the&nbsp;layers&nbsp;are&nbsp;modified&nbsp;by&nbsp;other&nbsp;tools&nbsp;in&nbsp;turn&nbsp;like<br>
+fill,&nbsp;comb,&nbsp;tower,&nbsp;raft,&nbsp;stretch,&nbsp;hop,&nbsp;wipe,&nbsp;oozebane,&nbsp;fillet&nbsp;&amp;&nbsp;export.&nbsp;&nbsp;Each&nbsp;tool&nbsp;automatically&nbsp;gets&nbsp;the&nbsp;gcode&nbsp;from&nbsp;the<br>
+previous&nbsp;tool.&nbsp;&nbsp;So&nbsp;if&nbsp;you&nbsp;want&nbsp;a&nbsp;carved&nbsp;&amp;&nbsp;filled&nbsp;gcode,&nbsp;call&nbsp;the&nbsp;fill&nbsp;tool&nbsp;and&nbsp;it&nbsp;will&nbsp;call&nbsp;carve,&nbsp;then&nbsp;it&nbsp;will&nbsp;fill&nbsp;and&nbsp;output&nbsp;the<br>
gcode.&nbsp;&nbsp;If&nbsp;you&nbsp;want&nbsp;to&nbsp;use&nbsp;all&nbsp;the&nbsp;tools,&nbsp;call&nbsp;export&nbsp;and&nbsp;it&nbsp;will&nbsp;call&nbsp;in&nbsp;turn&nbsp;all&nbsp;the&nbsp;other&nbsp;tools&nbsp;down&nbsp;the&nbsp;chain&nbsp;to&nbsp;produce&nbsp;the&nbsp;gcode&nbsp;file.<br>
&nbsp;<br>
The&nbsp;skeinforge&nbsp;module&nbsp;provides&nbsp;a&nbsp;single&nbsp;place&nbsp;to&nbsp;call&nbsp;up&nbsp;all&nbsp;the&nbsp;preference&nbsp;dialogs.&nbsp;&nbsp;When&nbsp;the&nbsp;'Skeinforge'&nbsp;button&nbsp;is&nbsp;clicked,<br>
@@ -35,10 +35,10 @@ There&nbsp;are&nbsp;also&nbsp;tools&nbsp;which&nbsp;handle&nbsp;preferences&nbsp
The&nbsp;analyze&nbsp;tool&nbsp;calls&nbsp;plugins&nbsp;in&nbsp;the&nbsp;analyze_plugins&nbsp;folder,&nbsp;which&nbsp;will&nbsp;analyze&nbsp;the&nbsp;gcode&nbsp;in&nbsp;some&nbsp;way&nbsp;when&nbsp;it&nbsp;is&nbsp;generated&nbsp;if<br>
their&nbsp;Activate&nbsp;checkbox&nbsp;is&nbsp;selected.<br>
&nbsp;<br>
-The&nbsp;import_translator&nbsp;tool&nbsp;accesses&nbsp;and&nbsp;displays&nbsp;the&nbsp;import&nbsp;plugins.<br>
+The&nbsp;interpret&nbsp;tool&nbsp;accesses&nbsp;and&nbsp;displays&nbsp;the&nbsp;import&nbsp;plugins.<br>
&nbsp;<br>
The&nbsp;default&nbsp;preferences&nbsp;are&nbsp;similar&nbsp;to&nbsp;those&nbsp;on&nbsp;Nophead's&nbsp;machine.&nbsp;&nbsp;A&nbsp;preference&nbsp;which&nbsp;is&nbsp;often&nbsp;different&nbsp;is&nbsp;the<br>
-'Extrusion&nbsp;Diameter'&nbsp;in&nbsp;slice_shape.<br>
+'Extrusion&nbsp;Diameter'&nbsp;in&nbsp;carve.<br>
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
@@ -73,17 +73,17 @@ When&nbsp;the&nbsp;skeinforge&nbsp;dialog&nbsp;pops&nbsp;up,&nbsp;click&nbsp;'Sk
and&nbsp;the&nbsp;gcode&nbsp;file&nbsp;will&nbsp;be&nbsp;saved&nbsp;with&nbsp;the&nbsp;suffix&nbsp;'_export.gcode'.<br>
&nbsp;<br>
Or&nbsp;you&nbsp;can&nbsp;turn&nbsp;files&nbsp;into&nbsp;gcode&nbsp;by&nbsp;adding&nbsp;the&nbsp;file&nbsp;name,&nbsp;for&nbsp;example:<br>
-&gt;&nbsp;python&nbsp;skeinforge.py&nbsp;Hollow&nbsp;Square.stl<br>
+&gt;&nbsp;python&nbsp;skeinforge.py&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl<br>
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
End&nbsp;of&nbsp;the&nbsp;Beginning<br>
&nbsp;<br>
-When&nbsp;slice&nbsp;is&nbsp;generating&nbsp;the&nbsp;code,&nbsp;if&nbsp;there&nbsp;is&nbsp;a&nbsp;file&nbsp;start.txt,&nbsp;it&nbsp;will&nbsp;add&nbsp;that&nbsp;to&nbsp;the&nbsp;very&nbsp;beginning&nbsp;of&nbsp;the&nbsp;gcode.&nbsp;&nbsp;After&nbsp;it&nbsp;has<br>
+When&nbsp;carve&nbsp;is&nbsp;generating&nbsp;the&nbsp;code,&nbsp;if&nbsp;there&nbsp;is&nbsp;a&nbsp;file&nbsp;start.txt,&nbsp;it&nbsp;will&nbsp;add&nbsp;that&nbsp;to&nbsp;the&nbsp;very&nbsp;beginning&nbsp;of&nbsp;the&nbsp;gcode.&nbsp;&nbsp;After&nbsp;it&nbsp;has<br>
added&nbsp;some&nbsp;initialization&nbsp;code&nbsp;and&nbsp;just&nbsp;before&nbsp;it&nbsp;adds&nbsp;the&nbsp;extrusion&nbsp;gcode,&nbsp;it&nbsp;will&nbsp;add&nbsp;the&nbsp;file&nbsp;endofthebeginning.txt&nbsp;if&nbsp;it&nbsp;exists.<br>
-At&nbsp;the&nbsp;very&nbsp;end,&nbsp;it&nbsp;will&nbsp;add&nbsp;the&nbsp;file&nbsp;end.txt&nbsp;if&nbsp;it&nbsp;exists.&nbsp;&nbsp;Slice&nbsp;does&nbsp;not&nbsp;care&nbsp;if&nbsp;the&nbsp;text&nbsp;file&nbsp;names&nbsp;are&nbsp;capitalized,&nbsp;but&nbsp;some&nbsp;file<br>
+At&nbsp;the&nbsp;very&nbsp;end,&nbsp;it&nbsp;will&nbsp;add&nbsp;the&nbsp;file&nbsp;end.txt&nbsp;if&nbsp;it&nbsp;exists.&nbsp;&nbsp;Carve&nbsp;does&nbsp;not&nbsp;care&nbsp;if&nbsp;the&nbsp;text&nbsp;file&nbsp;names&nbsp;are&nbsp;capitalized,&nbsp;but&nbsp;some&nbsp;file<br>
systems&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;name&nbsp;cases&nbsp;properly,&nbsp;so&nbsp;to&nbsp;be&nbsp;on&nbsp;the&nbsp;safe&nbsp;side&nbsp;you&nbsp;should&nbsp;give&nbsp;them&nbsp;lower&nbsp;case&nbsp;names.&nbsp;&nbsp;It&nbsp;will<br>
-first&nbsp;look&nbsp;for&nbsp;the&nbsp;file&nbsp;in&nbsp;the&nbsp;same&nbsp;directory&nbsp;as&nbsp;slice,&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;find&nbsp;it&nbsp;it&nbsp;will&nbsp;look&nbsp;in&nbsp;~/.skeinforge/gcode_scripts.<br>
+first&nbsp;look&nbsp;for&nbsp;the&nbsp;file&nbsp;in&nbsp;the&nbsp;same&nbsp;directory&nbsp;as&nbsp;carve,&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;find&nbsp;it&nbsp;it&nbsp;will&nbsp;look&nbsp;in&nbsp;~/.skeinforge/gcode_scripts.<br>
&nbsp;<br>
The&nbsp;computation&nbsp;intensive&nbsp;python&nbsp;modules&nbsp;will&nbsp;use&nbsp;psyco&nbsp;if&nbsp;it&nbsp;is&nbsp;available&nbsp;and&nbsp;run&nbsp;about&nbsp;twice&nbsp;as&nbsp;fast.&nbsp;&nbsp;Psyco&nbsp;is&nbsp;described&nbsp;at:<br>
<a href="http://psyco.sourceforge.net/index.html">http://psyco.sourceforge.net/index.html</a><br>
@@ -159,8 +159,8 @@ folder.<br>
STL&nbsp;is&nbsp;an&nbsp;inferior&nbsp;triangle&nbsp;surface&nbsp;format,&nbsp;described&nbsp;at:<br>
<a href="http://en.wikipedia.org/wiki/STL_(file_format">http://en.wikipedia.org/wiki/STL_(file_format</a>)<br>
&nbsp;<br>
-If&nbsp;you're&nbsp;using&nbsp;an&nbsp;STL&nbsp;file&nbsp;and&nbsp;you&nbsp;can't&nbsp;even&nbsp;slice&nbsp;it,&nbsp;try&nbsp;converting&nbsp;it&nbsp;to&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;in&nbsp;Art&nbsp;of&nbsp;Illusion.&nbsp;&nbsp;If<br>
-it&nbsp;still&nbsp;doesn't&nbsp;slice,&nbsp;then&nbsp;follow&nbsp;the&nbsp;advice&nbsp;in&nbsp;the&nbsp;troubleshooting&nbsp;section.<br>
+If&nbsp;you're&nbsp;using&nbsp;an&nbsp;STL&nbsp;file&nbsp;and&nbsp;you&nbsp;can't&nbsp;even&nbsp;carve&nbsp;it,&nbsp;try&nbsp;converting&nbsp;it&nbsp;to&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;in&nbsp;Art&nbsp;of&nbsp;Illusion.&nbsp;&nbsp;If<br>
+it&nbsp;still&nbsp;doesn't&nbsp;carve,&nbsp;then&nbsp;follow&nbsp;the&nbsp;advice&nbsp;in&nbsp;the&nbsp;troubleshooting&nbsp;section.<br>
&nbsp;<br>
&nbsp;<br>
&nbsp;<br>
@@ -190,8 +190,8 @@ If&nbsp;there's&nbsp;a&nbsp;bug,&nbsp;try&nbsp;downloading&nbsp;the&nbsp;very&nb
Then&nbsp;you&nbsp;can&nbsp;ask&nbsp;for&nbsp;skeinforge&nbsp;help&nbsp;by&nbsp;sending&nbsp;a&nbsp;private&nbsp;message&nbsp;through&nbsp;the&nbsp;forum&nbsp;software&nbsp;by&nbsp;going&nbsp;to&nbsp;my&nbsp;page&nbsp;at:<br>
<a href="http://forums.reprap.org/profile.php?12,488">http://forums.reprap.org/profile.php?12,488</a><br>
&nbsp;<br>
-or&nbsp;posting&nbsp;in&nbsp;the&nbsp;"How&nbsp;to&nbsp;Print&nbsp;Gcode&nbsp;from&nbsp;Host"&nbsp;thread&nbsp;at:<br>
-<a href="http://forums.reprap.org/read.php?12,10772">http://forums.reprap.org/read.php?12,10772</a><br>
+or&nbsp;posting&nbsp;in&nbsp;the&nbsp;"Skeinforge&nbsp;Powwow"&nbsp;thread&nbsp;at:<br>
+<a href="http://forums.reprap.org/read.php?12,20013">http://forums.reprap.org/read.php?12,20013</a><br>
&nbsp;<br>
When&nbsp;asking&nbsp;for&nbsp;help&nbsp;please&nbsp;include&nbsp;your&nbsp;object&nbsp;and&nbsp;your&nbsp;zipped&nbsp;skeinforge&nbsp;preferences.&nbsp;&nbsp;The&nbsp;skeinforge&nbsp;preferences&nbsp;are&nbsp;in<br>
the&nbsp;.skeinforge&nbsp;folder&nbsp;in&nbsp;your&nbsp;home&nbsp;directory.<br>
@@ -199,7 +199,7 @@ the&nbsp;.skeinforge&nbsp;folder&nbsp;in&nbsp;your&nbsp;home&nbsp;directory.<br>
&nbsp;<br>
Examples<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;slice&nbsp;and&nbsp;dice&nbsp;the&nbsp;STL&nbsp;file&nbsp;Screw&nbsp;Holder.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
+The&nbsp;following&nbsp;examples&nbsp;carve&nbsp;and&nbsp;dice&nbsp;the&nbsp;STL&nbsp;file&nbsp;Screw&nbsp;Holder.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
contains&nbsp;Screw&nbsp;Holder.gts&nbsp;and&nbsp;skeinforge.py.<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;skeinforge.py<br>
@@ -231,7 +231,7 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;skeinforge&nbsp;dialog.</tt></p>
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="cStringIO.html">cStringIO</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
<a href="sys.html">sys</a><br>
@@ -255,7 +255,7 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;skeinforge&nbsp;dialog.</tt></p>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;skeinforge&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="SkeinforgePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="SkeinforgePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="SkeinforgePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Skeinforge&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -266,9 +266,9 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;skeinforge&nbsp;dialog.</tt></p>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getSkeinforgeToolFilenames"><strong>getSkeinforgeToolFilenames</strong></a>()</dt><dd><tt>Get&nbsp;skeinforge&nbsp;plugin&nbsp;filenames.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getSkeinforgeToolFilenames"><strong>getSkeinforgeToolFilenames</strong></a>()</dt><dd><tt>Get&nbsp;skeinforge&nbsp;plugin&nbsp;fileNames.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;skeinforge&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Skeinforge&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;skeinforge&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Skeinforge&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;skeinforge&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
@@ -299,11 +299,15 @@ Adrian&nbsp;Bowyer&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,13"
Brendan&nbsp;Erwin&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,217">http://forums.reprap.org/profile.php?12,217</a>&gt;<br>
Greenarrow&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,81">http://forums.reprap.org/profile.php?12,81</a>&gt;<br>
Ian&nbsp;England&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,192">http://forums.reprap.org/profile.php?12,192</a>&gt;<br>
+John&nbsp;Gilmore&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,364">http://forums.reprap.org/profile.php?12,364</a>&gt;<br>
+Jonwise&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,716">http://forums.reprap.org/profile.php?12,716</a>&gt;<br>
Kyle&nbsp;Corbitt&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,90">http://forums.reprap.org/profile.php?12,90</a>&gt;<br>
Marius&nbsp;Kintel&nbsp;&lt;<a href="http://reprap.soup.io/">http://reprap.soup.io/</a>&gt;<br>
Nophead&nbsp;&lt;<a href="http://www.blogger.com/profile/12801535866788103677">http://www.blogger.com/profile/12801535866788103677</a>&gt;<br>
+PJR&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,757">http://forums.reprap.org/profile.php?12,757</a>&gt;<br>
Reece.Arnott&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,152">http://forums.reprap.org/profile.php?12,152</a>&gt;<br>
Wade&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,489">http://forums.reprap.org/profile.php?12,489</a>&gt;<br>
+Zach&nbsp;Hoeken&nbsp;&lt;<a href="http://blog.zachhoeken.com/">http://blog.zachhoeken.com/</a>&gt;<br>
&nbsp;<br>
Organizations:<br>
Art&nbsp;of&nbsp;Illusion&nbsp;&lt;<a href="http://www.artofillusion.org/">http://www.artofillusion.org/</a>&gt;</td></tr></table>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze.html
index 1321bdc7..58dea8e2 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze.html
@@ -50,7 +50,7 @@ A&nbsp;gode&nbsp;example&nbsp;is&nbsp;at:<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;analyze&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="AnalyzePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="AnalyzePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="AnalyzePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Analyze&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -61,9 +61,9 @@ A&nbsp;gode&nbsp;example&nbsp;is&nbsp;at:<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getAnalyzePluginFilenames"><strong>getAnalyzePluginFilenames</strong></a>()</dt><dd><tt>Get&nbsp;analyze&nbsp;plugin&nbsp;filenames.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getAnalyzePluginFilenames"><strong>getAnalyzePluginFilenames</strong></a>()</dt><dd><tt>Get&nbsp;analyze&nbsp;plugin&nbsp;fileNames.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;analyze&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Analyze&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;comment&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Analyze&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;comment&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.enrique.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.enrique.html
index a6034adf..c1aa835d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.enrique.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.enrique.html
@@ -38,7 +38,7 @@
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="g2gif-__init__"><strong>__init__</strong></a>(self, filename, outfile)</dt></dl>
+<dl><dt><a name="g2gif-__init__"><strong>__init__</strong></a>(self, fileName, outfile)</dt></dl>
<dl><dt><a name="g2gif-linearMove"><strong>linearMove</strong></a>(self, splitLine)</dt></dl>
@@ -61,8 +61,8 @@
#&nbsp;@param&nbsp;&nbsp;word&nbsp;string&nbsp;with&nbsp;value&nbsp;starting&nbsp;after&nbsp;the&nbsp;first&nbsp;letter<br>
#&nbsp;@return&nbsp;&nbsp;double&nbsp;value&nbsp;of&nbsp;the&nbsp;word&nbsp;after&nbsp;the&nbsp;first&nbsp;letter</tt></dd></dl>
<dl><dt><a name="-getDoubleForLetter"><strong>getDoubleForLetter</strong></a>(letter, splitLine)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;double&nbsp;value&nbsp;of&nbsp;the&nbsp;word&nbsp;after&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;letter&nbsp;in&nbsp;the&nbsp;split&nbsp;line.</tt></dd></dl>
- <dl><dt><a name="-getFileText"><strong>getFileText</strong></a>(filename)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.<br>
-#&nbsp;@param&nbsp;&nbsp;filename&nbsp;name&nbsp;of&nbsp;the&nbsp;file<br>
+ <dl><dt><a name="-getFileText"><strong>getFileText</strong></a>(fileName)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.<br>
+#&nbsp;@param&nbsp;&nbsp;fileName&nbsp;name&nbsp;of&nbsp;the&nbsp;file<br>
#&nbsp;@return&nbsp;&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.</tt></dd></dl>
<dl><dt><a name="-getTextLines"><strong>getTextLines</strong></a>(text)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;all&nbsp;the&nbsp;lines&nbsp;of&nbsp;text&nbsp;of&nbsp;a&nbsp;text.<br>
#&nbsp;@param&nbsp;&nbsp;text&nbsp;text<br>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.gRead.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.gRead.html
index 9dde822d..8d07d549 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.gRead.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.gRead.html
@@ -36,7 +36,7 @@
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="gRead-__init__"><strong>__init__</strong></a>(self, filename, layers, gcodeText<font color="#909090">=''</font>)</dt></dl>
+<dl><dt><a name="gRead-__init__"><strong>__init__</strong></a>(self, fileName, layers, gcodeText<font color="#909090">=''</font>)</dt></dl>
<dl><dt><a name="gRead-linearMove"><strong>linearMove</strong></a>(self, splitLine)</dt></dl>
@@ -58,8 +58,8 @@
<td width="100%"><dl><dt><a name="-getDoubleAfterFirstLetter"><strong>getDoubleAfterFirstLetter</strong></a>(word)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;double&nbsp;value&nbsp;of&nbsp;the&nbsp;word&nbsp;after&nbsp;the&nbsp;first&nbsp;letter.<br>
#&nbsp;@param&nbsp;&nbsp;word&nbsp;string&nbsp;with&nbsp;value&nbsp;starting&nbsp;after&nbsp;the&nbsp;first&nbsp;letter<br>
#&nbsp;@return&nbsp;&nbsp;double&nbsp;value&nbsp;of&nbsp;the&nbsp;word&nbsp;after&nbsp;the&nbsp;first&nbsp;letter</tt></dd></dl>
- <dl><dt><a name="-getFileText"><strong>getFileText</strong></a>(filename)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.<br>
-#&nbsp;@param&nbsp;&nbsp;filename&nbsp;name&nbsp;of&nbsp;the&nbsp;file<br>
+ <dl><dt><a name="-getFileText"><strong>getFileText</strong></a>(fileName)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.<br>
+#&nbsp;@param&nbsp;&nbsp;fileName&nbsp;name&nbsp;of&nbsp;the&nbsp;file<br>
#&nbsp;@return&nbsp;&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.</tt></dd></dl>
<dl><dt><a name="-getTextLines"><strong>getTextLines</strong></a>(text)</dt><dd><tt>#&nbsp;Get&nbsp;the&nbsp;all&nbsp;the&nbsp;lines&nbsp;of&nbsp;text&nbsp;of&nbsp;a&nbsp;text.<br>
#&nbsp;@param&nbsp;&nbsp;text&nbsp;text<br>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.preview.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.preview.html
index 41ede809..c4af1c8d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.preview.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.analyze_utilities.preview.html
@@ -55,7 +55,7 @@
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-viewGif"><strong>viewGif</strong></a>(filename, gcodeText<font color="#909090">=''</font>)</dt></dl>
+<td width="100%"><dl><dt><a name="-viewGif"><strong>viewGif</strong></a>(fileName, gcodeText<font color="#909090">=''</font>)</dt></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.comment.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.comment.html
index b24c01ec..64c584da 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.comment.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.comment.html
@@ -76,7 +76,7 @@ The&nbsp;commented&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder_c
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;comment&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="CommentPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="CommentPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="CommentPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Write&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -109,11 +109,11 @@ The&nbsp;commented&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder_c
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-commentFile"><strong>commentFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Comment&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;comment&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-commentFile"><strong>commentFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Comment&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;comment&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
<dl><dt><a name="-getCommentGcode"><strong>getCommentGcode</strong></a>(gcodeText)</dt><dd><tt>Get&nbsp;gcode&nbsp;text&nbsp;with&nbsp;added&nbsp;comments.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;comment&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeCommentFileGivenText"><strong>writeCommentFileGivenText</strong></a>(filename, gcodeText)</dt><dd><tt>Write&nbsp;a&nbsp;commented&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;a&nbsp;commented&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Write&nbsp;Commented&nbsp;File&nbsp;for&nbsp;Skeinforge&nbsp;Chain'&nbsp;is&nbsp;selected.</tt></dd></dl>
+ <dl><dt><a name="-writeCommentFileGivenText"><strong>writeCommentFileGivenText</strong></a>(fileName, gcodeText)</dt><dd><tt>Write&nbsp;a&nbsp;commented&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;a&nbsp;commented&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Write&nbsp;Commented&nbsp;File&nbsp;for&nbsp;Skeinforge&nbsp;Chain'&nbsp;is&nbsp;selected.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.gifscene.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.gifscene.html
deleted file mode 100644
index 55d31e57..00000000
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.gifscene.html
+++ /dev/null
@@ -1,121 +0,0 @@
-
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: module skeinforge_tools.analyze_plugins.gifscene</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.analyze_plugins.html"><font color="#ffffff">analyze_plugins</font></a>.gifscene</strong></big></big> ($Date: 2008/21/04 $)</font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/analyze_plugins/gifscene.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/analyze_plugins/gifscene.py</a></font></td></tr></table>
- <p><tt>Gifscene&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;display&nbsp;a&nbsp;gif&nbsp;for&nbsp;each&nbsp;layer&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.<br>
-&nbsp;<br>
-The&nbsp;default&nbsp;'Activate&nbsp;Gifscene'&nbsp;checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;When&nbsp;it&nbsp;is&nbsp;on,&nbsp;the&nbsp;functions&nbsp;described&nbsp;below&nbsp;will&nbsp;work&nbsp;when&nbsp;called&nbsp;from&nbsp;the<br>
-skeinforge&nbsp;toolchain,&nbsp;when&nbsp;it&nbsp;is&nbsp;off,&nbsp;the&nbsp;functions&nbsp;will&nbsp;not&nbsp;be&nbsp;called&nbsp;from&nbsp;the&nbsp;toolchain.&nbsp;&nbsp;The&nbsp;functions&nbsp;will&nbsp;still&nbsp;be&nbsp;called,&nbsp;whether<br>
-or&nbsp;not&nbsp;the&nbsp;'Activate&nbsp;Gifscene'&nbsp;checkbox&nbsp;is&nbsp;on,&nbsp;when&nbsp;gifscene&nbsp;is&nbsp;run&nbsp;directly.<br>
-&nbsp;<br>
-To&nbsp;run&nbsp;gifscene,&nbsp;in&nbsp;a&nbsp;shell&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;gifscene&nbsp;is&nbsp;in&nbsp;type:<br>
-&gt;&nbsp;python&nbsp;gifscene.py<br>
-&nbsp;<br>
-To&nbsp;run&nbsp;gifscene&nbsp;you&nbsp;need&nbsp;the&nbsp;Python&nbsp;Imaging&nbsp;Library,&nbsp;which&nbsp;can&nbsp;be&nbsp;downloaded&nbsp;from:<br>
-www.pythonware.com/products/pil/<br>
-&nbsp;<br>
-I&nbsp;have&nbsp;not&nbsp;been&nbsp;able&nbsp;to&nbsp;install&nbsp;the&nbsp;Python&nbsp;Imaging&nbsp;Library,&nbsp;so&nbsp;I&nbsp;can&nbsp;only&nbsp;hope&nbsp;that&nbsp;I'm&nbsp;calling&nbsp;Nophead's&nbsp;code&nbsp;correctly.&nbsp;&nbsp;If&nbsp;you<br>
-have&nbsp;the&nbsp;Python&nbsp;Imaging&nbsp;Library&nbsp;and&nbsp;gifscene&nbsp;still&nbsp;does&nbsp;not&nbsp;work&nbsp;for&nbsp;you,&nbsp;please&nbsp;post&nbsp;that&nbsp;in&nbsp;the&nbsp;'How&nbsp;to&nbsp;Print&nbsp;Gcode&nbsp;from&nbsp;Host'<br>
-thread&nbsp;at:<br>
-<a href="http://forums.reprap.org/read.php?12,10772">http://forums.reprap.org/read.php?12,10772</a><br>
-&nbsp;<br>
-An&nbsp;explanation&nbsp;of&nbsp;the&nbsp;gcodes&nbsp;is&nbsp;at:<br>
-<a href="http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter">http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter</a><br>
-&nbsp;<br>
-and&nbsp;at:<br>
-<a href="http://reprap.org/bin/view/Main/MCodeReference">http://reprap.org/bin/view/Main/MCodeReference</a><br>
-&nbsp;<br>
-A&nbsp;gode&nbsp;example&nbsp;is&nbsp;at:<br>
-<a href="http://forums.reprap.org/file.php?12,file=565">http://forums.reprap.org/file.php?12,file=565</a><br>
-&nbsp;<br>
-Gifscene&nbsp;may&nbsp;not&nbsp;work&nbsp;when&nbsp;called&nbsp;from&nbsp;the&nbsp;toolchain.&nbsp;&nbsp;If&nbsp;it&nbsp;does&nbsp;not,&nbsp;try&nbsp;running&nbsp;it&nbsp;directly.<br>
-&nbsp;<br>
-This&nbsp;example&nbsp;displays&nbsp;gifs&nbsp;for&nbsp;the&nbsp;gcode&nbsp;file&nbsp;Screw&nbsp;Holder.gcode.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
-contains&nbsp;Screw&nbsp;Holder.gcode&nbsp;and&nbsp;gifscene.py.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python<br>
-Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
-[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
-Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
-&gt;&gt;&gt;&nbsp;import&nbsp;gifscene<br>
-&gt;&gt;&gt;&nbsp;gifscene.<a href="#-main">main</a>()<br>
-This&nbsp;brings&nbsp;up&nbsp;the&nbsp;gifscene&nbsp;dialog.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&gt;&gt;&nbsp;gifscene.<a href="#-gifsceneFile">gifsceneFile</a>()<br>
-A&nbsp;gif&nbsp;for&nbsp;each&nbsp;layer&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file&nbsp;is&nbsp;displayed.</tt></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
-
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
-<a href="cStringIO.html">cStringIO</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
-<a href="sys.html">sys</a><br>
-</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ee77aa">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
-
-<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl>
-<dt><font face="helvetica, arial"><a href="skeinforge_tools.analyze_plugins.gifscene.html#GifscenePreferences">GifscenePreferences</a>
-</font></dt></dl>
- <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="GifscenePreferences">class <strong>GifscenePreferences</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;gifscene&nbsp;preferences.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="GifscenePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
-
-<dl><dt><a name="GifscenePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Write&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
-
-</td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#eeaa77">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
-
-<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-gifsceneFile"><strong>gifsceneFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Gifscene&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;gifscene&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
- <dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;gifscene&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeGifsceneFileGivenText"><strong>writeGifsceneFileGivenText</strong></a>(filename, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;a&nbsp;gifsceneed&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;a&nbsp;gifsceneed&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Activate&nbsp;Gifscene'&nbsp;is&nbsp;selected.</tt></dd></dl>
-</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#55aa55">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
-
-<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
-<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
-<strong>__license__</strong> = 'GPL 3.0'<br>
-<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#7799ee">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
-
-<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
-</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.skeinview.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.skeinview.html
index 5adbd61b..61127a7b 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.skeinview.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.skeinview.html
@@ -134,7 +134,7 @@ This&nbsp;brings&nbsp;up&nbsp;a&nbsp;skein&nbsp;window&nbsp;to&nbsp;view&nbsp;ea
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;skeinview&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="SkeinviewPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="SkeinviewPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="SkeinviewPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Write&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -175,8 +175,8 @@ This&nbsp;brings&nbsp;up&nbsp;a&nbsp;skein&nbsp;window&nbsp;to&nbsp;view&nbsp;ea
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-displaySkeinviewFileGivenText"><strong>displaySkeinviewFileGivenText</strong></a>(gcodeText, skeinviewPreferences<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;a&nbsp;skeinviewed&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;skeinview&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-skeinviewFile"><strong>skeinviewFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Skeinview&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;skeinview&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;a&nbsp;skeinviewed&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Activate&nbsp;Skeinview'&nbsp;is&nbsp;selected.</tt></dd></dl>
+ <dl><dt><a name="-skeinviewFile"><strong>skeinviewFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Skeinview&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;skeinview&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;a&nbsp;skeinviewed&nbsp;gcode&nbsp;file&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Activate&nbsp;Skeinview'&nbsp;is&nbsp;selected.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.statistic.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.statistic.html
index 8f8a16ee..9c029d41 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.statistic.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.statistic.html
@@ -15,6 +15,9 @@ The&nbsp;default&nbsp;'Activate&nbsp;Statistic'&nbsp;checkbox&nbsp;is&nbsp;on.&n
skeinforge&nbsp;toolchain,&nbsp;when&nbsp;it&nbsp;is&nbsp;off,&nbsp;the&nbsp;functions&nbsp;will&nbsp;not&nbsp;be&nbsp;called&nbsp;from&nbsp;the&nbsp;toolchain.&nbsp;&nbsp;The&nbsp;functions&nbsp;will&nbsp;still&nbsp;be&nbsp;called,&nbsp;whether<br>
or&nbsp;not&nbsp;the&nbsp;'Activate&nbsp;Statistic'&nbsp;checkbox&nbsp;is&nbsp;on,&nbsp;when&nbsp;statistic&nbsp;is&nbsp;run&nbsp;directly.<br>
&nbsp;<br>
+When&nbsp;the&nbsp;'Print&nbsp;Statistics'&nbsp;checkbox&nbsp;is&nbsp;on,&nbsp;the&nbsp;statistics&nbsp;will&nbsp;be&nbsp;printed&nbsp;to&nbsp;the&nbsp;console,&nbsp;the&nbsp;default&nbsp;is&nbsp;on.&nbsp;&nbsp;When&nbsp;the&nbsp;'Save<br>
+Statistics'&nbsp;checkbox&nbsp;is&nbsp;on,&nbsp;the&nbsp;statistics&nbsp;will&nbsp;be&nbsp;save&nbsp;as&nbsp;a&nbsp;.txt&nbsp;file,&nbsp;the&nbsp;default&nbsp;is&nbsp;off.<br>
+&nbsp;<br>
To&nbsp;run&nbsp;statistic,&nbsp;in&nbsp;a&nbsp;shell&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;statistic&nbsp;is&nbsp;in&nbsp;type:<br>
&gt;&nbsp;python&nbsp;statistic.py<br>
&nbsp;<br>
@@ -78,7 +81,7 @@ The&nbsp;statistics&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder_
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;statistics&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="StatisticPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="StatisticPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="StatisticPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Write&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -119,9 +122,9 @@ The&nbsp;statistics&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder_
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-getStatisticGcode"><strong>getStatisticGcode</strong></a>(gcodeText)</dt><dd><tt>Get&nbsp;statistics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;statistics&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-statisticFile"><strong>statisticFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;statistics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;write&nbsp;statistics&nbsp;for&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;statistics&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Write&nbsp;Statistics&nbsp;File&nbsp;for&nbsp;Skeinforge&nbsp;Chain'&nbsp;is&nbsp;selected.</tt></dd></dl>
- <dl><dt><a name="-writeStatisticFileGivenText"><strong>writeStatisticFileGivenText</strong></a>(filename, gcodeText, statisticPreferences)</dt><dd><tt>Write&nbsp;statistics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-statisticFile"><strong>statisticFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;statistics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;write&nbsp;statistics&nbsp;for&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder&nbsp;that&nbsp;is&nbsp;not&nbsp;modified.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;statistics&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Write&nbsp;Statistics&nbsp;File&nbsp;for&nbsp;Skeinforge&nbsp;Chain'&nbsp;is&nbsp;selected.</tt></dd></dl>
+ <dl><dt><a name="-writeStatisticFileGivenText"><strong>writeStatisticFileGivenText</strong></a>(fileName, gcodeText, statisticPreferences)</dt><dd><tt>Write&nbsp;statistics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.vectorwrite.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.vectorwrite.html
index 7f64517a..8811abdc 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.vectorwrite.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.analyze_plugins.vectorwrite.html
@@ -108,7 +108,7 @@ The&nbsp;vector&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder.svg<
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;vectorwrite&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="VectorwritePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="VectorwritePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -128,13 +128,13 @@ The&nbsp;vector&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder.svg<
<dl><dt><a name="VectorwriteSkein-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Write&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
-<dl><dt><a name="VectorwriteSkein-getFilenameWriteFiles"><strong>getFilenameWriteFiles</strong></a>(self, filename)</dt><dd><tt>Write&nbsp;one&nbsp;or&nbsp;multiple&nbsp;files&nbsp;for&nbsp;the&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="VectorwriteSkein-getFilenameWriteFiles"><strong>getFilenameWriteFiles</strong></a>(self, fileName)</dt><dd><tt>Write&nbsp;one&nbsp;or&nbsp;multiple&nbsp;files&nbsp;for&nbsp;the&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="VectorwriteSkein-getHypertextLinkBasename"><strong>getHypertextLinkBasename</strong></a>(self, baseUnderscoredPrefix, vectorWindowIndex)</dt><dd><tt>Get&nbsp;hypertext&nbsp;link&nbsp;basename&nbsp;for&nbsp;a&nbsp;numbered&nbsp;vector&nbsp;window.</tt></dd></dl>
<dl><dt><a name="VectorwriteSkein-getLinkBasename"><strong>getLinkBasename</strong></a>(self, baseUnderscoredPrefix, vectorWindowIndex)</dt><dd><tt>Get&nbsp;link&nbsp;basename&nbsp;for&nbsp;a&nbsp;numbered&nbsp;vector&nbsp;window.</tt></dd></dl>
-<dl><dt><a name="VectorwriteSkein-getSuffixFilename"><strong>getSuffixFilename</strong></a>(self, baseUnderscoredPrefix, multipleDirectoryName, vectorWindowIndex)</dt><dd><tt>Get&nbsp;suffix&nbsp;filename&nbsp;for&nbsp;a&nbsp;numbered&nbsp;vector&nbsp;window.</tt></dd></dl>
+<dl><dt><a name="VectorwriteSkein-getSuffixFilename"><strong>getSuffixFilename</strong></a>(self, baseUnderscoredPrefix, multipleDirectoryName, vectorWindowIndex)</dt><dd><tt>Get&nbsp;suffix&nbsp;fileName&nbsp;for&nbsp;a&nbsp;numbered&nbsp;vector&nbsp;window.</tt></dd></dl>
<dl><dt><a name="VectorwriteSkein-initializeActiveLocation"><strong>initializeActiveLocation</strong></a>(self)</dt><dd><tt>Set&nbsp;variables&nbsp;to&nbsp;default.</tt></dd></dl>
@@ -160,9 +160,9 @@ The&nbsp;vector&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder.svg<
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;vectorwrite&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Write&nbsp;Scalable&nbsp;Vector&nbsp;Graphics&nbsp;for&nbsp;Skeinforge&nbsp;Chain'&nbsp;is&nbsp;selected.</tt></dd></dl>
- <dl><dt><a name="-writeVectorFile"><strong>writeVectorFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-writeVectorFileGivenText"><strong>writeVectorFileGivenText</strong></a>(filename, gcodeText, vectorwritePreferences)</dt><dd><tt>Write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;a&nbsp;skeinforge&nbsp;gcode&nbsp;file,&nbsp;if&nbsp;'Write&nbsp;Scalable&nbsp;Vector&nbsp;Graphics&nbsp;for&nbsp;Skeinforge&nbsp;Chain'&nbsp;is&nbsp;selected.</tt></dd></dl>
+ <dl><dt><a name="-writeVectorFile"><strong>writeVectorFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;the&nbsp;first&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeVectorFileGivenText"><strong>writeVectorFileGivenText</strong></a>(fileName, gcodeText, vectorwritePreferences)</dt><dd><tt>Write&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;for&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.carve.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.carve.html
new file mode 100644
index 00000000..9ea1ba98
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.carve.html
@@ -0,0 +1,192 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.carve</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.carve</strong></big></big> ($Date: 2008/02/05 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/carve.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/carve.py</a></font></td></tr></table>
+ <p><tt>Carve&nbsp;shape&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;carve&nbsp;a&nbsp;list&nbsp;of&nbsp;slice&nbsp;layers.<br>
+&nbsp;<br>
+Carve&nbsp;carves&nbsp;a&nbsp;list&nbsp;of&nbsp;slices&nbsp;into&nbsp;svg&nbsp;slice&nbsp;layers.&nbsp;&nbsp;The&nbsp;'Layer&nbsp;Thickness'&nbsp;is&nbsp;the&nbsp;thickness&nbsp;the&nbsp;extrusion&nbsp;layer&nbsp;at&nbsp;default&nbsp;extruder&nbsp;speed,<br>
+this&nbsp;is&nbsp;the&nbsp;most&nbsp;important&nbsp;carve&nbsp;preference.&nbsp;&nbsp;The&nbsp;'Extrusion&nbsp;Diameter&nbsp;over&nbsp;Thickness&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;diameter&nbsp;over&nbsp;the<br>
+layer&nbsp;thickness,&nbsp;the&nbsp;default&nbsp;is&nbsp;1.25.&nbsp;&nbsp;The&nbsp;'Extrusion&nbsp;Width&nbsp;over&nbsp;Thickness'&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;width&nbsp;over&nbsp;the&nbsp;layer&nbsp;thickness,<br>
+the&nbsp;default&nbsp;is&nbsp;1.5.&nbsp;&nbsp;A&nbsp;ratio&nbsp;of&nbsp;one&nbsp;means&nbsp;the&nbsp;extrusion&nbsp;is&nbsp;a&nbsp;circle,&nbsp;a&nbsp;typical&nbsp;ratio&nbsp;of&nbsp;1.5&nbsp;means&nbsp;the&nbsp;extrusion&nbsp;is&nbsp;a&nbsp;wide&nbsp;oval.&nbsp;&nbsp;These<br>
+values&nbsp;should&nbsp;be&nbsp;measured&nbsp;from&nbsp;a&nbsp;test&nbsp;extrusion&nbsp;line.<br>
+&nbsp;<br>
+The&nbsp;extrusion&nbsp;fill&nbsp;density&nbsp;ratio&nbsp;that&nbsp;is&nbsp;printed&nbsp;to&nbsp;the&nbsp;console,&nbsp;(&nbsp;it&nbsp;is&nbsp;derived&nbsp;quantity&nbsp;not&nbsp;a&nbsp;parameter&nbsp;)&nbsp;is&nbsp;the&nbsp;area&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;diameter<br>
+over&nbsp;the&nbsp;extrusion&nbsp;width&nbsp;over&nbsp;the&nbsp;layer&nbsp;thickness.&nbsp;&nbsp;Assuming&nbsp;the&nbsp;extrusion&nbsp;diameter&nbsp;is&nbsp;correct,&nbsp;a&nbsp;high&nbsp;value&nbsp;means&nbsp;the&nbsp;filament&nbsp;will&nbsp;be<br>
+packed&nbsp;tightly,&nbsp;and&nbsp;the&nbsp;object&nbsp;will&nbsp;be&nbsp;almost&nbsp;as&nbsp;dense&nbsp;as&nbsp;the&nbsp;filament.&nbsp;&nbsp;If&nbsp;the&nbsp;value&nbsp;is&nbsp;too&nbsp;high,&nbsp;there&nbsp;could&nbsp;be&nbsp;too&nbsp;little&nbsp;room&nbsp;for&nbsp;the<br>
+filament,&nbsp;and&nbsp;the&nbsp;extruder&nbsp;will&nbsp;end&nbsp;up&nbsp;plowing&nbsp;through&nbsp;the&nbsp;extra&nbsp;filament.&nbsp;&nbsp;A&nbsp;low&nbsp;value&nbsp;means&nbsp;the&nbsp;filaments&nbsp;will&nbsp;be&nbsp;far&nbsp;away&nbsp;from&nbsp;each<br>
+other,&nbsp;the&nbsp;object&nbsp;will&nbsp;be&nbsp;leaky&nbsp;and&nbsp;light.&nbsp;&nbsp;The&nbsp;value&nbsp;with&nbsp;the&nbsp;default&nbsp;extrusion&nbsp;preferences&nbsp;is&nbsp;around&nbsp;0.82.<br>
+&nbsp;<br>
+Rarely&nbsp;changed&nbsp;preferences&nbsp;are&nbsp;'Import&nbsp;Coarseness',&nbsp;'Mesh&nbsp;Type',&nbsp;'Infill&nbsp;Bridge&nbsp;Width&nbsp;Over&nbsp;Thickness',&nbsp;'Infill&nbsp;in&nbsp;Direction&nbsp;of&nbsp;Bridges'&nbsp;&amp;<br>
+'Layer&nbsp;Thickness&nbsp;over&nbsp;Precision'.&nbsp;&nbsp;When&nbsp;a&nbsp;triangle&nbsp;mesh&nbsp;has&nbsp;holes&nbsp;in&nbsp;it,&nbsp;the&nbsp;triangle&nbsp;mesh&nbsp;slicer&nbsp;switches&nbsp;over&nbsp;to&nbsp;a&nbsp;slow&nbsp;algorithm&nbsp;that<br>
+spans&nbsp;gaps&nbsp;in&nbsp;the&nbsp;mesh.&nbsp;&nbsp;The&nbsp;higher&nbsp;the&nbsp;import&nbsp;coarseness,&nbsp;the&nbsp;wider&nbsp;the&nbsp;gaps&nbsp;in&nbsp;the&nbsp;mesh&nbsp;it&nbsp;will&nbsp;span.&nbsp;&nbsp;An&nbsp;import&nbsp;coarseness&nbsp;of&nbsp;one<br>
+means&nbsp;it&nbsp;will&nbsp;span&nbsp;gaps&nbsp;the&nbsp;width&nbsp;of&nbsp;the&nbsp;extrusion.&nbsp;&nbsp;When&nbsp;the&nbsp;Mesh&nbsp;Type&nbsp;preference&nbsp;is&nbsp;Correct&nbsp;Mesh,&nbsp;the&nbsp;mesh&nbsp;will&nbsp;be&nbsp;accurately<br>
+carved,&nbsp;and&nbsp;if&nbsp;a&nbsp;hole&nbsp;is&nbsp;found,&nbsp;carve&nbsp;will&nbsp;switch&nbsp;over&nbsp;to&nbsp;the&nbsp;algorithm&nbsp;that&nbsp;spans&nbsp;gaps.&nbsp;&nbsp;If&nbsp;the&nbsp;Mesh&nbsp;Type&nbsp;preference&nbsp;is&nbsp;Unproven<br>
+Mesh,&nbsp;carve&nbsp;will&nbsp;use&nbsp;the&nbsp;gap&nbsp;spanning&nbsp;algorithm&nbsp;from&nbsp;the&nbsp;start.&nbsp;&nbsp;The&nbsp;problem&nbsp;with&nbsp;the&nbsp;gap&nbsp;spanning&nbsp;algothm&nbsp;is&nbsp;that&nbsp;it&nbsp;will&nbsp;span&nbsp;gaps,<br>
+even&nbsp;if&nbsp;there&nbsp;actually&nbsp;is&nbsp;a&nbsp;gap&nbsp;in&nbsp;the&nbsp;model.&nbsp;&nbsp;Infill&nbsp;bridge&nbsp;width&nbsp;over&nbsp;thickness&nbsp;ratio&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;width&nbsp;over&nbsp;the&nbsp;layer<br>
+thickness&nbsp;on&nbsp;a&nbsp;bridge&nbsp;layer.&nbsp;&nbsp;If&nbsp;the&nbsp;infill&nbsp;in&nbsp;direction&nbsp;of&nbsp;bridges&nbsp;preference&nbsp;is&nbsp;chosen,&nbsp;the&nbsp;infill&nbsp;will&nbsp;be&nbsp;in&nbsp;the&nbsp;direction&nbsp;of&nbsp;bridges&nbsp;across<br>
+gaps,&nbsp;so&nbsp;that&nbsp;the&nbsp;fill&nbsp;will&nbsp;be&nbsp;able&nbsp;to&nbsp;span&nbsp;a&nbsp;bridge&nbsp;easier.&nbsp;&nbsp;The&nbsp;'Layer&nbsp;Thickness&nbsp;over&nbsp;Precision'&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;layer&nbsp;thickness&nbsp;over<br>
+the&nbsp;smallest&nbsp;change&nbsp;in&nbsp;value.&nbsp;&nbsp;The&nbsp;higher&nbsp;the&nbsp;layer&nbsp;thickness&nbsp;over&nbsp;precision,&nbsp;the&nbsp;more&nbsp;significant&nbsp;figures&nbsp;the&nbsp;output&nbsp;numbers&nbsp;will&nbsp;have,<br>
+the&nbsp;default&nbsp;is&nbsp;ten.<br>
+&nbsp;<br>
+To&nbsp;run&nbsp;carve,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
+&gt;&nbsp;python&nbsp;carve.py<br>
+&nbsp;<br>
+The&nbsp;following&nbsp;examples&nbsp;carve&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;carve.py.&nbsp;&nbsp;The&nbsp;preferences&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file<br>
+'carve.csv'&nbsp;with&nbsp;a&nbsp;text&nbsp;editor&nbsp;or&nbsp;a&nbsp;spreadsheet&nbsp;program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python&nbsp;carve.py<br>
+This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Carve',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;carved.<br>
+The&nbsp;carved&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_carve.svg<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;python<br>
+Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
+[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
+Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;carve<br>
+&gt;&gt;&gt;&nbsp;carve.<a href="#-main">main</a>()<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;carved.<br>
+The&nbsp;carved&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_carve.svg<br>
+It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;carve&nbsp;the&nbsp;file.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;carve.<a href="#-writeOutput">writeOutput</a>()<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;is&nbsp;being&nbsp;carved.<br>
+The&nbsp;carved&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_carve.svg<br>
+It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;carve&nbsp;the&nbsp;file.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;carve.<a href="#-getCarveGcode">getCarveGcode</a>("<br>
+54&nbsp;162&nbsp;108&nbsp;Number&nbsp;of&nbsp;Vertices,Number&nbsp;of&nbsp;Edges,Number&nbsp;of&nbsp;Faces<br>
+-5.800000000000001&nbsp;5.341893939393939&nbsp;4.017841892579603&nbsp;Vertex&nbsp;Coordinates&nbsp;XYZ<br>
+5.800000000000001&nbsp;5.341893939393939&nbsp;4.017841892579603<br>
+..<br>
+many&nbsp;lines&nbsp;of&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;vertices,&nbsp;edges&nbsp;and&nbsp;faces<br>
+..<br>
+")</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+<a href="skeinforge_tools.analyze.html">skeinforge_tools.analyze</a><br>
+<a href="cStringIO.html">cStringIO</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
+<a href="math.html">math</a><br>
+<a href="os.html">os</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
+<a href="sys.html">sys</a><br>
+<a href="time.html">time</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html">skeinforge_tools.skeinforge_utilities.triangle_mesh</a><br>
+<a href="webbrowser.html">webbrowser</a><br>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="skeinforge_tools.carve.html#CarvePreferences">CarvePreferences</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.carve.html#CarveSkein">CarveSkein</a>
+</font></dt></dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="CarvePreferences">class <strong>CarvePreferences</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;carve&nbsp;preferences.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="CarvePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
+
+<dl><dt><a name="CarvePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Carve&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="CarveSkein">class <strong>CarveSkein</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;carve&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="CarveSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="CarveSkein-addInitializationToOutputSVG"><strong>addInitializationToOutputSVG</strong></a>(self)</dt><dd><tt>Add&nbsp;initialization&nbsp;gcode&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-addLayerStart"><strong>addLayerStart</strong></a>(self, layerIndex, z)</dt><dd><tt>Add&nbsp;the&nbsp;start&nbsp;lines&nbsp;for&nbsp;the&nbsp;layer.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-addLines"><strong>addLines</strong></a>(self, lines)</dt><dd><tt>Add&nbsp;lines&nbsp;of&nbsp;text&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-addRotatedLoopLayerToOutput"><strong>addRotatedLoopLayerToOutput</strong></a>(self, layerIndex, rotatedBoundaryLayer)</dt><dd><tt>Add&nbsp;rotated&nbsp;boundary&nbsp;layer&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-addRotatedLoopLayersToOutput"><strong>addRotatedLoopLayersToOutput</strong></a>(self, rotatedBoundaryLayers)</dt><dd><tt>Add&nbsp;rotated&nbsp;boundary&nbsp;layers&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-addShutdownToOutput"><strong>addShutdownToOutput</strong></a>(self)</dt><dd><tt>Add&nbsp;shutdown&nbsp;svg&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-getReplacedSVGTemplateLines"><strong>getReplacedSVGTemplateLines</strong></a>(self, rotatedBoundaryLayers)</dt><dd><tt>Get&nbsp;the&nbsp;lines&nbsp;of&nbsp;text&nbsp;from&nbsp;the&nbsp;svg_template.txt&nbsp;file.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-getSVGLoopString"><strong>getSVGLoopString</strong></a>(self, loop)</dt><dd><tt>Get&nbsp;the&nbsp;svg&nbsp;loop&nbsp;string.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-parseCarving"><strong>parseCarving</strong></a>(self, carvePreferences, carving)</dt><dd><tt>Parse&nbsp;gnu&nbsp;triangulated&nbsp;surface&nbsp;text&nbsp;and&nbsp;store&nbsp;the&nbsp;carved&nbsp;gcode.</tt></dd></dl>
+
+<dl><dt><a name="CarveSkein-setExtrusionDiameterWidth"><strong>setExtrusionDiameterWidth</strong></a>(self, carvePreferences)</dt><dd><tt>Set&nbsp;the&nbsp;extrusion&nbsp;diameter&nbsp;&amp;&nbsp;width&nbsp;and&nbsp;the&nbsp;bridge&nbsp;thickness&nbsp;&amp;&nbsp;width.</tt></dd></dl>
+
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl><dt><a name="-getCarveGcode"><strong>getCarveGcode</strong></a>(fileName, carvePreferences<font color="#909090">=None</font>)</dt><dd><tt>Carve&nbsp;a&nbsp;shape&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getCarving"><strong>getCarving</strong></a>(fileName)</dt><dd><tt>Get&nbsp;a&nbsp;carving&nbsp;for&nbsp;the&nbsp;file&nbsp;using&nbsp;an&nbsp;import&nbsp;plugin.</tt></dd></dl>
+ <dl><dt><a name="-getParameterFromJavascript"><strong>getParameterFromJavascript</strong></a>(lines, parameterName, parameterValue)</dt><dd><tt>Get&nbsp;a&nbsp;paramater&nbsp;from&nbsp;lines&nbsp;of&nbsp;javascript.</tt></dd></dl>
+ <dl><dt><a name="-getReplacedInQuotes"><strong>getReplacedInQuotes</strong></a>(original, replacement, text)</dt><dd><tt>Replace&nbsp;what&nbsp;follows&nbsp;in&nbsp;quotes&nbsp;after&nbsp;the&nbsp;word.</tt></dd></dl>
+ <dl><dt><a name="-getReplacedTagString"><strong>getReplacedTagString</strong></a>(replacementTagString, tagID, text)</dt><dd><tt>Get&nbsp;text&nbsp;with&nbsp;the&nbsp;tag&nbsp;string&nbsp;replaced.</tt></dd></dl>
+ <dl><dt><a name="-getReplacedWordAndInQuotes"><strong>getReplacedWordAndInQuotes</strong></a>(original, replacement, text)</dt><dd><tt>Replace&nbsp;the&nbsp;word&nbsp;in&nbsp;the&nbsp;text&nbsp;and&nbsp;replace&nbsp;what&nbsp;follows&nbsp;in&nbsp;quotes&nbsp;after&nbsp;the&nbsp;word.</tt></dd></dl>
+ <dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;carve&nbsp;dialog.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Carve&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;carve&nbsp;the&nbsp;first&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__date__</strong> = '$Date: 2008/02/05 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.clip.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.clip.html
index 8016a963..b57d633f 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.clip.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.clip.html
@@ -19,8 +19,8 @@ each&nbsp;end&nbsp;of&nbsp;the&nbsp;loop&nbsp;is&nbsp;clipped&nbsp;over&nbsp;the
loops&nbsp;will&nbsp;have&nbsp;a&nbsp;gap,&nbsp;if&nbsp;the&nbsp;ratio&nbsp;is&nbsp;too&nbsp;low&nbsp;there&nbsp;will&nbsp;be&nbsp;a&nbsp;bulge&nbsp;at&nbsp;the&nbsp;loop&nbsp;ends.&nbsp;&nbsp;To&nbsp;run&nbsp;clip,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
&gt;&nbsp;python&nbsp;clip.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;clip&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;clip.py.&nbsp;&nbsp;The&nbsp;clip&nbsp;function&nbsp;will&nbsp;clip&nbsp;if&nbsp;'Activate&nbsp;Clip'&nbsp;is&nbsp;true,<br>
+The&nbsp;following&nbsp;examples&nbsp;clip&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;clip.py.&nbsp;&nbsp;The&nbsp;clip&nbsp;function&nbsp;will&nbsp;clip&nbsp;if&nbsp;'Activate&nbsp;Clip'&nbsp;is&nbsp;true,<br>
which&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'clip.csv'&nbsp;in&nbsp;the&nbsp;'.skeinforge'&nbsp;folder&nbsp;in&nbsp;your&nbsp;home&nbsp;directory<br>
with&nbsp;a&nbsp;text&nbsp;editor&nbsp;or&nbsp;a&nbsp;spreadsheet&nbsp;program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getClipChainGcode&nbsp;check<br>
to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;clipped,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;getCombChainGcode&nbsp;in&nbsp;comb.py&nbsp;to&nbsp;comb&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the<br>
@@ -29,13 +29,13 @@ combed&nbsp;text,&nbsp;then&nbsp;they&nbsp;clip.<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;clip.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Clip',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;clipped.<br>
-The&nbsp;clipped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_clip.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;clipped.<br>
+The&nbsp;clipped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_clip.gcode<br>
&nbsp;<br>
&nbsp;<br>
-&gt;&nbsp;python&nbsp;clip.py&nbsp;Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;clipped.<br>
-The&nbsp;clipped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_clip.gcode<br>
+&gt;&nbsp;python&nbsp;clip.py&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;clipped.<br>
+The&nbsp;clipped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_clip.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python<br>
@@ -48,13 +48,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;clip&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;clip.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;clipped.<br>
-The&nbsp;clipped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_clip.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;clipped.<br>
+The&nbsp;clipped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_clip.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;clip.<a href="#-getClipGcode">getClipGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -63,7 +63,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;clip.<a href="#-getClipChainGcode">getClipChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -82,8 +82,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="skeinforge_tools.comb.html">skeinforge_tools.comb</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -110,7 +110,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;clip&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="ClipPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="ClipPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="ClipPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Clip&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -126,9 +126,9 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="ClipSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-<dl><dt><a name="ClipSkein-addGcodeFromThread"><strong>addGcodeFromThread</strong></a>(self, thread)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="ClipSkein-addGcodeFromThreadZ"><strong>addGcodeFromThreadZ</strong></a>(self, thread, z)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="ClipSkein-addGcodeMovement"><strong>addGcodeMovement</strong></a>(self, point)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="ClipSkein-addGcodeMovementZ"><strong>addGcodeMovementZ</strong></a>(self, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="ClipSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
@@ -153,10 +153,10 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getClipChainGcode"><strong>getClipChainGcode</strong></a>(filename, gcodeText, loopTailorPreferences<font color="#909090">=None</font>)</dt><dd><tt>Clip&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;clip&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;clipped.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getClipChainGcode"><strong>getClipChainGcode</strong></a>(fileName, gcodeText, loopTailorPreferences<font color="#909090">=None</font>)</dt><dd><tt>Clip&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;clip&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;clipped.</tt></dd></dl>
<dl><dt><a name="-getClipGcode"><strong>getClipGcode</strong></a>(gcodeText, loopTailorPreferences<font color="#909090">=None</font>)</dt><dd><tt>Clip&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;clip&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Clip&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;clip&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;clipped.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;clip&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Clip&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;clip&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;clipped.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;clip&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.comb.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.comb.html
index a0620b35..b25e4199 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.comb.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.comb.html
@@ -14,7 +14,7 @@
The&nbsp;default&nbsp;'Activate&nbsp;Comb'&nbsp;checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;When&nbsp;it&nbsp;is&nbsp;on,&nbsp;the&nbsp;functions&nbsp;described&nbsp;below&nbsp;will&nbsp;work,&nbsp;when&nbsp;it&nbsp;is&nbsp;off,&nbsp;the&nbsp;functions<br>
will&nbsp;not&nbsp;be&nbsp;called.<br>
&nbsp;<br>
-Comb&nbsp;bends&nbsp;the&nbsp;extruder&nbsp;travel&nbsp;paths&nbsp;around&nbsp;holes&nbsp;in&nbsp;the&nbsp;slice,&nbsp;to&nbsp;avoid&nbsp;stringers.&nbsp;&nbsp;It&nbsp;moves&nbsp;the&nbsp;extruder&nbsp;to&nbsp;the&nbsp;inside&nbsp;of&nbsp;outer<br>
+Comb&nbsp;bends&nbsp;the&nbsp;extruder&nbsp;travel&nbsp;paths&nbsp;around&nbsp;holes&nbsp;in&nbsp;the&nbsp;carve,&nbsp;to&nbsp;avoid&nbsp;stringers.&nbsp;&nbsp;It&nbsp;moves&nbsp;the&nbsp;extruder&nbsp;to&nbsp;the&nbsp;inside&nbsp;of&nbsp;outer<br>
perimeters&nbsp;before&nbsp;turning&nbsp;the&nbsp;extruder&nbsp;on&nbsp;so&nbsp;any&nbsp;start&nbsp;up&nbsp;ooze&nbsp;will&nbsp;be&nbsp;inside&nbsp;the&nbsp;shape.&nbsp;&nbsp;It&nbsp;jitters&nbsp;the&nbsp;loop&nbsp;end&nbsp;position&nbsp;to&nbsp;a<br>
different&nbsp;place&nbsp;on&nbsp;each&nbsp;layer&nbsp;to&nbsp;prevent&nbsp;the&nbsp;a&nbsp;ridge&nbsp;from&nbsp;forming.&nbsp;&nbsp;The&nbsp;'Arrival&nbsp;Inset&nbsp;Follow&nbsp;Distance&nbsp;over&nbsp;Extrusion&nbsp;Width'&nbsp;is&nbsp;the<br>
ratio&nbsp;of&nbsp;the&nbsp;amount&nbsp;before&nbsp;the&nbsp;start&nbsp;of&nbsp;the&nbsp;outer&nbsp;perimeter&nbsp;the&nbsp;extruder&nbsp;will&nbsp;be&nbsp;moved&nbsp;to.&nbsp;&nbsp;A&nbsp;high&nbsp;value&nbsp;means&nbsp;the&nbsp;extruder&nbsp;will<br>
@@ -27,8 +27,8 @@ finish&nbsp;within&nbsp;the&nbsp;perimeter,&nbsp;a&nbsp;low&nbsp;value&nbsp;mean
perimeter.&nbsp;&nbsp;To&nbsp;run&nbsp;comb,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
&gt;&nbsp;python&nbsp;comb.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;comb&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
-which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;comb.py.&nbsp;&nbsp;The&nbsp;comb&nbsp;function&nbsp;will&nbsp;comb&nbsp;if&nbsp;'Activate&nbsp;Comb'&nbsp;is&nbsp;true,&nbsp;which<br>
+The&nbsp;following&nbsp;examples&nbsp;comb&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
+which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;comb.py.&nbsp;&nbsp;The&nbsp;comb&nbsp;function&nbsp;will&nbsp;comb&nbsp;if&nbsp;'Activate&nbsp;Comb'&nbsp;is&nbsp;true,&nbsp;which<br>
can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'comb.csv'&nbsp;in&nbsp;the&nbsp;'.skeinforge'&nbsp;folder&nbsp;in&nbsp;your&nbsp;home&nbsp;directory&nbsp;with&nbsp;a&nbsp;text<br>
editor&nbsp;or&nbsp;a&nbsp;spreadsheet&nbsp;program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getCombChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the<br>
text&nbsp;has&nbsp;been&nbsp;combed,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;getTowerChainGcode&nbsp;in&nbsp;tower.py&nbsp;to&nbsp;tower&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;towered&nbsp;text,&nbsp;then<br>
@@ -38,8 +38,8 @@ they&nbsp;comb.&nbsp;&nbsp;Pictures&nbsp;of&nbsp;combing&nbsp;in&nbsp;action&nbs
&nbsp;<br>
&gt;&nbsp;python&nbsp;comb.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Comb',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;combed.<br>
-The&nbsp;combed&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_comb.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;combed.<br>
+The&nbsp;combed&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_comb.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -52,13 +52,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;comb&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;comb.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;combed.<br>
-The&nbsp;combed&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_comb.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;combed.<br>
+The&nbsp;combed&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_comb.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;comb.<a href="#-getCombGcode">getCombGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -67,7 +67,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;comb.<a href="#-getCombChainGcode">getCombChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -85,8 +85,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="cStringIO.html">cStringIO</a><br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
<a href="math.html">math</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -114,7 +114,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;comb&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="CombPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="CombPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="CombPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Comb&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -130,26 +130,26 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="CombSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-<dl><dt><a name="CombSkein-addGcodeFromThread"><strong>addGcodeFromThread</strong></a>(self, thread)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="CombSkein-addGcodeFromThreadZ"><strong>addGcodeFromThreadZ</strong></a>(self, thread, z)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="CombSkein-addGcodeMovement"><strong>addGcodeMovement</strong></a>(self, point)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="CombSkein-addGcodeMovementZ"><strong>addGcodeMovementZ</strong></a>(self, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="CombSkein-addGcodePath"><strong>addGcodePath</strong></a>(self, path)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;path,&nbsp;without&nbsp;modifying&nbsp;the&nbsp;extruder,&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="CombSkein-addGcodePathZ"><strong>addGcodePathZ</strong></a>(self, path, z)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;path,&nbsp;without&nbsp;modifying&nbsp;the&nbsp;extruder,&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="CombSkein-addIfTravel"><strong>addIfTravel</strong></a>(self, splitLine)</dt><dd><tt>Add&nbsp;travel&nbsp;move&nbsp;around&nbsp;loops&nbsp;if&nbsp;this&nbsp;the&nbsp;extruder&nbsp;is&nbsp;off.</tt></dd></dl>
+<dl><dt><a name="CombSkein-addIfTravel"><strong>addIfTravel</strong></a>(self, splitLine)</dt><dd><tt>Add&nbsp;travel&nbsp;move&nbsp;around&nbsp;loops&nbsp;if&nbsp;the&nbsp;extruder&nbsp;is&nbsp;off.</tt></dd></dl>
<dl><dt><a name="CombSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="CombSkein-addLoopsBeforeLeavingPerimeter"><strong>addLoopsBeforeLeavingPerimeter</strong></a>(self, aroundBetweenPath, insetPerimeter, perimeterCrossing)</dt><dd><tt>Add&nbsp;loops&nbsp;before&nbsp;leaving&nbsp;the&nbsp;first&nbsp;outer&nbsp;perimeter,&nbsp;in&nbsp;order&nbsp;to&nbsp;leave&nbsp;most&nbsp;of&nbsp;the&nbsp;ooze&nbsp;in&nbsp;the&nbsp;infill.</tt></dd></dl>
-
<dl><dt><a name="CombSkein-addPathBeforeEnd"><strong>addPathBeforeEnd</strong></a>(self, aroundBetweenPath, location, loop)</dt><dd><tt>Add&nbsp;the&nbsp;path&nbsp;before&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;loop.</tt></dd></dl>
-<dl><dt><a name="CombSkein-addPathBetween"><strong>addPathBetween</strong></a>(self, aroundBetweenPath, betweenFirst, betweenSecond, loopFirst)</dt><dd><tt>Add&nbsp;a&nbsp;path&nbsp;between&nbsp;the&nbsp;perimeter&nbsp;and&nbsp;the&nbsp;fill.</tt></dd></dl>
+<dl><dt><a name="CombSkein-addPathBetween"><strong>addPathBetween</strong></a>(self, aroundBetweenPath, betweenFirst, betweenSecond, isLeavingPerimeter, loopFirst)</dt><dd><tt>Add&nbsp;a&nbsp;path&nbsp;between&nbsp;the&nbsp;perimeter&nbsp;and&nbsp;the&nbsp;fill.</tt></dd></dl>
<dl><dt><a name="CombSkein-addTailoredLoopPath"><strong>addTailoredLoopPath</strong></a>(self)</dt><dd><tt>Add&nbsp;a&nbsp;clipped&nbsp;and&nbsp;jittered&nbsp;loop&nbsp;path.</tt></dd></dl>
<dl><dt><a name="CombSkein-addToLoop"><strong>addToLoop</strong></a>(self, location)</dt><dd><tt>Add&nbsp;a&nbsp;location&nbsp;to&nbsp;loop.</tt></dd></dl>
+<dl><dt><a name="CombSkein-getAroundBetweenPath"><strong>getAroundBetweenPath</strong></a>(self, location)</dt><dd><tt>Insert&nbsp;paths&nbsp;around&nbsp;and&nbsp;between&nbsp;the&nbsp;perimeter&nbsp;and&nbsp;the&nbsp;fill.</tt></dd></dl>
+
<dl><dt><a name="CombSkein-getBetweens"><strong>getBetweens</strong></a>(self)</dt><dd><tt>Set&nbsp;betweens&nbsp;for&nbsp;the&nbsp;layer.</tt></dd></dl>
<dl><dt><a name="CombSkein-getJitteredLoop"><strong>getJitteredLoop</strong></a>(self, jitterDistance, jitterLoop)</dt><dd><tt>Get&nbsp;a&nbsp;jittered&nbsp;loop&nbsp;path.</tt></dd></dl>
@@ -158,9 +158,9 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="CombSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
-<dl><dt><a name="CombSkein-initializeMoreParameters"><strong>initializeMoreParameters</strong></a>(self)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="CombSkein-getStartIndex"><strong>getStartIndex</strong></a>(self, xIntersections)</dt><dd><tt>Get&nbsp;the&nbsp;start&nbsp;index&nbsp;of&nbsp;the&nbsp;intersections.</tt></dd></dl>
-<dl><dt><a name="CombSkein-insertPathsAroundBetween"><strong>insertPathsAroundBetween</strong></a>(self, aroundBetweenPath, location)</dt><dd><tt>Insert&nbsp;paths&nbsp;around&nbsp;and&nbsp;between&nbsp;the&nbsp;perimeter&nbsp;and&nbsp;the&nbsp;fill.</tt></dd></dl>
+<dl><dt><a name="CombSkein-initializeMoreParameters"><strong>initializeMoreParameters</strong></a>(self)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="CombSkein-insertPathsBetween"><strong>insertPathsBetween</strong></a>(self, aroundBetweenPath, nextBeginning, pathEnd)</dt><dd><tt>Insert&nbsp;paths&nbsp;between&nbsp;the&nbsp;perimeter&nbsp;and&nbsp;the&nbsp;fill.</tt></dd></dl>
@@ -185,11 +185,11 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getCombChainGcode"><strong>getCombChainGcode</strong></a>(filename, gcodeText, combPreferences<font color="#909090">=None</font>)</dt><dd><tt>Comb&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;comb&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;combed.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getCombChainGcode"><strong>getCombChainGcode</strong></a>(fileName, gcodeText, combPreferences<font color="#909090">=None</font>)</dt><dd><tt>Comb&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;comb&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;combed.</tt></dd></dl>
<dl><dt><a name="-getCombGcode"><strong>getCombGcode</strong></a>(gcodeText, combPreferences<font color="#909090">=None</font>)</dt><dd><tt>Comb&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-isLoopNumberEqual"><strong>isLoopNumberEqual</strong></a>(betweenX, betweenXIndex, loopNumber)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;number&nbsp;is&nbsp;equal.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;comb&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Comb&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;comb&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;combed.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;comb&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Comb&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;comb&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;combed.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;comb&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.cool.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.cool.html
index d8af8135..65c8efe7 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.cool.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.cool.html
@@ -24,25 +24,25 @@ If&nbsp;the&nbsp;'Turn&nbsp;Fan&nbsp;On&nbsp;at&nbsp;Beginning'&nbsp;preference&
To&nbsp;run&nbsp;cool,&nbsp;in&nbsp;a&nbsp;shell&nbsp;which&nbsp;cool&nbsp;is&nbsp;in&nbsp;type:<br>
&gt;&nbsp;python&nbsp;cool.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;cool&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;cool.py.&nbsp;&nbsp;The&nbsp;cool&nbsp;function&nbsp;will&nbsp;cool&nbsp;if&nbsp;the&nbsp;'Activate&nbsp;Cool'<br>
+The&nbsp;following&nbsp;examples&nbsp;cool&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;cool.py.&nbsp;&nbsp;The&nbsp;cool&nbsp;function&nbsp;will&nbsp;cool&nbsp;if&nbsp;the&nbsp;'Activate&nbsp;Cool'<br>
checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getCoolChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;cooled,&nbsp;if&nbsp;not&nbsp;they<br>
call&nbsp;the&nbsp;getClipChainGcode&nbsp;in&nbsp;clip.py&nbsp;to&nbsp;clip&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;clipped&nbsp;text,&nbsp;then&nbsp;they&nbsp;cool.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;cool.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Cool',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;cooled.<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;cooled.<br>
The&nbsp;extrusion&nbsp;fill&nbsp;density&nbsp;ratio&nbsp;is&nbsp;0.853<br>
-The&nbsp;cooled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square.gcode<br>
+The&nbsp;cooled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode<br>
The&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow_Square_cool.svg<br>
It&nbsp;took&nbsp;34&nbsp;seconds&nbsp;to&nbsp;cool&nbsp;the&nbsp;file.<br>
&nbsp;<br>
&nbsp;<br>
-&gt;&nbsp;python&nbsp;cool.py&nbsp;Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;cooled.<br>
+&gt;&nbsp;python&nbsp;cool.py&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;cooled.<br>
The&nbsp;extrusion&nbsp;fill&nbsp;density&nbsp;ratio&nbsp;is&nbsp;0.853<br>
-The&nbsp;cooled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square.gcode<br>
+The&nbsp;cooled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode<br>
The&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow_Square_cool.svg<br>
It&nbsp;took&nbsp;34&nbsp;seconds&nbsp;to&nbsp;cool&nbsp;the&nbsp;file.<br>
&nbsp;<br>
@@ -57,15 +57,15 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;cool&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;cool.<a href="#-writeOutput">writeOutput</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;cooled.<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;cooled.<br>
The&nbsp;extrusion&nbsp;fill&nbsp;density&nbsp;ratio&nbsp;is&nbsp;0.853<br>
-The&nbsp;cooled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square.gcode<br>
+The&nbsp;cooled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode<br>
The&nbsp;scalable&nbsp;vector&nbsp;graphics&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow_Square_cool.svg<br>
It&nbsp;took&nbsp;34&nbsp;seconds&nbsp;to&nbsp;cool&nbsp;the&nbsp;file.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;cool.<a href="#-getCoolGcode">getCoolGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -74,7 +74,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;cool.<a href="#-getCoolChainGcode">getCoolChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -93,8 +93,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="skeinforge_tools.clip.html">skeinforge_tools.clip</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -121,7 +121,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;cool&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="CoolPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="CoolPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="CoolPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Cool&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -137,7 +137,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="CoolSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-<dl><dt><a name="CoolSkein-addGcodeFromFeedrateMovement"><strong>addGcodeFromFeedrateMovement</strong></a>(self, feedrateMinute, point)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="CoolSkein-addGcodeFromFeedrateMovementZ"><strong>addGcodeFromFeedrateMovementZ</strong></a>(self, feedrateMinute, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="CoolSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
@@ -158,10 +158,10 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getCoolChainGcode"><strong>getCoolChainGcode</strong></a>(filename, gcodeText, coolPreferences<font color="#909090">=None</font>)</dt><dd><tt>Cool&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;cool&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;cooled.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getCoolChainGcode"><strong>getCoolChainGcode</strong></a>(fileName, gcodeText, coolPreferences<font color="#909090">=None</font>)</dt><dd><tt>Cool&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;cool&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;cooled.</tt></dd></dl>
<dl><dt><a name="-getCoolGcode"><strong>getCoolGcode</strong></a>(gcodeText, coolPreferences<font color="#909090">=None</font>)</dt><dd><tt>Cool&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;cool&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Cool&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;cool&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;cooled.&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;cool&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Cool&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;cool&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;cooled.&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;cool&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export.html
index 7da4536e..bf6d027b 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export.html
@@ -30,15 +30,15 @@ An&nbsp;export&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;expo
To&nbsp;run&nbsp;export,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
&gt;&nbsp;python&nbsp;export.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;export&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains<br>
-Hollow&nbsp;Square.gts&nbsp;&amp;&nbsp;export.py.&nbsp;&nbsp;The&nbsp;function&nbsp;writeOutput&nbsp;checks&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;exported,&nbsp;if&nbsp;not&nbsp;they&nbsp;call<br>
+The&nbsp;following&nbsp;examples&nbsp;export&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;&amp;&nbsp;export.py.&nbsp;&nbsp;The&nbsp;function&nbsp;writeOutput&nbsp;checks&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;exported,&nbsp;if&nbsp;not&nbsp;they&nbsp;call<br>
getUnpauseChainGcode&nbsp;in&nbsp;unpause.py&nbsp;to&nbsp;unpause&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;unpaused&nbsp;text,&nbsp;then&nbsp;it&nbsp;exports.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;export.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Export',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;exported.<br>
-The&nbsp;exported&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_export.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;exported.<br>
+The&nbsp;exported&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_export.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -51,9 +51,9 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;export&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;export.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;exported.<br>
-The&nbsp;exported&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_export.gcode</tt></p>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;exported.<br>
+The&nbsp;exported&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_export.gcode</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
@@ -66,8 +66,8 @@ The&nbsp;exported&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_e
<a href="cStringIO.html">cStringIO</a><br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
<a href="os.html">os</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -95,7 +95,7 @@ The&nbsp;exported&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_e
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;export&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="ExportPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="ExportPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="ExportPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Export&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -129,8 +129,8 @@ The&nbsp;exported&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_e
<td width="100%"><dl><dt><a name="-getExportGcode"><strong>getExportGcode</strong></a>(gcodeText, exportPreferences<font color="#909090">=None</font>)</dt><dd><tt>Export&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-getSelectedPlugin"><strong>getSelectedPlugin</strong></a>(exportPreferences)</dt><dd><tt>Get&nbsp;the&nbsp;selected&nbsp;plugin.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;export&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Export&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;export&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;exported.<br>
-If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;export&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Export&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;export&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;exported.<br>
+If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;export&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.binary_16_byte.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.binary_16_byte.html
index b491e2ab..22402a9d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.binary_16_byte.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.binary_16_byte.html
@@ -75,7 +75,7 @@ the&nbsp;move&nbsp;takes&nbsp;place.</tt></p>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
<a href="cStringIO.html">cStringIO</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="os.html">os</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -101,7 +101,7 @@ the&nbsp;move&nbsp;takes&nbsp;place.</tt></p>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;export&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Binary16BytePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="Binary16BytePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="Binary16BytePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Convert&nbsp;to&nbsp;binary&nbsp;16&nbsp;byte&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -133,13 +133,13 @@ the&nbsp;move&nbsp;takes&nbsp;place.</tt></p>
<dl><dt><a name="-getOutput"><strong>getOutput</strong></a>(gcodeText, binary16BytePreferences<font color="#909090">=None</font>)</dt><dd><tt>Get&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;isArchivable&nbsp;and&nbsp;writeOutput&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.<br>
If&nbsp;this&nbsp;plugin&nbsp;writes&nbsp;an&nbsp;output&nbsp;than&nbsp;should&nbsp;not&nbsp;be&nbsp;printed,&nbsp;an&nbsp;empty&nbsp;string&nbsp;should&nbsp;be&nbsp;returned.</tt></dd></dl>
<dl><dt><a name="-getStringFromCharacterSplitLine"><strong>getStringFromCharacterSplitLine</strong></a>(character, splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;after&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;character&nbsp;in&nbsp;the&nbsp;split&nbsp;line.</tt></dd></dl>
- <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(filename)</dt><dd><tt>Get&nbsp;the&nbsp;filename&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
+ <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(fileName)</dt><dd><tt>Get&nbsp;the&nbsp;fileName&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
<dl><dt><a name="-getTextLines"><strong>getTextLines</strong></a>(text)</dt><dd><tt>Get&nbsp;the&nbsp;all&nbsp;the&nbsp;lines&nbsp;of&nbsp;text&nbsp;of&nbsp;a&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-indexOfStartingWithSecond"><strong>indexOfStartingWithSecond</strong></a>(letter, splitLine)</dt><dd><tt>Get&nbsp;index&nbsp;of&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;given&nbsp;letter&nbsp;in&nbsp;the&nbsp;split&nbsp;line,&nbsp;starting&nbsp;with&nbsp;the&nbsp;second&nbsp;word.&nbsp;&nbsp;Return&nbsp;-&nbsp;1&nbsp;if&nbsp;letter&nbsp;is&nbsp;not&nbsp;found</tt></dd></dl>
<dl><dt><a name="-isArchivable"><strong>isArchivable</strong></a>()</dt><dd><tt>Return&nbsp;whether&nbsp;or&nbsp;not&nbsp;this&nbsp;plugin&nbsp;is&nbsp;archivable.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;export&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(filename, fileText)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;getOutput&nbsp;and&nbsp;isArchivable&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.</tt></dd></dl>
+ <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(fileName, fileText)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;getOutput&nbsp;and&nbsp;isArchivable&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_small.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_small.html
index f0233eaf..995a9038 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_small.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_small.html
@@ -66,12 +66,12 @@ developers&nbsp;making&nbsp;new&nbsp;plugins&nbsp;do&nbsp;not&nbsp;have&nbsp;to&
<td width="100%"><dl><dt><a name="-getOutput"><strong>getOutput</strong></a>(gcodeText)</dt><dd><tt>Get&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;isArchivable&nbsp;and&nbsp;writeOutput&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.<br>
If&nbsp;this&nbsp;plugin&nbsp;writes&nbsp;an&nbsp;output&nbsp;than&nbsp;should&nbsp;not&nbsp;be&nbsp;printed,&nbsp;an&nbsp;empty&nbsp;string&nbsp;should&nbsp;be&nbsp;returned.</tt></dd></dl>
<dl><dt><a name="-getStringFromCharacterSplitLine"><strong>getStringFromCharacterSplitLine</strong></a>(character, splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;after&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;character&nbsp;in&nbsp;the&nbsp;split&nbsp;line.</tt></dd></dl>
- <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(filename)</dt><dd><tt>Get&nbsp;the&nbsp;filename&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
+ <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(fileName)</dt><dd><tt>Get&nbsp;the&nbsp;fileName&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
<dl><dt><a name="-getTextLines"><strong>getTextLines</strong></a>(text)</dt><dd><tt>Get&nbsp;the&nbsp;all&nbsp;the&nbsp;lines&nbsp;of&nbsp;text&nbsp;of&nbsp;a&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-indexOfStartingWithSecond"><strong>indexOfStartingWithSecond</strong></a>(letter, splitLine)</dt><dd><tt>Get&nbsp;index&nbsp;of&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;given&nbsp;letter&nbsp;in&nbsp;the&nbsp;split&nbsp;line,&nbsp;starting&nbsp;with&nbsp;the&nbsp;second&nbsp;word.&nbsp;&nbsp;Return&nbsp;-&nbsp;1&nbsp;if&nbsp;letter&nbsp;is&nbsp;not&nbsp;found</tt></dd></dl>
<dl><dt><a name="-isArchivable"><strong>isArchivable</strong></a>()</dt><dd><tt>Return&nbsp;whether&nbsp;or&nbsp;not&nbsp;this&nbsp;plugin&nbsp;is&nbsp;archivable.</tt></dd></dl>
- <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(filename, fileText)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename, gcodeText)</dt><dd><tt>Write&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;getOutput&nbsp;and&nbsp;isArchivable&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.</tt></dd></dl>
+ <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(fileName, fileText)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName, gcodeText)</dt><dd><tt>Write&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;getOutput&nbsp;and&nbsp;isArchivable&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_step.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_step.html
index 258dbf2a..178ee4d7 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_step.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.export_plugins.gcode_step.html
@@ -39,7 +39,7 @@ The&nbsp;writeOutput&nbsp;function&nbsp;of&nbsp;this&nbsp;script&nbsp;takes&nbsp
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
<a href="cStringIO.html">cStringIO</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="os.html">os</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -65,7 +65,7 @@ The&nbsp;writeOutput&nbsp;function&nbsp;of&nbsp;this&nbsp;script&nbsp;takes&nbsp
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;export&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="GcodeStepPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="GcodeStepPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="GcodeStepPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Convert&nbsp;to&nbsp;gcode&nbsp;step&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -103,13 +103,13 @@ The&nbsp;writeOutput&nbsp;function&nbsp;of&nbsp;this&nbsp;script&nbsp;takes&nbsp
<dl><dt><a name="-getOutput"><strong>getOutput</strong></a>(gcodeText, gcodeStepPreferences<font color="#909090">=None</font>)</dt><dd><tt>Get&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;isArchivable&nbsp;and&nbsp;writeOutput&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.<br>
If&nbsp;this&nbsp;plugin&nbsp;writes&nbsp;an&nbsp;output&nbsp;than&nbsp;should&nbsp;not&nbsp;be&nbsp;printed,&nbsp;an&nbsp;empty&nbsp;string&nbsp;should&nbsp;be&nbsp;returned.</tt></dd></dl>
<dl><dt><a name="-getStringFromCharacterSplitLine"><strong>getStringFromCharacterSplitLine</strong></a>(character, splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;after&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;character&nbsp;in&nbsp;the&nbsp;split&nbsp;line.</tt></dd></dl>
- <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(filename)</dt><dd><tt>Get&nbsp;the&nbsp;filename&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
+ <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(fileName)</dt><dd><tt>Get&nbsp;the&nbsp;fileName&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
<dl><dt><a name="-getTextLines"><strong>getTextLines</strong></a>(text)</dt><dd><tt>Get&nbsp;the&nbsp;all&nbsp;the&nbsp;lines&nbsp;of&nbsp;text&nbsp;of&nbsp;a&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-indexOfStartingWithSecond"><strong>indexOfStartingWithSecond</strong></a>(letter, splitLine)</dt><dd><tt>Get&nbsp;index&nbsp;of&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;given&nbsp;letter&nbsp;in&nbsp;the&nbsp;split&nbsp;line,&nbsp;starting&nbsp;with&nbsp;the&nbsp;second&nbsp;word.&nbsp;&nbsp;Return&nbsp;-&nbsp;1&nbsp;if&nbsp;letter&nbsp;is&nbsp;not&nbsp;found</tt></dd></dl>
<dl><dt><a name="-isArchivable"><strong>isArchivable</strong></a>()</dt><dd><tt>Return&nbsp;whether&nbsp;or&nbsp;not&nbsp;this&nbsp;plugin&nbsp;is&nbsp;archivable.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;export&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(filename, fileText)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;getOutput&nbsp;and&nbsp;isArchivable&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.</tt></dd></dl>
+ <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(fileName, fileText)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>, gcodeText<font color="#909090">=''</font>)</dt><dd><tt>Write&nbsp;the&nbsp;exported&nbsp;version&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;This&nbsp;function,&nbsp;getOutput&nbsp;and&nbsp;isArchivable&nbsp;are&nbsp;the&nbsp;only&nbsp;necessary&nbsp;functions&nbsp;in&nbsp;a&nbsp;skeinforge&nbsp;export&nbsp;plugin.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fill.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fill.html
index f9987e48..4c38da7d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fill.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fill.html
@@ -9,7 +9,7 @@
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.fill</strong></big></big> ($Date: 2008/28/04 $)</font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/fill.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/fill.py</a></font></td></tr></table>
- <p><tt>Fill&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;fill&nbsp;the&nbsp;slices&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.<br>
+ <p><tt>Fill&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;fill&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.<br>
&nbsp;<br>
The&nbsp;diaphragm&nbsp;is&nbsp;a&nbsp;solid&nbsp;group&nbsp;of&nbsp;layers,&nbsp;at&nbsp;regular&nbsp;intervals.&nbsp;&nbsp;It&nbsp;can&nbsp;be&nbsp;used&nbsp;with&nbsp;a&nbsp;sparse&nbsp;infill&nbsp;to&nbsp;give&nbsp;the&nbsp;object&nbsp;watertight,&nbsp;horizontal<br>
compartments&nbsp;and/or&nbsp;a&nbsp;higher&nbsp;shear&nbsp;strength.&nbsp;&nbsp;The&nbsp;"Diaphragm&nbsp;Period"&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;layers&nbsp;between&nbsp;diaphrams.&nbsp;&nbsp;The&nbsp;"Diaphragm<br>
@@ -54,14 +54,14 @@ zero,&nbsp;the&nbsp;entire&nbsp;object&nbsp;will&nbsp;be&nbsp;composed&nbsp;of&n
through&nbsp;the&nbsp;surface&nbsp;and&nbsp;with&nbsp;a&nbsp;value&nbsp;of&nbsp;three,&nbsp;the&nbsp;object&nbsp;could&nbsp;be&nbsp;watertight.&nbsp;&nbsp;The&nbsp;higher&nbsp;the&nbsp;solid&nbsp;surface&nbsp;thickness,&nbsp;the&nbsp;stronger&nbsp;and<br>
heavier&nbsp;the&nbsp;object&nbsp;will&nbsp;be.&nbsp;&nbsp;The&nbsp;default&nbsp;is&nbsp;three.<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;fill&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
-contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;fill.py.<br>
+The&nbsp;following&nbsp;examples&nbsp;fill&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
+contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;fill.py.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;fill.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Fill',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;filled.<br>
-The&nbsp;filled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fill.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;filled.<br>
+The&nbsp;filled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fill.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -70,14 +70,14 @@ Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<b
Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
&gt;&gt;&gt;&nbsp;import&nbsp;fill<br>
&gt;&gt;&gt;&nbsp;fill.<a href="#-main">main</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;filled.<br>
-The&nbsp;filled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fill.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;filled.<br>
+The&nbsp;filled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fill.gcode<br>
It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fill.<a href="#-writeOutput">writeOutput</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;filled.<br>
-The&nbsp;filled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fill.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;filled.<br>
+The&nbsp;filled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fill.gcode<br>
It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -91,12 +91,12 @@ It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.</tt></p>
<a href="cStringIO.html">cStringIO</a><br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
+<a href="skeinforge_tools.inset.html">skeinforge_tools.inset</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
-<a href="math.html">math</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
+</td><td width="25%" valign=top><a href="math.html">math</a><br>
+<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
-<a href="skeinforge_tools.slice_shape.html">skeinforge_tools.slice_shape</a><br>
<a href="sys.html">sys</a><br>
</td><td width="25%" valign=top><a href="time.html">time</a><br>
</td></tr></table></td></tr></table><p>
@@ -122,7 +122,7 @@ It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.</tt></p>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;fill&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="FillPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="FillPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="FillPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Fill&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -138,41 +138,39 @@ It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.</tt></p>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="FillSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-<dl><dt><a name="FillSkein-addFill"><strong>addFill</strong></a>(self, layerIndex)</dt><dd><tt>Add&nbsp;fill&nbsp;to&nbsp;the&nbsp;slice&nbsp;layer.</tt></dd></dl>
+<dl><dt><a name="FillSkein-addFill"><strong>addFill</strong></a>(self, layerIndex)</dt><dd><tt>Add&nbsp;fill&nbsp;to&nbsp;the&nbsp;carve&nbsp;layer.</tt></dd></dl>
-<dl><dt><a name="FillSkein-addGcodeFromThread"><strong>addGcodeFromThread</strong></a>(self, thread)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="FillSkein-addGcodeFromThreadZ"><strong>addGcodeFromThreadZ</strong></a>(self, thread, z)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="FillSkein-addGcodeMovement"><strong>addGcodeMovement</strong></a>(self, point)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="FillSkein-addGcodeMovementZ"><strong>addGcodeMovementZ</strong></a>(self, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="FillSkein-addGrid"><strong>addGrid</strong></a>(self, alreadyFilledArounds, arounds, fillLoops, gridPointInsetX, paths, pixelTable, width, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingSlices, z)</dt></dl>
+<dl><dt><a name="FillSkein-addGrid"><strong>addGrid</strong></a>(self, alreadyFilledArounds, arounds, fillLoops, gridPointInsetX, paths, pixelTable, width, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingCarves)</dt></dl>
-<dl><dt><a name="FillSkein-addGridLinePoints"><strong>addGridLinePoints</strong></a>(self, alreadyFilledArounds, begin, end, gridPoints, gridRotationAngle, offset, rotatedExtruderLoops, surroundingSlices, y, z)</dt><dd><tt>Add&nbsp;the&nbsp;segments&nbsp;of&nbsp;one&nbsp;line&nbsp;of&nbsp;a&nbsp;grid&nbsp;to&nbsp;the&nbsp;infill.</tt></dd></dl>
+<dl><dt><a name="FillSkein-addGridLinePoints"><strong>addGridLinePoints</strong></a>(self, alreadyFilledArounds, begin, end, gridPoints, gridRotationAngle, offset, rotatedExtruderLoops, surroundingCarves, y)</dt><dd><tt>Add&nbsp;the&nbsp;segments&nbsp;of&nbsp;one&nbsp;line&nbsp;of&nbsp;a&nbsp;grid&nbsp;to&nbsp;the&nbsp;infill.</tt></dd></dl>
<dl><dt><a name="FillSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="FillSkein-addRemainingGridPoints"><strong>addRemainingGridPoints</strong></a>(self, arounds, gridPointInsetX, gridPointInsetY, gridPoints, isBothOrNone, paths, pixelTable, width)</dt></dl>
+<dl><dt><a name="FillSkein-addRemainingGridPoints"><strong>addRemainingGridPoints</strong></a>(self, arounds, gridPointInsetX, gridPointInsetY, gridPoints, isBothOrNone, paths, pixelTable, width)</dt><dd><tt>Add&nbsp;the&nbsp;remaining&nbsp;grid&nbsp;points&nbsp;to&nbsp;the&nbsp;grid&nbsp;point&nbsp;list.</tt></dd></dl>
-<dl><dt><a name="FillSkein-addRotatedSlice"><strong>addRotatedSlice</strong></a>(self, layerIndex, reverseRotationAroundZAngle, surroundingSlices)</dt><dd><tt>Add&nbsp;a&nbsp;rotated&nbsp;slice&nbsp;to&nbsp;the&nbsp;surrounding&nbsp;slices.</tt></dd></dl>
+<dl><dt><a name="FillSkein-addRotatedCarve"><strong>addRotatedCarve</strong></a>(self, layerIndex, reverseRotationAroundZAngle, surroundingCarves)</dt><dd><tt>Add&nbsp;a&nbsp;rotated&nbsp;carve&nbsp;to&nbsp;the&nbsp;surrounding&nbsp;carves.</tt></dd></dl>
<dl><dt><a name="FillSkein-addShutdownToOutput"><strong>addShutdownToOutput</strong></a>(self)</dt><dd><tt>Add&nbsp;shutdown&nbsp;gcode&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="FillSkein-addToThread"><strong>addToThread</strong></a>(self, location)</dt><dd><tt>Add&nbsp;a&nbsp;location&nbsp;to&nbsp;thread.</tt></dd></dl>
-<dl><dt><a name="FillSkein-getAreaChange"><strong>getAreaChange</strong></a>(self, area, layerIndex)</dt><dd><tt>Get&nbsp;the&nbsp;difference&nbsp;between&nbsp;the&nbsp;area&nbsp;of&nbsp;the&nbsp;slice&nbsp;at&nbsp;the&nbsp;layer&nbsp;index&nbsp;and&nbsp;the&nbsp;given&nbsp;area.</tt></dd></dl>
+<dl><dt><a name="FillSkein-getAreaChange"><strong>getAreaChange</strong></a>(self, area, layerIndex)</dt><dd><tt>Get&nbsp;the&nbsp;difference&nbsp;between&nbsp;the&nbsp;area&nbsp;of&nbsp;the&nbsp;carve&nbsp;at&nbsp;the&nbsp;layer&nbsp;index&nbsp;and&nbsp;the&nbsp;given&nbsp;area.</tt></dd></dl>
-<dl><dt><a name="FillSkein-getGridPoints"><strong>getGridPoints</strong></a>(self, alreadyFilledArounds, fillLoops, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingSlices, z)</dt><dd><tt>Add&nbsp;a&nbsp;grid&nbsp;to&nbsp;the&nbsp;infill.</tt></dd></dl>
+<dl><dt><a name="FillSkein-getCarveArea"><strong>getCarveArea</strong></a>(self, layerIndex)</dt><dd><tt>Get&nbsp;the&nbsp;area&nbsp;of&nbsp;the&nbsp;carve.</tt></dd></dl>
+
+<dl><dt><a name="FillSkein-getGridPoints"><strong>getGridPoints</strong></a>(self, alreadyFilledArounds, fillLoops, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingCarves)</dt><dd><tt>Add&nbsp;a&nbsp;grid&nbsp;to&nbsp;the&nbsp;infill.</tt></dd></dl>
<dl><dt><a name="FillSkein-getLayerRoundZ"><strong>getLayerRoundZ</strong></a>(self, layerIndex)</dt><dd><tt>Get&nbsp;the&nbsp;plane&nbsp;angle&nbsp;around&nbsp;z&nbsp;that&nbsp;the&nbsp;layer&nbsp;is&nbsp;rotated&nbsp;by.</tt></dd></dl>
<dl><dt><a name="FillSkein-getNextGripXStep"><strong>getNextGripXStep</strong></a>(self, gridXStep)</dt><dd><tt>Get&nbsp;the&nbsp;next&nbsp;grid&nbsp;x&nbsp;step,&nbsp;increment&nbsp;by&nbsp;an&nbsp;extra&nbsp;one&nbsp;every&nbsp;three&nbsp;if&nbsp;hexagonal&nbsp;grid&nbsp;is&nbsp;chosen.</tt></dd></dl>
-<dl><dt><a name="FillSkein-getRotatedLayer"><strong>getRotatedLayer</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;rotated&nbsp;layer,&nbsp;making&nbsp;a&nbsp;new&nbsp;one&nbsp;if&nbsp;necessary.</tt></dd></dl>
-
<dl><dt><a name="FillSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
-<dl><dt><a name="FillSkein-getSliceArea"><strong>getSliceArea</strong></a>(self, layerIndex)</dt><dd><tt>Get&nbsp;the&nbsp;area&nbsp;of&nbsp;the&nbsp;slice.</tt></dd></dl>
-
-<dl><dt><a name="FillSkein-isPointInsideLineSegments"><strong>isPointInsideLineSegments</strong></a>(self, alreadyFilledArounds, gridPoint, rotatedExtruderLoops, surroundingSlices)</dt><dd><tt>Is&nbsp;the&nbsp;point&nbsp;inside&nbsp;the&nbsp;line&nbsp;segments&nbsp;of&nbsp;the&nbsp;loops.</tt></dd></dl>
+<dl><dt><a name="FillSkein-isPointInsideLineSegments"><strong>isPointInsideLineSegments</strong></a>(self, alreadyFilledArounds, gridPoint, rotatedExtruderLoops, surroundingCarves)</dt><dd><tt>Is&nbsp;the&nbsp;point&nbsp;inside&nbsp;the&nbsp;line&nbsp;segments&nbsp;of&nbsp;the&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="FillSkein-linearMove"><strong>linearMove</strong></a>(self, splitLine)</dt><dd><tt>Add&nbsp;a&nbsp;linear&nbsp;move&nbsp;to&nbsp;the&nbsp;thread.</tt></dd></dl>
@@ -194,7 +192,7 @@ It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.</tt></p>
<td colspan=2><tt>A&nbsp;rotated&nbsp;layer.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="RotatedLayer-__init__"><strong>__init__</strong></a>(self)</dt></dl>
+<dl><dt><a name="RotatedLayer-__init__"><strong>__init__</strong></a>(self, z)</dt></dl>
<dl><dt><a name="RotatedLayer-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#RotatedLayer">RotatedLayer</a>.</tt></dd></dl>
@@ -229,25 +227,26 @@ It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.</tt></p>
<dl><dt><a name="-addShortenedLineSegment"><strong>addShortenedLineSegment</strong></a>(lineSegment, shortenDistance, shortenedSegments)</dt><dd><tt>Add&nbsp;shortened&nbsp;line&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-addSparseEndpoints"><strong>addSparseEndpoints</strong></a>(doubleExtrusionWidth, endpoints, fillLine, horizontalSegments, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections)</dt><dd><tt>Add&nbsp;sparse&nbsp;endpoints.</tt></dd></dl>
<dl><dt><a name="-addSparseEndpointsFromSegment"><strong>addSparseEndpointsFromSegment</strong></a>(doubleExtrusionWidth, endpoints, fillLine, horizontalSegments, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections)</dt><dd><tt>Add&nbsp;sparse&nbsp;endpoints&nbsp;from&nbsp;a&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-addSurroundingXIntersectionIndexes"><strong>addSurroundingXIntersectionIndexes</strong></a>(surroundingSlices, xIntersectionIndexList, y)</dt><dd><tt>Add&nbsp;x&nbsp;intersection&nbsp;indexes&nbsp;from&nbsp;surrounding&nbsp;layers.</tt></dd></dl>
+ <dl><dt><a name="-addSurroundingXIntersectionIndexes"><strong>addSurroundingXIntersectionIndexes</strong></a>(surroundingCarves, xIntersectionIndexList, y)</dt><dd><tt>Add&nbsp;x&nbsp;intersection&nbsp;indexes&nbsp;from&nbsp;surrounding&nbsp;layers.</tt></dd></dl>
<dl><dt><a name="-addYIntersectionPathToList"><strong>addYIntersectionPathToList</strong></a>(pathIndex, pointIndex, y, yIntersection, yIntersectionPaths)</dt><dd><tt>Add&nbsp;the&nbsp;y&nbsp;intersection&nbsp;path&nbsp;to&nbsp;the&nbsp;y&nbsp;intersection&nbsp;paths.</tt></dd></dl>
<dl><dt><a name="-compareDistanceFromCenter"><strong>compareDistanceFromCenter</strong></a>(self, other)</dt><dd><tt>Get&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;sort&nbsp;y&nbsp;intersections&nbsp;in&nbsp;ascending&nbsp;order&nbsp;of&nbsp;distance&nbsp;from&nbsp;the&nbsp;center.</tt></dd></dl>
<dl><dt><a name="-comparePointIndexDescending"><strong>comparePointIndexDescending</strong></a>(self, other)</dt><dd><tt>Get&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;sort&nbsp;y&nbsp;intersections&nbsp;in&nbsp;descending&nbsp;order&nbsp;of&nbsp;point&nbsp;index.</tt></dd></dl>
<dl><dt><a name="-createExtraFillLoops"><strong>createExtraFillLoops</strong></a>(radius, surroundingLoop)</dt><dd><tt>Create&nbsp;extra&nbsp;fill&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-createFillForSurroundings"><strong>createFillForSurroundings</strong></a>(radius, surroundingLoops)</dt><dd><tt>Create&nbsp;extra&nbsp;fill&nbsp;loops&nbsp;for&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
+ <dl><dt><a name="-getAdditionalLength"><strong>getAdditionalLength</strong></a>(path, point, pointIndex)</dt><dd><tt>Get&nbsp;the&nbsp;additional&nbsp;length&nbsp;added&nbsp;by&nbsp;inserting&nbsp;a&nbsp;point&nbsp;into&nbsp;a&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-getClosestOppositeIntersectionPaths"><strong>getClosestOppositeIntersectionPaths</strong></a>(yIntersectionPaths)</dt><dd><tt>Get&nbsp;the&nbsp;close&nbsp;to&nbsp;center&nbsp;paths,&nbsp;starting&nbsp;with&nbsp;the&nbsp;first&nbsp;and&nbsp;an&nbsp;additional&nbsp;opposite&nbsp;if&nbsp;it&nbsp;exists.</tt></dd></dl>
<dl><dt><a name="-getExtraFillLoops"><strong>getExtraFillLoops</strong></a>(insideLoops, outsideLoop, radius)</dt><dd><tt>Get&nbsp;extra&nbsp;loops&nbsp;between&nbsp;inside&nbsp;and&nbsp;outside&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getFillChainGcode"><strong>getFillChainGcode</strong></a>(filename, gcodeText, fillPreferences<font color="#909090">=None</font>)</dt><dd><tt>Fill&nbsp;the&nbsp;slices&nbsp;of&nbsp;a&nbsp;gcode&nbsp;text.&nbsp;&nbsp;Chain&nbsp;fill&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;sliced.</tt></dd></dl>
- <dl><dt><a name="-getFillGcode"><strong>getFillGcode</strong></a>(gcodeText, fillPreferences<font color="#909090">=None</font>)</dt><dd><tt>Fill&nbsp;the&nbsp;slices&nbsp;of&nbsp;a&nbsp;gcode&nbsp;text.</tt></dd></dl>
+ <dl><dt><a name="-getFillChainGcode"><strong>getFillChainGcode</strong></a>(fileName, gcodeText, fillPreferences<font color="#909090">=None</font>)</dt><dd><tt>Fill&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;text.&nbsp;&nbsp;Chain&nbsp;fill&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;carved.</tt></dd></dl>
+ <dl><dt><a name="-getFillGcode"><strong>getFillGcode</strong></a>(gcodeText, fillPreferences<font color="#909090">=None</font>)</dt><dd><tt>Fill&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-getHorizontalSegmentsFromLoopLists"><strong>getHorizontalSegmentsFromLoopLists</strong></a>(fillLoops, alreadyFilledArounds, y)</dt><dd><tt>Get&nbsp;horizontal&nbsp;segments&nbsp;inside&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-getIntersectionOfXIntersectionIndexes"><strong>getIntersectionOfXIntersectionIndexes</strong></a>(totalSolidSurfaceThickness, xIntersectionIndexList)</dt><dd><tt>Get&nbsp;x&nbsp;intersections&nbsp;from&nbsp;surrounding&nbsp;layers.</tt></dd></dl>
<dl><dt><a name="-getNonIntersectingGridPointLine"><strong>getNonIntersectingGridPointLine</strong></a>(arounds, gridPointInsetX, isJunctionWide, paths, pixelTable, yIntersectionPath, width)</dt><dd><tt>Get&nbsp;the&nbsp;points&nbsp;around&nbsp;the&nbsp;grid&nbsp;point&nbsp;that&nbsp;is&nbsp;junction&nbsp;wide&nbsp;that&nbsp;do&nbsp;not&nbsp;intersect.</tt></dd></dl>
<dl><dt><a name="-getPlusMinusSign"><strong>getPlusMinusSign</strong></a>(number)</dt><dd><tt>Get&nbsp;one&nbsp;if&nbsp;the&nbsp;number&nbsp;is&nbsp;zero&nbsp;or&nbsp;positive&nbsp;else&nbsp;negative&nbsp;one.</tt></dd></dl>
- <dl><dt><a name="-getSurroundingXIntersections"><strong>getSurroundingXIntersections</strong></a>(doubleSolidSurfaceThickness, surroundingSlices, y)</dt><dd><tt>Get&nbsp;x&nbsp;intersections&nbsp;from&nbsp;surrounding&nbsp;layers.</tt></dd></dl>
+ <dl><dt><a name="-getSurroundingXIntersections"><strong>getSurroundingXIntersections</strong></a>(doubleSolidSurfaceThickness, surroundingCarves, y)</dt><dd><tt>Get&nbsp;x&nbsp;intersections&nbsp;from&nbsp;surrounding&nbsp;layers.</tt></dd></dl>
<dl><dt><a name="-getWithLeastLength"><strong>getWithLeastLength</strong></a>(path, point)</dt><dd><tt>Insert&nbsp;a&nbsp;point&nbsp;into&nbsp;a&nbsp;path,&nbsp;at&nbsp;the&nbsp;index&nbsp;at&nbsp;which&nbsp;the&nbsp;path&nbsp;would&nbsp;be&nbsp;shortest.</tt></dd></dl>
<dl><dt><a name="-getYIntersection"><strong>getYIntersection</strong></a>(firstPoint, secondPoint, x)</dt><dd><tt>Get&nbsp;where&nbsp;the&nbsp;line&nbsp;crosses&nbsp;x.</tt></dd></dl>
- <dl><dt><a name="-getYIntersectionIfExists"><strong>getYIntersectionIfExists</strong></a>(vector3First, vector3Second, x)</dt><dd><tt>Get&nbsp;the&nbsp;y&nbsp;intersection&nbsp;if&nbsp;it&nbsp;exists.</tt></dd></dl>
- <dl><dt><a name="-getYIntersectionInsideYSegment"><strong>getYIntersectionInsideYSegment</strong></a>(segmentFirstY, segmentSecondY, vector3First, vector3Second, x)</dt><dd><tt>Get&nbsp;the&nbsp;y&nbsp;intersection&nbsp;inside&nbsp;the&nbsp;y&nbsp;segment&nbsp;if&nbsp;it&nbsp;does,&nbsp;else&nbsp;none.</tt></dd></dl>
+ <dl><dt><a name="-getYIntersectionIfExists"><strong>getYIntersectionIfExists</strong></a>(complexFirst, complexSecond, x)</dt><dd><tt>Get&nbsp;the&nbsp;y&nbsp;intersection&nbsp;if&nbsp;it&nbsp;exists.</tt></dd></dl>
+ <dl><dt><a name="-getYIntersectionInsideYSegment"><strong>getYIntersectionInsideYSegment</strong></a>(segmentFirstY, segmentSecondY, complexFirst, complexSecond, x)</dt><dd><tt>Get&nbsp;the&nbsp;y&nbsp;intersection&nbsp;inside&nbsp;the&nbsp;y&nbsp;segment&nbsp;if&nbsp;it&nbsp;does,&nbsp;else&nbsp;none.</tt></dd></dl>
<dl><dt><a name="-insertGridPointPair"><strong>insertGridPointPair</strong></a>(arounds, gridPoint, gridPointInsetX, gridPoints, isJunctionWide, paths, pixelTable, yIntersectionPath, width)</dt><dd><tt>Insert&nbsp;a&nbsp;pair&nbsp;of&nbsp;points&nbsp;around&nbsp;the&nbsp;grid&nbsp;point&nbsp;is&nbsp;is&nbsp;junction&nbsp;wide,&nbsp;otherwise&nbsp;inset&nbsp;one&nbsp;point.</tt></dd></dl>
<dl><dt><a name="-insertGridPointPairWithLinePath"><strong>insertGridPointPairWithLinePath</strong></a>(arounds, gridPoint, gridPointInsetX, gridPoints, isJunctionWide, linePath, paths, pixelTable, yIntersectionPath, width)</dt><dd><tt>Insert&nbsp;a&nbsp;pair&nbsp;of&nbsp;points&nbsp;around&nbsp;the&nbsp;grid&nbsp;point&nbsp;is&nbsp;is&nbsp;junction&nbsp;wide,&nbsp;otherwise&nbsp;inset&nbsp;one&nbsp;point.</tt></dd></dl>
<dl><dt><a name="-insertGridPointPairs"><strong>insertGridPointPairs</strong></a>(arounds, gridPoint, gridPointInsetX, gridPoints, intersectionPathFirst, intersectionPathSecond, isBothOrNone, isJunctionWide, paths, pixelTable, width)</dt><dd><tt>Insert&nbsp;a&nbsp;pair&nbsp;of&nbsp;points&nbsp;around&nbsp;a&nbsp;pair&nbsp;of&nbsp;grid&nbsp;points.</tt></dd></dl>
@@ -265,7 +264,7 @@ It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;fill&nbsp;the&nbsp;file.</tt></p>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;fill&nbsp;dialog.</tt></dd></dl>
<dl><dt><a name="-removeEndpoints"><strong>removeEndpoints</strong></a>(aroundPixelTable, layerExtrusionWidth, paths, removedEndpoints, aroundWidth)</dt><dd><tt>Remove&nbsp;endpoints&nbsp;which&nbsp;are&nbsp;added&nbsp;to&nbsp;the&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-setIsOutside"><strong>setIsOutside</strong></a>(yCloseToCenterPath, yIntersectionPaths)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;yCloseToCenterPath&nbsp;is&nbsp;outside.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Fill&nbsp;the&nbsp;slices&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;Chain&nbsp;slice&nbsp;the&nbsp;file&nbsp;if&nbsp;it&nbsp;is&nbsp;a&nbsp;GNU&nbsp;TriangulatedSurface&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;fill&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Fill&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;Chain&nbsp;carve&nbsp;the&nbsp;file&nbsp;if&nbsp;it&nbsp;is&nbsp;a&nbsp;GNU&nbsp;TriangulatedSurface&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;fill&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fillet.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fillet.html
index 462f78ca..a36ad789 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fillet.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.fillet.html
@@ -30,8 +30,8 @@ jerk&nbsp;at&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;path.&nbsp;&nbsp;The&nbsp;d
the&nbsp;new&nbsp;feedrate,&nbsp;the&nbsp;default&nbsp;is&nbsp;true.&nbsp;&nbsp;To&nbsp;run&nbsp;fillet,&nbsp;in&nbsp;a&nbsp;shell&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;fillet&nbsp;is&nbsp;in&nbsp;type:<br>
&gt;&nbsp;python&nbsp;fillet.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;fillet&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
-which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;fillet.py.&nbsp;&nbsp;The&nbsp;fillet&nbsp;function&nbsp;executes&nbsp;the&nbsp;preferred&nbsp;fillet&nbsp;type,&nbsp;which<br>
+The&nbsp;following&nbsp;examples&nbsp;fillet&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
+which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;fillet.py.&nbsp;&nbsp;The&nbsp;fillet&nbsp;function&nbsp;executes&nbsp;the&nbsp;preferred&nbsp;fillet&nbsp;type,&nbsp;which<br>
can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'fillet.csv'&nbsp;with&nbsp;a&nbsp;text&nbsp;editor&nbsp;or&nbsp;a&nbsp;spreadsheet&nbsp;program&nbsp;set&nbsp;to&nbsp;separate<br>
tabs.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getFilletChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;combed,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;the<br>
getOozebaneChainGcode&nbsp;in&nbsp;oozebane.py&nbsp;to&nbsp;fill&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;oozebaned&nbsp;text,&nbsp;then&nbsp;they&nbsp;fillet.<br>
@@ -39,8 +39,8 @@ getOozebaneChainGcode&nbsp;in&nbsp;oozebane.py&nbsp;to&nbsp;fill&nbsp;the&nbsp;t
&nbsp;<br>
&gt;&nbsp;python&nbsp;fillet.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Fillet',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;filleted.<br>
-The&nbsp;filleted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fillet.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;filleted.<br>
+The&nbsp;filleted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fillet.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python<br>
@@ -53,27 +53,27 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;fillet&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-arcPointFile">arcPointFile</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;filleted&nbsp;into&nbsp;arc&nbsp;points.<br>
-The&nbsp;arc&nbsp;point&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fillet.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;is&nbsp;being&nbsp;filleted&nbsp;into&nbsp;arc&nbsp;points.<br>
+The&nbsp;arc&nbsp;point&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fillet.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-arcRadiusFile">arcRadiusFile</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;filleted&nbsp;into&nbsp;arc&nbsp;radiuses.<br>
-The&nbsp;arc&nbsp;radius&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fillet.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;is&nbsp;being&nbsp;filleted&nbsp;into&nbsp;arc&nbsp;radiuses.<br>
+The&nbsp;arc&nbsp;radius&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fillet.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-arcSegmentFile">arcSegmentFile</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;arc&nbsp;segmented.<br>
-The&nbsp;arc&nbsp;segment&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fillet.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;is&nbsp;being&nbsp;arc&nbsp;segmented.<br>
+The&nbsp;arc&nbsp;segment&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fillet.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-bevelFile">bevelFile</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;beveled.<br>
-The&nbsp;beveled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fillet.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;is&nbsp;being&nbsp;beveled.<br>
+The&nbsp;beveled&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fillet.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-getArcPointGcode">getArcPointGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -82,7 +82,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-getArcRadiusGcode">getArcRadiusGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -91,7 +91,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-getArcSegmentGcode">getArcSegmentGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -100,7 +100,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-getBevelGcode">getBevelGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -109,7 +109,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-getFilletGcode">getFilletGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -118,7 +118,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-getFilletChainGcode">getFilletChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -127,9 +127,9 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;fillet.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;chain&nbsp;filleted.<br>
-The&nbsp;filleted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_fillet.gcode</tt></p>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;is&nbsp;being&nbsp;chain&nbsp;filleted.<br>
+The&nbsp;filleted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_fillet.gcode</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
@@ -142,7 +142,7 @@ The&nbsp;filleted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_f
<a href="cStringIO.html">cStringIO</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
<a href="skeinforge_tools.oozebane.html">skeinforge_tools.oozebane</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
@@ -372,7 +372,7 @@ Methods inherited from <a href="skeinforge_tools.fillet.html#BevelSkein">BevelSk
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;fillet&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="FilletPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="FilletPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="FilletPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Fillet&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -383,20 +383,20 @@ Methods inherited from <a href="skeinforge_tools.fillet.html#BevelSkein">BevelSk
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-arcPointFile"><strong>arcPointFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file&nbsp;into&nbsp;a&nbsp;helical&nbsp;point&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;arc&nbsp;point&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-arcRadiusFile"><strong>arcRadiusFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file&nbsp;into&nbsp;a&nbsp;helical&nbsp;radius&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;arc&nbsp;radius&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-arcSegmentFile"><strong>arcSegmentFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file&nbsp;into&nbsp;an&nbsp;arc&nbsp;segment&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;arc&nbsp;segment&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-bevelFile"><strong>bevelFile</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Bevel&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;bevel&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-arcPointFile"><strong>arcPointFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file&nbsp;into&nbsp;a&nbsp;helical&nbsp;point&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;arc&nbsp;point&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-arcRadiusFile"><strong>arcRadiusFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file&nbsp;into&nbsp;a&nbsp;helical&nbsp;radius&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;arc&nbsp;radius&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-arcSegmentFile"><strong>arcSegmentFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file&nbsp;into&nbsp;an&nbsp;arc&nbsp;segment&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;arc&nbsp;segment&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-bevelFile"><strong>bevelFile</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Bevel&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;bevel&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
<dl><dt><a name="-getArcPointGcode"><strong>getArcPointGcode</strong></a>(filletPreferences, gcodeText)</dt><dd><tt>Arc&nbsp;point&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text&nbsp;into&nbsp;a&nbsp;helical&nbsp;point&nbsp;move&nbsp;gcode&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-getArcRadiusGcode"><strong>getArcRadiusGcode</strong></a>(filletPreferences, gcodeText)</dt><dd><tt>Arc&nbsp;radius&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text&nbsp;into&nbsp;a&nbsp;helical&nbsp;radius&nbsp;move&nbsp;gcode&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-getArcSegmentGcode"><strong>getArcSegmentGcode</strong></a>(filletPreferences, gcodeText)</dt><dd><tt>Arc&nbsp;segment&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text&nbsp;into&nbsp;an&nbsp;arc&nbsp;segment&nbsp;linear&nbsp;move&nbsp;gcode&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-getBevelGcode"><strong>getBevelGcode</strong></a>(filletPreferences, gcodeText)</dt><dd><tt>Bevel&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
- <dl><dt><a name="-getFilletChainGcode"><strong>getFilletChainGcode</strong></a>(filename, gcodeText, filletPreferences<font color="#909090">=None</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;oozebane&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;oozebaned.</tt></dd></dl>
+ <dl><dt><a name="-getFilletChainGcode"><strong>getFilletChainGcode</strong></a>(fileName, gcodeText, filletPreferences<font color="#909090">=None</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;oozebane&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;oozebaned.</tt></dd></dl>
<dl><dt><a name="-getFilletGcode"><strong>getFilletGcode</strong></a>(gcodeText, filletPreferences<font color="#909090">=None</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;fillet&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;fill&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;filled.<br>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Fillet&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;fill&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;filled.<br>
Depending&nbsp;on&nbsp;the&nbsp;preferences,&nbsp;either&nbsp;arcPoint,&nbsp;arcRadius,&nbsp;arcSegment,&nbsp;bevel&nbsp;or&nbsp;do&nbsp;nothing.<br>
-If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;fillet&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;fillet&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.hop.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.hop.html
index edc6b134..79901957 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.hop.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.hop.html
@@ -14,24 +14,24 @@
The&nbsp;default&nbsp;'Activate&nbsp;Hop'&nbsp;checkbox&nbsp;is&nbsp;off.&nbsp;&nbsp;It&nbsp;is&nbsp;off&nbsp;because&nbsp;Vik&nbsp;and&nbsp;Nophead&nbsp;found&nbsp;better&nbsp;results&nbsp;without&nbsp;hopping.&nbsp;&nbsp;When&nbsp;it<br>
is&nbsp;on,&nbsp;the&nbsp;functions&nbsp;described&nbsp;below&nbsp;will&nbsp;work,&nbsp;when&nbsp;it&nbsp;is&nbsp;off,&nbsp;the&nbsp;functions&nbsp;will&nbsp;not&nbsp;be&nbsp;called.<br>
&nbsp;<br>
-The&nbsp;important&nbsp;value&nbsp;for&nbsp;the&nbsp;hop&nbsp;preferences&nbsp;is&nbsp;"Hop&nbsp;Over&nbsp;Extrusion&nbsp;Height&nbsp;(ratio)"&nbsp;which&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;hop&nbsp;height&nbsp;over&nbsp;the<br>
-extrusion&nbsp;height,&nbsp;the&nbsp;default&nbsp;is&nbsp;1.0.&nbsp;&nbsp;The&nbsp;'Minimum&nbsp;Hop&nbsp;Angle&nbsp;(degrees)'&nbsp;is&nbsp;the&nbsp;minimum&nbsp;angle&nbsp;that&nbsp;the&nbsp;path&nbsp;of&nbsp;the&nbsp;extruder<br>
+The&nbsp;important&nbsp;value&nbsp;for&nbsp;the&nbsp;hop&nbsp;preferences&nbsp;is&nbsp;"Hop&nbsp;Over&nbsp;Layer&nbsp;Thickness&nbsp;(ratio)"&nbsp;which&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;hop&nbsp;height&nbsp;over&nbsp;the<br>
+layer&nbsp;thickness,&nbsp;the&nbsp;default&nbsp;is&nbsp;1.0.&nbsp;&nbsp;The&nbsp;'Minimum&nbsp;Hop&nbsp;Angle&nbsp;(degrees)'&nbsp;is&nbsp;the&nbsp;minimum&nbsp;angle&nbsp;that&nbsp;the&nbsp;path&nbsp;of&nbsp;the&nbsp;extruder<br>
will&nbsp;be&nbsp;raised.&nbsp;&nbsp;An&nbsp;angle&nbsp;of&nbsp;ninety&nbsp;means&nbsp;that&nbsp;the&nbsp;extruder&nbsp;will&nbsp;go&nbsp;straight&nbsp;up&nbsp;as&nbsp;soon&nbsp;as&nbsp;it&nbsp;is&nbsp;not&nbsp;extruding&nbsp;and&nbsp;a&nbsp;low&nbsp;angle<br>
means&nbsp;the&nbsp;extruder&nbsp;path&nbsp;will&nbsp;gradually&nbsp;rise&nbsp;to&nbsp;the&nbsp;hop&nbsp;height,&nbsp;the&nbsp;default&nbsp;is&nbsp;20&nbsp;degrees.<br>
&nbsp;<br>
To&nbsp;run&nbsp;hop,&nbsp;in&nbsp;a&nbsp;shell&nbsp;which&nbsp;hop&nbsp;is&nbsp;in&nbsp;type:<br>
&gt;&nbsp;python&nbsp;hop.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;hop&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;hop.py.&nbsp;&nbsp;The&nbsp;hop&nbsp;function&nbsp;will&nbsp;hop&nbsp;if&nbsp;the&nbsp;'Activate&nbsp;Hop'<br>
+The&nbsp;following&nbsp;examples&nbsp;hop&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;hop.py.&nbsp;&nbsp;The&nbsp;hop&nbsp;function&nbsp;will&nbsp;hop&nbsp;if&nbsp;the&nbsp;'Activate&nbsp;Hop'<br>
checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getHopChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;hopped,&nbsp;if&nbsp;not&nbsp;they<br>
call&nbsp;the&nbsp;getStretchChainGcode&nbsp;in&nbsp;stretch.py&nbsp;to&nbsp;stretch&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;stretched&nbsp;text,&nbsp;then&nbsp;they&nbsp;hop.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;hop.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Hop',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;hopped.<br>
-The&nbsp;hopped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_hop.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;hopped.<br>
+The&nbsp;hopped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_hop.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python<br>
@@ -44,13 +44,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;hop&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;hop.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;hopped.<br>
-The&nbsp;hopped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_hop.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;hopped.<br>
+The&nbsp;hopped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_hop.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;hop.<a href="#-getHopGcode">getHopGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -59,7 +59,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;hop.<a href="#-getHopChainGcode">getHopChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -77,7 +77,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="cStringIO.html">cStringIO</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -105,7 +105,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;hop&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="HopPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="HopPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="HopPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Hop&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -125,7 +125,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="HopSkein-getHopLine"><strong>getHopLine</strong></a>(self, line)</dt><dd><tt>Get&nbsp;hopped&nbsp;gcode&nbsp;line.</tt></dd></dl>
-<dl><dt><a name="HopSkein-getMovementLineWithHop"><strong>getMovementLineWithHop</strong></a>(self, location)</dt><dd><tt>Get&nbsp;linear&nbsp;movement&nbsp;line&nbsp;for&nbsp;a&nbsp;location.</tt></dd></dl>
+<dl><dt><a name="HopSkein-getMovementLineWithHop"><strong>getMovementLineWithHop</strong></a>(self, location, z)</dt><dd><tt>Get&nbsp;linear&nbsp;movement&nbsp;line&nbsp;for&nbsp;a&nbsp;location.</tt></dd></dl>
<dl><dt><a name="HopSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
@@ -144,10 +144,10 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getHopChainGcode"><strong>getHopChainGcode</strong></a>(filename, gcodeText, hopPreferences<font color="#909090">=None</font>)</dt><dd><tt>Hop&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;hop&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;hopped.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getHopChainGcode"><strong>getHopChainGcode</strong></a>(fileName, gcodeText, hopPreferences<font color="#909090">=None</font>)</dt><dd><tt>Hop&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;hop&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;hopped.</tt></dd></dl>
<dl><dt><a name="-getHopGcode"><strong>getHopGcode</strong></a>(gcodeText, hopPreferences<font color="#909090">=None</font>)</dt><dd><tt>Hop&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;hop&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Hop&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;hop&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;hopped.&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;hop&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Hop&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;hop&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;hopped.&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;hop&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.html
index c46ae5bc..6394a739 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.html
@@ -19,28 +19,28 @@
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="skeinforge_tools.analyze.html">analyze</a><br>
<a href="skeinforge_tools.analyze_plugins.html"><strong>analyze_plugins</strong>&nbsp;(package)</a><br>
+<a href="skeinforge_tools.carve.html">carve</a><br>
<a href="skeinforge_tools.clip.html">clip</a><br>
<a href="skeinforge_tools.comb.html">comb</a><br>
<a href="skeinforge_tools.cool.html">cool</a><br>
-<a href="skeinforge_tools.export.html">export</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.export_plugins.html"><strong>export_plugins</strong>&nbsp;(package)</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.export.html">export</a><br>
+<a href="skeinforge_tools.export_plugins.html"><strong>export_plugins</strong>&nbsp;(package)</a><br>
<a href="skeinforge_tools.fill.html">fill</a><br>
<a href="skeinforge_tools.fillet.html">fillet</a><br>
<a href="skeinforge_tools.hop.html">hop</a><br>
<a href="skeinforge_tools.import_plugins.html"><strong>import_plugins</strong>&nbsp;(package)</a><br>
-<a href="skeinforge_tools.import_translator.html">import_translator</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.material.html">material</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.inset.html">inset</a><br>
+<a href="skeinforge_tools.material.html">material</a><br>
<a href="skeinforge_tools.multiply.html">multiply</a><br>
-<a href="skeinforge_tools.nozzle_wipe.html">nozzle_wipe</a><br>
<a href="skeinforge_tools.oozebane.html">oozebane</a><br>
<a href="skeinforge_tools.polyfile.html">polyfile</a><br>
<a href="skeinforge_tools.raft.html">raft</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.html"><strong>skeinforge_utilities</strong>&nbsp;(package)</a><br>
-<a href="skeinforge_tools.slice_shape.html">slice_shape</a><br>
<a href="skeinforge_tools.speed.html">speed</a><br>
<a href="skeinforge_tools.stretch.html">stretch</a><br>
<a href="skeinforge_tools.tower.html">tower</a><br>
<a href="skeinforge_tools.unpause.html">unpause</a><br>
+<a href="skeinforge_tools.wipe.html">wipe</a><br>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.gts.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.gts.html
new file mode 100644
index 00000000..44966073
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.gts.html
@@ -0,0 +1,83 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.import_plugins.gts</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.import_plugins.html"><font color="#ffffff">import_plugins</font></a>.gts</strong></big></big> ($Date: 2008/21/04 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/gts.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/gts.py</a></font></td></tr></table>
+ <p><tt>The&nbsp;gts.py&nbsp;script&nbsp;is&nbsp;an&nbsp;import&nbsp;translator&nbsp;plugin&nbsp;to&nbsp;get&nbsp;a&nbsp;carving&nbsp;from&nbsp;an&nbsp;gts&nbsp;file.<br>
+&nbsp;<br>
+An&nbsp;import&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder&nbsp;which&nbsp;has&nbsp;the&nbsp;function&nbsp;getCarving.&nbsp;&nbsp;It&nbsp;is&nbsp;meant&nbsp;to&nbsp;be&nbsp;run&nbsp;from&nbsp;the<br>
+interpret&nbsp;tool.&nbsp;&nbsp;To&nbsp;ensure&nbsp;that&nbsp;the&nbsp;plugin&nbsp;works&nbsp;on&nbsp;platforms&nbsp;which&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;capitalization&nbsp;properly,&nbsp;give&nbsp;the&nbsp;plugin<br>
+a&nbsp;lower&nbsp;case&nbsp;name.<br>
+&nbsp;<br>
+The&nbsp;getCarving&nbsp;function&nbsp;takes&nbsp;the&nbsp;file&nbsp;name&nbsp;of&nbsp;an&nbsp;gts&nbsp;file&nbsp;and&nbsp;returns&nbsp;the&nbsp;carving.<br>
+&nbsp;<br>
+The&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;(.gts)&nbsp;format&nbsp;is&nbsp;described&nbsp;at:<br>
+<a href="http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE">http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE</a><br>
+&nbsp;<br>
+This&nbsp;example&nbsp;gets&nbsp;a&nbsp;carving&nbsp;for&nbsp;the&nbsp;gts&nbsp;file&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gts.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
+contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gts&nbsp;and&nbsp;gts.py.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python<br>
+Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
+[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
+Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;gts<br>
+&gt;&gt;&gt;&nbsp;gts.<a href="#-getCarving">getCarving</a>()<br>
+[11.6000003815,&nbsp;10.6837882996,&nbsp;7.80209827423<br>
+..<br>
+many&nbsp;more&nbsp;lines&nbsp;of&nbsp;the&nbsp;carving<br>
+..</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html">skeinforge_tools.skeinforge_utilities.triangle_mesh</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl><dt><a name="-getCarving"><strong>getCarving</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;gts&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getFromGNUTriangulatedSurfaceText"><strong>getFromGNUTriangulatedSurfaceText</strong></a>(gnuTriangulatedSurfaceText, triangleMesh)</dt><dd><tt>Initialize&nbsp;from&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;Text.</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__credits__</strong> = 'Nophead &lt;http://hydraraptor.blogspot.com/&gt;<font color="#c040c0">\n</font>Art of Illusion &lt;http://www.artofillusion.org/&gt;'<br>
+<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Credits</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Nophead&nbsp;&lt;<a href="http://hydraraptor.blogspot.com/">http://hydraraptor.blogspot.com/</a>&gt;<br>
+Art&nbsp;of&nbsp;Illusion&nbsp;&lt;<a href="http://www.artofillusion.org/">http://www.artofillusion.org/</a>&gt;</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.html
index 171e995b..2af903d6 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.html
@@ -17,8 +17,11 @@
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="skeinforge_tools.import_plugins.stl.html">stl</a><br>
-</td><td width="25%" valign=top></td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="skeinforge_tools.import_plugins.gts.html">gts</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.import_plugins.slc.html">slc</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.import_plugins.stl.html">stl</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.import_plugins.svg.html">svg</a><br>
+</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom>&nbsp;<br>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.slc.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.slc.html
new file mode 100644
index 00000000..0fd6ac68
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.slc.html
@@ -0,0 +1,152 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.import_plugins.slc</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.import_plugins.html"><font color="#ffffff">import_plugins</font></a>.slc</strong></big></big> ($Date: 2008/21/04 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/slc.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/slc.py</a></font></td></tr></table>
+ <p><tt>The&nbsp;slc.py&nbsp;script&nbsp;is&nbsp;an&nbsp;import&nbsp;translator&nbsp;plugin&nbsp;to&nbsp;get&nbsp;a&nbsp;carving&nbsp;from&nbsp;an&nbsp;slc&nbsp;file.<br>
+&nbsp;<br>
+An&nbsp;import&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder&nbsp;which&nbsp;has&nbsp;the&nbsp;function&nbsp;getCarving.&nbsp;&nbsp;It&nbsp;is&nbsp;meant&nbsp;to&nbsp;be&nbsp;run&nbsp;from&nbsp;the<br>
+interpret&nbsp;tool.&nbsp;&nbsp;To&nbsp;ensure&nbsp;that&nbsp;the&nbsp;plugin&nbsp;works&nbsp;on&nbsp;platforms&nbsp;which&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;capitalization&nbsp;properly,&nbsp;give&nbsp;the&nbsp;plugin<br>
+a&nbsp;lower&nbsp;case&nbsp;name.<br>
+&nbsp;<br>
+The&nbsp;getCarving&nbsp;function&nbsp;takes&nbsp;the&nbsp;file&nbsp;name&nbsp;of&nbsp;an&nbsp;slc&nbsp;file&nbsp;and&nbsp;returns&nbsp;the&nbsp;carving.<br>
+&nbsp;<br>
+This&nbsp;example&nbsp;gets&nbsp;a&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;slc&nbsp;file&nbsp;rotor.slc.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains<br>
+rotor.slc&nbsp;and&nbsp;slc.py.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python<br>
+Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
+[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
+Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;slc<br>
+&gt;&gt;&gt;&nbsp;slc.<a href="#-getCarving">getCarving</a>()<br>
+0.20000000298,&nbsp;999999999.0,&nbsp;-999999999.0,&nbsp;[8.72782748851e-17,&nbsp;None<br>
+..<br>
+many&nbsp;more&nbsp;lines&nbsp;of&nbsp;the&nbsp;carving<br>
+..<br>
+&nbsp;<br>
+&nbsp;<br>
+An&nbsp;explanation&nbsp;of&nbsp;the&nbsp;SLC&nbsp;format&nbsp;can&nbsp;be&nbsp;found&nbsp;at:<br>
+<a href="http://rapid.lpt.fi/archives/rp-ml-1999/0713.html">http://rapid.lpt.fi/archives/rp-ml-1999/0713.html</a></tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
+</td><td width="25%" valign=top><a href="sys.html">sys</a><br>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="skeinforge_tools.import_plugins.slc.html#SLCCarving">SLCCarving</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.import_plugins.slc.html#SampleTableEntry">SampleTableEntry</a>
+</font></dt></dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="SLCCarving">class <strong>SLCCarving</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>An&nbsp;slc&nbsp;carving.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="SLCCarving-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Add&nbsp;empty&nbsp;lists.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;carving.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-getCarveCornerMaximum"><strong>getCarveCornerMaximum</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;corner&nbsp;maximum&nbsp;of&nbsp;the&nbsp;vertices.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-getCarveCornerMinimum"><strong>getCarveCornerMinimum</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;corner&nbsp;minimum&nbsp;of&nbsp;the&nbsp;vertices.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-getCarveLayerThickness"><strong>getCarveLayerThickness</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;layer&nbsp;thickness.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-getCarveRotatedBoundaryLayers"><strong>getCarveRotatedBoundaryLayers</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;rotated&nbsp;boundary&nbsp;layers.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-processContourLayers"><strong>processContourLayers</strong></a>(self, file)</dt><dd><tt>Process&nbsp;a&nbsp;contour&nbsp;layer&nbsp;at&nbsp;a&nbsp;time&nbsp;until&nbsp;the&nbsp;top&nbsp;of&nbsp;the&nbsp;part.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-readFile"><strong>readFile</strong></a>(self, fileName)</dt><dd><tt>Read&nbsp;SLC&nbsp;and&nbsp;store&nbsp;the&nbsp;layers.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-readTableEntry"><strong>readTableEntry</strong></a>(self, file)</dt><dd><tt>Read&nbsp;in&nbsp;the&nbsp;sampling&nbsp;table&nbsp;section.&nbsp;It&nbsp;contains&nbsp;a&nbsp;table&nbsp;length&nbsp;(byte)&nbsp;and&nbsp;the&nbsp;table&nbsp;entries.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-setCarveBridgeLayerThickness"><strong>setCarveBridgeLayerThickness</strong></a>(self, bridgeLayerThickness)</dt><dd><tt>Set&nbsp;the&nbsp;bridge&nbsp;layer&nbsp;thickness.&nbsp;&nbsp;If&nbsp;the&nbsp;infill&nbsp;is&nbsp;not&nbsp;in&nbsp;the&nbsp;direction&nbsp;of&nbsp;the&nbsp;bridge,&nbsp;the&nbsp;bridge&nbsp;layer&nbsp;thickness&nbsp;should&nbsp;be&nbsp;given&nbsp;as&nbsp;None&nbsp;or&nbsp;not&nbsp;set&nbsp;at&nbsp;all.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-setCarveExtrusionWidth"><strong>setCarveExtrusionWidth</strong></a>(self, extrusionWidth)</dt><dd><tt>Set&nbsp;the&nbsp;extrusion&nbsp;width.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-setCarveImportCoarseness"><strong>setCarveImportCoarseness</strong></a>(self, importCoarseness)</dt><dd><tt>Set&nbsp;the&nbsp;import&nbsp;coarseness.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-setCarveIsCorrectMesh"><strong>setCarveIsCorrectMesh</strong></a>(self, isCorrectMesh)</dt><dd><tt>Set&nbsp;the&nbsp;is&nbsp;correct&nbsp;mesh&nbsp;flag.</tt></dd></dl>
+
+<dl><dt><a name="SLCCarving-setCarveLayerThickness"><strong>setCarveLayerThickness</strong></a>(self, layerThickness)</dt><dd><tt>Set&nbsp;the&nbsp;layer&nbsp;thickness.</tt></dd></dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="SampleTableEntry">class <strong>SampleTableEntry</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>Sample&nbsp;table&nbsp;entry.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="SampleTableEntry-__init__"><strong>__init__</strong></a>(self, file)</dt><dd><tt>Read&nbsp;in&nbsp;the&nbsp;sampling&nbsp;table&nbsp;section.&nbsp;It&nbsp;contains&nbsp;a&nbsp;table&nbsp;length&nbsp;(byte)&nbsp;and&nbsp;the&nbsp;table&nbsp;entries.</tt></dd></dl>
+
+<dl><dt><a name="SampleTableEntry-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;sample&nbsp;table&nbsp;entry.</tt></dd></dl>
+
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl><dt><a name="-getCarving"><strong>getCarving</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;slc&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getLittleEndianFloatGivenFile"><strong>getLittleEndianFloatGivenFile</strong></a>(file)</dt><dd><tt>Get&nbsp;little&nbsp;endian&nbsp;float&nbsp;given&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getLittleEndianUnsignedLongGivenFile"><strong>getLittleEndianUnsignedLongGivenFile</strong></a>(file)</dt><dd><tt>Get&nbsp;little&nbsp;endian&nbsp;float&nbsp;given&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getPointsFromFile"><strong>getPointsFromFile</strong></a>(numPoints, file)</dt><dd><tt>Process&nbsp;the&nbsp;vertice&nbsp;points&nbsp;for&nbsp;a&nbsp;given&nbsp;boundary.</tt></dd></dl>
+ <dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;inset&nbsp;dialog.</tt></dd></dl>
+ <dl><dt><a name="-readHeader"><strong>readHeader</strong></a>(file)</dt><dd><tt>Read&nbsp;the&nbsp;slc&nbsp;header.</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__credits__</strong> = 'Nophead &lt;http://hydraraptor.blogspot.com/&gt;<font color="#c040c0">\n</font>Art of Illusion &lt;http://www.artofillusion.org/&gt;'<br>
+<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Credits</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Nophead&nbsp;&lt;<a href="http://hydraraptor.blogspot.com/">http://hydraraptor.blogspot.com/</a>&gt;<br>
+Art&nbsp;of&nbsp;Illusion&nbsp;&lt;<a href="http://www.artofillusion.org/">http://www.artofillusion.org/</a>&gt;</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.stl.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.stl.html
index 884bf413..832a26dc 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.stl.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.stl.html
@@ -9,13 +9,13 @@
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.import_plugins.html"><font color="#ffffff">import_plugins</font></a>.stl</strong></big></big> ($Date: 2008/21/04 $)</font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/stl.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/stl.py</a></font></td></tr></table>
- <p><tt>The&nbsp;stl.py&nbsp;script&nbsp;is&nbsp;an&nbsp;import&nbsp;translator&nbsp;plugin&nbsp;to&nbsp;get&nbsp;a&nbsp;triangle&nbsp;mesh&nbsp;from&nbsp;an&nbsp;stl&nbsp;file.<br>
+ <p><tt>The&nbsp;stl.py&nbsp;script&nbsp;is&nbsp;an&nbsp;import&nbsp;translator&nbsp;plugin&nbsp;to&nbsp;get&nbsp;a&nbsp;carving&nbsp;from&nbsp;an&nbsp;stl&nbsp;file.<br>
&nbsp;<br>
-An&nbsp;import&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder&nbsp;which&nbsp;has&nbsp;the&nbsp;function&nbsp;getTriangleMesh.&nbsp;&nbsp;It&nbsp;is&nbsp;meant&nbsp;to&nbsp;be&nbsp;run&nbsp;from&nbsp;the<br>
-import_translator&nbsp;tool.&nbsp;&nbsp;To&nbsp;ensure&nbsp;that&nbsp;the&nbsp;plugin&nbsp;works&nbsp;on&nbsp;platforms&nbsp;which&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;capitalization&nbsp;properly,&nbsp;give&nbsp;the&nbsp;plugin<br>
+An&nbsp;import&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder&nbsp;which&nbsp;has&nbsp;the&nbsp;function&nbsp;getCarving.&nbsp;&nbsp;It&nbsp;is&nbsp;meant&nbsp;to&nbsp;be&nbsp;run&nbsp;from&nbsp;the<br>
+interpret&nbsp;tool.&nbsp;&nbsp;To&nbsp;ensure&nbsp;that&nbsp;the&nbsp;plugin&nbsp;works&nbsp;on&nbsp;platforms&nbsp;which&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;capitalization&nbsp;properly,&nbsp;give&nbsp;the&nbsp;plugin<br>
a&nbsp;lower&nbsp;case&nbsp;name.<br>
&nbsp;<br>
-The&nbsp;getTriangleMesh&nbsp;function&nbsp;takes&nbsp;the&nbsp;filename&nbsp;of&nbsp;an&nbsp;stl&nbsp;file&nbsp;and&nbsp;returns&nbsp;the&nbsp;triangle&nbsp;mesh.<br>
+The&nbsp;getCarving&nbsp;function&nbsp;takes&nbsp;the&nbsp;file&nbsp;name&nbsp;of&nbsp;an&nbsp;stl&nbsp;file&nbsp;and&nbsp;returns&nbsp;the&nbsp;carving.<br>
&nbsp;<br>
STL&nbsp;is&nbsp;an&nbsp;inferior&nbsp;triangle&nbsp;surface&nbsp;format,&nbsp;described&nbsp;at:<br>
<a href="http://en.wikipedia.org/wiki/STL_(file_format">http://en.wikipedia.org/wiki/STL_(file_format</a>)<br>
@@ -23,8 +23,8 @@ STL&nbsp;is&nbsp;an&nbsp;inferior&nbsp;triangle&nbsp;surface&nbsp;format,&nbsp;d
A&nbsp;good&nbsp;triangle&nbsp;surface&nbsp;format&nbsp;is&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;format&nbsp;which&nbsp;is&nbsp;described&nbsp;at:<br>
<a href="http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE">http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE</a><br>
&nbsp;<br>
-This&nbsp;example&nbsp;gets&nbsp;a&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;stl&nbsp;file&nbsp;Hollow&nbsp;Square.stl.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains<br>
-Hollow&nbsp;Square.stl&nbsp;and&nbsp;stl.py.<br>
+This&nbsp;example&nbsp;gets&nbsp;a&nbsp;carving&nbsp;for&nbsp;the&nbsp;stl&nbsp;file&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
+contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;stl.py.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python<br>
@@ -32,10 +32,10 @@ Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<b
[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
&gt;&gt;&gt;&nbsp;import&nbsp;stl<br>
-&gt;&gt;&gt;&nbsp;stl.<a href="#-getTriangleMesh">getTriangleMesh</a>()<br>
+&gt;&gt;&gt;&nbsp;stl.<a href="#-getCarving">getCarving</a>()<br>
[11.6000003815,&nbsp;10.6837882996,&nbsp;7.80209827423<br>
..<br>
-many&nbsp;more&nbsp;lines&nbsp;of&nbsp;the&nbsp;triangle&nbsp;mesh<br>
+many&nbsp;more&nbsp;lines&nbsp;of&nbsp;the&nbsp;carving<br>
..</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -57,9 +57,9 @@ many&nbsp;more&nbsp;lines&nbsp;of&nbsp;the&nbsp;triangle&nbsp;mesh<br>
<td width="100%"><dl><dt><a name="-addFacesGivenBinary"><strong>addFacesGivenBinary</strong></a>(stlData, triangleMesh, vertexIndexTable)</dt><dd><tt>Add&nbsp;faces&nbsp;given&nbsp;stl&nbsp;binary.</tt></dd></dl>
<dl><dt><a name="-addFacesGivenText"><strong>addFacesGivenText</strong></a>(stlText, triangleMesh, vertexIndexTable)</dt><dd><tt>Add&nbsp;faces&nbsp;given&nbsp;stl&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-addFacesGivenVertices"><strong>addFacesGivenVertices</strong></a>(triangleMesh, vertexIndexTable, vertices)</dt><dd><tt>Add&nbsp;faces&nbsp;given&nbsp;stl&nbsp;text.</tt></dd></dl>
+ <dl><dt><a name="-getCarving"><strong>getCarving</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;stl&nbsp;file.</tt></dd></dl>
<dl><dt><a name="-getFaceGivenLines"><strong>getFaceGivenLines</strong></a>(triangleMesh, vertexStartIndex, vertexIndexTable, vertices)</dt><dd><tt>Add&nbsp;face&nbsp;given&nbsp;line&nbsp;index&nbsp;and&nbsp;lines.</tt></dd></dl>
<dl><dt><a name="-getFloatGivenBinary"><strong>getFloatGivenBinary</strong></a>(byteIndex, stlData)</dt><dd><tt>Get&nbsp;vertex&nbsp;given&nbsp;stl&nbsp;vertex&nbsp;line.</tt></dd></dl>
- <dl><dt><a name="-getTriangleMesh"><strong>getTriangleMesh</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;stl&nbsp;file.</tt></dd></dl>
<dl><dt><a name="-getVertexGivenBinary"><strong>getVertexGivenBinary</strong></a>(byteIndex, stlData)</dt><dd><tt>Get&nbsp;vertex&nbsp;given&nbsp;stl&nbsp;vertex&nbsp;line.</tt></dd></dl>
<dl><dt><a name="-getVertexGivenLine"><strong>getVertexGivenLine</strong></a>(line)</dt><dd><tt>Get&nbsp;vertex&nbsp;given&nbsp;stl&nbsp;vertex&nbsp;line.</tt></dd></dl>
</td></tr></table><p>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.svg.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.svg.html
new file mode 100644
index 00000000..0cd8ddf5
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_plugins.svg.html
@@ -0,0 +1,130 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.import_plugins.svg</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.import_plugins.html"><font color="#ffffff">import_plugins</font></a>.svg</strong></big></big> ($Date: 2008/21/04 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/svg.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_plugins/svg.py</a></font></td></tr></table>
+ <p><tt>The&nbsp;svg.py&nbsp;script&nbsp;is&nbsp;an&nbsp;import&nbsp;translator&nbsp;plugin&nbsp;to&nbsp;get&nbsp;a&nbsp;carving&nbsp;from&nbsp;an&nbsp;svg&nbsp;file.<br>
+&nbsp;<br>
+An&nbsp;import&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder&nbsp;which&nbsp;has&nbsp;the&nbsp;function&nbsp;getCarving.&nbsp;&nbsp;It&nbsp;is&nbsp;meant&nbsp;to&nbsp;be&nbsp;run&nbsp;from&nbsp;the<br>
+interpret&nbsp;tool.&nbsp;&nbsp;To&nbsp;ensure&nbsp;that&nbsp;the&nbsp;plugin&nbsp;works&nbsp;on&nbsp;platforms&nbsp;which&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;capitalization&nbsp;properly,&nbsp;give&nbsp;the&nbsp;plugin<br>
+a&nbsp;lower&nbsp;case&nbsp;name.<br>
+&nbsp;<br>
+The&nbsp;getCarving&nbsp;function&nbsp;takes&nbsp;the&nbsp;file&nbsp;name&nbsp;of&nbsp;an&nbsp;svg&nbsp;file&nbsp;and&nbsp;returns&nbsp;the&nbsp;carving.<br>
+&nbsp;<br>
+This&nbsp;example&nbsp;gets&nbsp;a&nbsp;carving&nbsp;for&nbsp;the&nbsp;svg&nbsp;file&nbsp;Screw&nbsp;Holder&nbsp;Bottom.svg.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
+contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.svg&nbsp;and&nbsp;svg.py.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python<br>
+Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
+[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
+Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;svg<br>
+&gt;&gt;&gt;&nbsp;svg.<a href="#-getCarving">getCarving</a>()<br>
+0.20000000298,&nbsp;999999999.0,&nbsp;-999999999.0,&nbsp;[8.72782748851e-17,&nbsp;None<br>
+..<br>
+many&nbsp;more&nbsp;lines&nbsp;of&nbsp;the&nbsp;carving<br>
+..</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="skeinforge_tools.import_plugins.svg.html#SVGCarving">SVGCarving</a>
+</font></dt></dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="SVGCarving">class <strong>SVGCarving</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>An&nbsp;svg&nbsp;carving.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="SVGCarving-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Add&nbsp;empty&nbsp;lists.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;carving.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-getCarveCornerMaximum"><strong>getCarveCornerMaximum</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;corner&nbsp;maximum&nbsp;of&nbsp;the&nbsp;vertices.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-getCarveCornerMinimum"><strong>getCarveCornerMinimum</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;corner&nbsp;minimum&nbsp;of&nbsp;the&nbsp;vertices.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-getCarveLayerThickness"><strong>getCarveLayerThickness</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;layer&nbsp;thickness.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-getCarveRotatedBoundaryLayers"><strong>getCarveRotatedBoundaryLayers</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;rotated&nbsp;boundary&nbsp;layers.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-parseInitialization"><strong>parseInitialization</strong></a>(self)</dt><dd><tt>Parse&nbsp;gcode&nbsp;initialization&nbsp;and&nbsp;store&nbsp;the&nbsp;parameters.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-parseLine"><strong>parseLine</strong></a>(self, lineIndex)</dt><dd><tt>Parse&nbsp;a&nbsp;gcode&nbsp;line&nbsp;and&nbsp;add&nbsp;it&nbsp;to&nbsp;the&nbsp;inset&nbsp;skein.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-parseSVG"><strong>parseSVG</strong></a>(self, svgText)</dt><dd><tt>Parse&nbsp;SVG&nbsp;text&nbsp;and&nbsp;store&nbsp;the&nbsp;layers.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-setCarveBridgeLayerThickness"><strong>setCarveBridgeLayerThickness</strong></a>(self, bridgeLayerThickness)</dt><dd><tt>Set&nbsp;the&nbsp;bridge&nbsp;layer&nbsp;thickness.&nbsp;&nbsp;If&nbsp;the&nbsp;infill&nbsp;is&nbsp;not&nbsp;in&nbsp;the&nbsp;direction&nbsp;of&nbsp;the&nbsp;bridge,&nbsp;the&nbsp;bridge&nbsp;layer&nbsp;thickness&nbsp;should&nbsp;be&nbsp;given&nbsp;as&nbsp;None&nbsp;or&nbsp;not&nbsp;set&nbsp;at&nbsp;all.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-setCarveExtrusionWidth"><strong>setCarveExtrusionWidth</strong></a>(self, extrusionWidth)</dt><dd><tt>Set&nbsp;the&nbsp;extrusion&nbsp;width.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-setCarveImportCoarseness"><strong>setCarveImportCoarseness</strong></a>(self, importCoarseness)</dt><dd><tt>Set&nbsp;the&nbsp;import&nbsp;coarseness.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-setCarveIsCorrectMesh"><strong>setCarveIsCorrectMesh</strong></a>(self, isCorrectMesh)</dt><dd><tt>Set&nbsp;the&nbsp;is&nbsp;correct&nbsp;mesh&nbsp;flag.</tt></dd></dl>
+
+<dl><dt><a name="SVGCarving-setCarveLayerThickness"><strong>setCarveLayerThickness</strong></a>(self, layerThickness)</dt><dd><tt>Set&nbsp;the&nbsp;layer&nbsp;thickness.</tt></dd></dl>
+
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl><dt><a name="-addPathData"><strong>addPathData</strong></a>(line, loops)</dt><dd><tt>Add&nbsp;the&nbsp;data&nbsp;from&nbsp;the&nbsp;path&nbsp;line.</tt></dd></dl>
+ <dl><dt><a name="-addTextData"><strong>addTextData</strong></a>(line, rotatedBoundaryLayers)</dt><dd><tt>Add&nbsp;the&nbsp;data&nbsp;from&nbsp;the&nbsp;text&nbsp;line.</tt></dd></dl>
+ <dl><dt><a name="-getCarving"><strong>getCarving</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;gts&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getValueInQuotes"><strong>getValueInQuotes</strong></a>(name, text, value)</dt><dd><tt>Get&nbsp;value&nbsp;in&nbsp;quotes&nbsp;after&nbsp;the&nbsp;name.</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__credits__</strong> = 'Nophead &lt;http://hydraraptor.blogspot.com/&gt;<font color="#c040c0">\n</font>Art of Illusion &lt;http://www.artofillusion.org/&gt;'<br>
+<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Credits</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Nophead&nbsp;&lt;<a href="http://hydraraptor.blogspot.com/">http://hydraraptor.blogspot.com/</a>&gt;<br>
+Art&nbsp;of&nbsp;Illusion&nbsp;&lt;<a href="http://www.artofillusion.org/">http://www.artofillusion.org/</a>&gt;</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_translator.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_translator.html
deleted file mode 100644
index f2b16c88..00000000
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.import_translator.html
+++ /dev/null
@@ -1,120 +0,0 @@
-
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: module skeinforge_tools.import_translator</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.import_translator</strong></big></big> ($Date: 2008/21/04 $)</font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_translator.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/import_translator.py</a></font></td></tr></table>
- <p><tt>Import&nbsp;translator&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;access&nbsp;and&nbsp;display&nbsp;the&nbsp;import&nbsp;plugins.<br>
-&nbsp;<br>
-Import&nbsp;shows&nbsp;the&nbsp;client&nbsp;which&nbsp;import&nbsp;plugins&nbsp;are&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder.&nbsp;&nbsp;If&nbsp;"Translate"&nbsp;is&nbsp;clicked,&nbsp;the&nbsp;chosen&nbsp;file&nbsp;will&nbsp;be<br>
-translated&nbsp;and&nbsp;saved&nbsp;as&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;format&nbsp;file.<br>
-&nbsp;<br>
-An&nbsp;import&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder&nbsp;which&nbsp;has&nbsp;the&nbsp;function&nbsp;getTriangleMesh.<br>
-&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;import&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains<br>
-Hollow&nbsp;Square.stl&nbsp;&amp;&nbsp;import_translator.py.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python&nbsp;import_translator.py<br>
-This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Translate',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.stl&nbsp;is&nbsp;being&nbsp;translated&nbsp;to&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;format.'<br>
-The&nbsp;translated&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square.gts<br>
-It&nbsp;took&nbsp;0&nbsp;seconds&nbsp;to&nbsp;translate&nbsp;the&nbsp;file.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python&nbsp;import_translator.py&nbsp;Hollow&nbsp;Square.stl<br>
-File&nbsp;Hollow&nbsp;Square.stl&nbsp;is&nbsp;being&nbsp;translated&nbsp;to&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;format.<br>
-The&nbsp;translated&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square.gts<br>
-It&nbsp;took&nbsp;0&nbsp;seconds&nbsp;to&nbsp;translate&nbsp;the&nbsp;file.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python<br>
-Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
-[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
-Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
-&gt;&gt;&gt;&nbsp;import&nbsp;import<br>
-&gt;&gt;&gt;&nbsp;import.<a href="#-writeOutput">writeOutput</a>()<br>
-File&nbsp;Hollow&nbsp;Square.stl&nbsp;is&nbsp;being&nbsp;translated&nbsp;to&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;format.<br>
-The&nbsp;translated&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square.gts<br>
-It&nbsp;took&nbsp;0&nbsp;seconds&nbsp;to&nbsp;translate&nbsp;the&nbsp;file.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&gt;&gt;&nbsp;import.<a href="#-main">main</a>()<br>
-This&nbsp;brings&nbsp;up&nbsp;the&nbsp;import&nbsp;dialog.</tt></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
-
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
-</td><td width="25%" valign=top><a href="sys.html">sys</a><br>
-<a href="time.html">time</a><br>
-</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ee77aa">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
-
-<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl>
-<dt><font face="helvetica, arial"><a href="skeinforge_tools.import_translator.html#ImportPreferences">ImportPreferences</a>
-</font></dt></dl>
- <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="ImportPreferences">class <strong>ImportPreferences</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;import&nbsp;preferences.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="ImportPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
-
-<dl><dt><a name="ImportPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Import&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
-
-</td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#eeaa77">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
-
-<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getGNUTranslatorFileTypeTuples"><strong>getGNUTranslatorFileTypeTuples</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;type&nbsp;tuples&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-getGNUTranslatorFileTypes"><strong>getGNUTranslatorFileTypes</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;types&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-getGNUTranslatorFilesUnmodified"><strong>getGNUTranslatorFilesUnmodified</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;types&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-getGNUTranslatorGcodeFileTypeTuples"><strong>getGNUTranslatorGcodeFileTypeTuples</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;type&nbsp;tuples&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-getImportPluginFilenames"><strong>getImportPluginFilenames</strong></a>()</dt><dd><tt>Get&nbsp;analyze&nbsp;plugin&nbsp;filenames.</tt></dd></dl>
- <dl><dt><a name="-getTranslatorFileTypeTuples"><strong>getTranslatorFileTypeTuples</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;types&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder.</tt></dd></dl>
- <dl><dt><a name="-getTriangleMesh"><strong>getTriangleMesh</strong></a>(filename)</dt><dd><tt>Get&nbsp;a&nbsp;triangle&nbsp;mesh&nbsp;for&nbsp;the&nbsp;file&nbsp;using&nbsp;an&nbsp;import&nbsp;plugin.</tt></dd></dl>
- <dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;import&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Translate&nbsp;a&nbsp;file&nbsp;to&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;format.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;translate&nbsp;the&nbsp;first&nbsp;file&nbsp;for&nbsp;which&nbsp;there&nbsp;is&nbsp;an&nbsp;import&nbsp;plugin.</tt></dd></dl>
-</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#55aa55">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
-
-<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
-<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
-<strong>__license__</strong> = 'GPL 3.0'<br>
-<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#7799ee">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
-
-<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
-</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.inset.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.inset.html
new file mode 100644
index 00000000..27b9b182
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.inset.html
@@ -0,0 +1,188 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.inset</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.inset</strong></big></big> ($Date: 2008/28/04 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/inset.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/inset.py</a></font></td></tr></table>
+ <p><tt>Inset&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;inset&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.<br>
+&nbsp;<br>
+Inset&nbsp;insets&nbsp;the&nbsp;svg&nbsp;slices&nbsp;into&nbsp;gcode&nbsp;extrusion&nbsp;layers.&nbsp;&nbsp;The&nbsp;'Extrusion&nbsp;Perimeter&nbsp;Width&nbsp;over&nbsp;Thickness'&nbsp;ratio&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the<br>
+extrusion&nbsp;perimeter&nbsp;width&nbsp;over&nbsp;the&nbsp;layer&nbsp;thickness.&nbsp;&nbsp;The&nbsp;higher&nbsp;the&nbsp;value&nbsp;the&nbsp;more&nbsp;the&nbsp;perimeter&nbsp;will&nbsp;be&nbsp;inset,&nbsp;the&nbsp;default&nbsp;is&nbsp;1.8.<br>
+&nbsp;<br>
+The&nbsp;'Infill&nbsp;Perimeter&nbsp;Overlap'&nbsp;ratio&nbsp;is&nbsp;the&nbsp;amount&nbsp;the&nbsp;infill&nbsp;overlaps&nbsp;the&nbsp;perimeter&nbsp;over&nbsp;the&nbsp;extrusion&nbsp;width.&nbsp;&nbsp;The&nbsp;higher&nbsp;the&nbsp;value&nbsp;the<br>
+more&nbsp;the&nbsp;infill&nbsp;will&nbsp;overlap&nbsp;the&nbsp;perimeter,&nbsp;and&nbsp;the&nbsp;thicker&nbsp;join&nbsp;between&nbsp;the&nbsp;infill&nbsp;and&nbsp;the&nbsp;perimeter.&nbsp;&nbsp;If&nbsp;the&nbsp;value&nbsp;is&nbsp;too&nbsp;high,&nbsp;the&nbsp;join&nbsp;will<br>
+be&nbsp;so&nbsp;thick&nbsp;that&nbsp;the&nbsp;nozzle&nbsp;will&nbsp;run&nbsp;plow&nbsp;through&nbsp;the&nbsp;join&nbsp;below&nbsp;making&nbsp;a&nbsp;mess,&nbsp;the&nbsp;default&nbsp;is&nbsp;0.05.&nbsp;&nbsp;There&nbsp;are&nbsp;two&nbsp;choices&nbsp;for&nbsp;the<br>
+infill&nbsp;perimeter&nbsp;overlap&nbsp;method&nbsp;of&nbsp;calculation.&nbsp;&nbsp;If&nbsp;the&nbsp;'Calculate&nbsp;Overlap&nbsp;from&nbsp;Perimeter&nbsp;and&nbsp;Infill'&nbsp;option&nbsp;is&nbsp;chosen,&nbsp;the&nbsp;overlap&nbsp;will&nbsp;be<br>
+calculated&nbsp;from&nbsp;the&nbsp;average&nbsp;of&nbsp;the&nbsp;perimeter&nbsp;width&nbsp;and&nbsp;the&nbsp;infill&nbsp;width,&nbsp;this&nbsp;is&nbsp;the&nbsp;default&nbsp;choice.&nbsp;&nbsp;If&nbsp;the&nbsp;'Calculate&nbsp;Overlap&nbsp;from<br>
+Perimeter&nbsp;Only'&nbsp;option&nbsp;is&nbsp;chosen,&nbsp;the&nbsp;overlap&nbsp;will&nbsp;be&nbsp;calculated&nbsp;from&nbsp;the&nbsp;perimeter&nbsp;width&nbsp;only.<br>
+&nbsp;<br>
+If&nbsp;the&nbsp;"Start&nbsp;at&nbsp;Home"&nbsp;preference&nbsp;is&nbsp;selected,&nbsp;the&nbsp;G28&nbsp;gcode&nbsp;will&nbsp;be&nbsp;added&nbsp;at&nbsp;the&nbsp;beginning&nbsp;of&nbsp;the&nbsp;file.<br>
+&nbsp;<br>
+When&nbsp;inset&nbsp;is&nbsp;generating&nbsp;the&nbsp;code,&nbsp;if&nbsp;there&nbsp;is&nbsp;a&nbsp;file&nbsp;start.txt,&nbsp;it&nbsp;will&nbsp;add&nbsp;that&nbsp;to&nbsp;the&nbsp;very&nbsp;beginning&nbsp;of&nbsp;the&nbsp;gcode.&nbsp;After&nbsp;it&nbsp;has&nbsp;added&nbsp;some<br>
+initialization&nbsp;code&nbsp;and&nbsp;just&nbsp;before&nbsp;it&nbsp;adds&nbsp;the&nbsp;extrusion&nbsp;gcode,&nbsp;it&nbsp;will&nbsp;add&nbsp;the&nbsp;file&nbsp;endofthebeginning.txt&nbsp;if&nbsp;it&nbsp;exists.&nbsp;At&nbsp;the&nbsp;very&nbsp;end,&nbsp;it&nbsp;will<br>
+add&nbsp;the&nbsp;file&nbsp;end.txt&nbsp;if&nbsp;it&nbsp;exists.&nbsp;Carve&nbsp;does&nbsp;not&nbsp;care&nbsp;if&nbsp;the&nbsp;text&nbsp;file&nbsp;names&nbsp;are&nbsp;capitalized,&nbsp;but&nbsp;some&nbsp;file&nbsp;systems&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;name<br>
+cases&nbsp;properly,&nbsp;so&nbsp;to&nbsp;be&nbsp;on&nbsp;the&nbsp;safe&nbsp;side&nbsp;you&nbsp;should&nbsp;give&nbsp;them&nbsp;lower&nbsp;case&nbsp;names.&nbsp;&nbsp;It&nbsp;will&nbsp;first&nbsp;look&nbsp;for&nbsp;the&nbsp;file&nbsp;in&nbsp;the&nbsp;same&nbsp;directory&nbsp;as<br>
+inset,&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;find&nbsp;it&nbsp;it&nbsp;will&nbsp;look&nbsp;in&nbsp;~/.skeinforge/gcode_scripts.<br>
+&nbsp;<br>
+The&nbsp;following&nbsp;examples&nbsp;inset&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in<br>
+the&nbsp;folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;inset.py.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python&nbsp;inset.py<br>
+This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Inset',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;insetted.<br>
+The&nbsp;insetted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_inset.gcode<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python<br>
+Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
+[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
+Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;inset<br>
+&gt;&gt;&gt;&nbsp;inset.<a href="#-main">main</a>()<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;insetted.<br>
+The&nbsp;insetted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_inset.gcode<br>
+It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;inset&nbsp;the&nbsp;file.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;inset.<a href="#-writeOutput">writeOutput</a>()<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;insetted.<br>
+The&nbsp;insetted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_inset.gcode<br>
+It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;inset&nbsp;the&nbsp;file.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+<a href="skeinforge_tools.analyze.html">skeinforge_tools.analyze</a><br>
+<a href="cStringIO.html">cStringIO</a><br>
+<a href="skeinforge_tools.carve.html">skeinforge_tools.carve</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
+</td><td width="25%" valign=top><a href="math.html">math</a><br>
+<a href="os.html">os</a><br>
+<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
+</td><td width="25%" valign=top><a href="sys.html">sys</a><br>
+<a href="time.html">time</a><br>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="skeinforge_tools.inset.html#InsetPreferences">InsetPreferences</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.inset.html#InsetSkein">InsetSkein</a>
+</font></dt></dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="InsetPreferences">class <strong>InsetPreferences</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;inset&nbsp;preferences.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="InsetPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
+
+<dl><dt><a name="InsetPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Inset&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="InsetSkein">class <strong>InsetSkein</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;inset&nbsp;a&nbsp;skein&nbsp;of&nbsp;extrusions.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="InsetSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="InsetSkein-addFromFile"><strong>addFromFile</strong></a>(self, fileName)</dt><dd><tt>Add&nbsp;lines&nbsp;of&nbsp;text&nbsp;from&nbsp;the&nbsp;fileName.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addFromUpperLowerFile"><strong>addFromUpperLowerFile</strong></a>(self, fileName)</dt><dd><tt>Add&nbsp;lines&nbsp;of&nbsp;text&nbsp;from&nbsp;the&nbsp;fileName&nbsp;or&nbsp;the&nbsp;lowercase&nbsp;fileName,&nbsp;if&nbsp;there&nbsp;is&nbsp;no&nbsp;file&nbsp;by&nbsp;the&nbsp;original&nbsp;fileName&nbsp;in&nbsp;the&nbsp;directory.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addGcodeFromPerimeterPaths"><strong>addGcodeFromPerimeterPaths</strong></a>(self, isIntersectingSelf, loop, loopLists, radius, z)</dt><dd><tt>Add&nbsp;the&nbsp;perimeter&nbsp;paths&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addGcodeFromRemainingLoop"><strong>addGcodeFromRemainingLoop</strong></a>(self, loop, loopLists, radius, z)</dt><dd><tt>Add&nbsp;the&nbsp;remainder&nbsp;of&nbsp;the&nbsp;loop&nbsp;which&nbsp;does&nbsp;not&nbsp;overlap&nbsp;the&nbsp;alreadyFilledArounds&nbsp;loops.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addGcodeFromThreadZ"><strong>addGcodeFromThreadZ</strong></a>(self, thread, z)</dt><dd><tt>Add&nbsp;a&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addGcodeMovementZ"><strong>addGcodeMovementZ</strong></a>(self, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addInitializationToOutput"><strong>addInitializationToOutput</strong></a>(self)</dt><dd><tt>Add&nbsp;initialization&nbsp;gcode&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addInset"><strong>addInset</strong></a>(self, layerIndex)</dt><dd><tt>Add&nbsp;fill&nbsp;to&nbsp;the&nbsp;carve&nbsp;layer.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addPathData"><strong>addPathData</strong></a>(self, line)</dt><dd><tt>Add&nbsp;the&nbsp;data&nbsp;from&nbsp;the&nbsp;path&nbsp;line.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addRotatedLoopLayer"><strong>addRotatedLoopLayer</strong></a>(self, z)</dt><dd><tt>Add&nbsp;rotated&nbsp;loop&nbsp;layer.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addShutdownToOutput"><strong>addShutdownToOutput</strong></a>(self)</dt><dd><tt>Add&nbsp;shutdown&nbsp;gcode&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-addTextData"><strong>addTextData</strong></a>(self, line)</dt><dd><tt>Add&nbsp;the&nbsp;data&nbsp;from&nbsp;the&nbsp;text&nbsp;line.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-getExtrudateLoops"><strong>getExtrudateLoops</strong></a>(self, halfWidth, loop)</dt><dd><tt>Get&nbsp;the&nbsp;inset&nbsp;extrudate&nbsp;loops&nbsp;from&nbsp;the&nbsp;loop.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-parseGcode"><strong>parseGcode</strong></a>(self, insetPreferences, gcodeText)</dt><dd><tt>Parse&nbsp;gcode&nbsp;text&nbsp;and&nbsp;store&nbsp;the&nbsp;bevel&nbsp;gcode.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-parseInitialization"><strong>parseInitialization</strong></a>(self)</dt><dd><tt>Parse&nbsp;gcode&nbsp;initialization&nbsp;and&nbsp;store&nbsp;the&nbsp;parameters.</tt></dd></dl>
+
+<dl><dt><a name="InsetSkein-parseLine"><strong>parseLine</strong></a>(self, lineIndex)</dt><dd><tt>Parse&nbsp;a&nbsp;gcode&nbsp;line&nbsp;and&nbsp;add&nbsp;it&nbsp;to&nbsp;the&nbsp;inset&nbsp;skein.</tt></dd></dl>
+
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl><dt><a name="-addAlreadyFilledArounds"><strong>addAlreadyFilledArounds</strong></a>(alreadyFilledArounds, loop, radius)</dt><dd><tt>Add&nbsp;already&nbsp;filled&nbsp;loops&nbsp;around&nbsp;loop&nbsp;to&nbsp;alreadyFilledArounds.</tt></dd></dl>
+ <dl><dt><a name="-addSegmentOutline"><strong>addSegmentOutline</strong></a>(isThick, outlines, pointBegin, pointEnd, width)</dt><dd><tt>Add&nbsp;a&nbsp;diamond&nbsp;or&nbsp;hexagonal&nbsp;outline&nbsp;for&nbsp;a&nbsp;line&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-getInsetChainGcode"><strong>getInsetChainGcode</strong></a>(fileName, gcodeText, insetPreferences<font color="#909090">=None</font>)</dt><dd><tt>Inset&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;text.&nbsp;&nbsp;Chain&nbsp;inset&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;carved.</tt></dd></dl>
+ <dl><dt><a name="-getInsetGcode"><strong>getInsetGcode</strong></a>(gcodeText, insetPreferences<font color="#909090">=None</font>)</dt><dd><tt>Inset&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;text.</tt></dd></dl>
+ <dl><dt><a name="-getSegmentsFromPoints"><strong>getSegmentsFromPoints</strong></a>(aroundLists, loopLists, pointBegin, pointEnd)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;beginning&nbsp;and&nbsp;end&nbsp;of&nbsp;a&nbsp;line&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-isCloseToLast"><strong>isCloseToLast</strong></a>(paths, point, radius)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;point&nbsp;is&nbsp;close&nbsp;to&nbsp;the&nbsp;last&nbsp;point&nbsp;of&nbsp;the&nbsp;last&nbsp;path.</tt></dd></dl>
+ <dl><dt><a name="-isIntersectingItself"><strong>isIntersectingItself</strong></a>(loop, width)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;itself.</tt></dd></dl>
+ <dl><dt><a name="-isIntersectingWithinList"><strong>isIntersectingWithinList</strong></a>(loop, loopList)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;or&nbsp;is&nbsp;within&nbsp;the&nbsp;loop&nbsp;list.</tt></dd></dl>
+ <dl><dt><a name="-isIntersectingWithinLists"><strong>isIntersectingWithinLists</strong></a>(loop, loopLists)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;or&nbsp;is&nbsp;within&nbsp;the&nbsp;loop&nbsp;lists.</tt></dd></dl>
+ <dl><dt><a name="-isSegmentInsideAround"><strong>isSegmentInsideAround</strong></a>(aroundLists, segment)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;segment&nbsp;is&nbsp;inside&nbsp;an&nbsp;around.</tt></dd></dl>
+ <dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;inset&nbsp;dialog.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Inset&nbsp;the&nbsp;carves&nbsp;of&nbsp;a&nbsp;gcode&nbsp;file.&nbsp;&nbsp;Chain&nbsp;carve&nbsp;the&nbsp;file&nbsp;if&nbsp;it&nbsp;is&nbsp;a&nbsp;GNU&nbsp;TriangulatedSurface&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;inset&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__date__</strong> = '$Date: 2008/28/04 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.material.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.material.html
index 959c24b7..3751fae5 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.material.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.material.html
@@ -58,7 +58,7 @@ ABS</tt></p>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;material&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="MaterialPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="MaterialPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.multiply.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.multiply.html
index 87d05bdc..35263498 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.multiply.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.multiply.html
@@ -20,8 +20,8 @@ The&nbsp;center&nbsp;of&nbsp;the&nbsp;shape&nbsp;will&nbsp;be&nbsp;moved&nbsp;to
The&nbsp;"Number&nbsp;of&nbsp;Columns"&nbsp;preference&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;columns&nbsp;in&nbsp;the&nbsp;array&nbsp;table.&nbsp;&nbsp;The&nbsp;"Number&nbsp;of&nbsp;Rows"&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;rows<br>
in&nbsp;the&nbsp;table.&nbsp;&nbsp;The&nbsp;"Separation&nbsp;over&nbsp;Extrusion&nbsp;Width"&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;separation&nbsp;between&nbsp;the&nbsp;shape&nbsp;copies&nbsp;over&nbsp;the&nbsp;extrusion&nbsp;width.<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;multiply&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;multiply.py.&nbsp;&nbsp;The&nbsp;multiply&nbsp;function&nbsp;will&nbsp;multiply&nbsp;if&nbsp;"Activate<br>
+The&nbsp;following&nbsp;examples&nbsp;multiply&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;multiply.py.&nbsp;&nbsp;The&nbsp;multiply&nbsp;function&nbsp;will&nbsp;multiply&nbsp;if&nbsp;"Activate<br>
Multiply"&nbsp;is&nbsp;true,&nbsp;which&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'multiply.csv'&nbsp;with&nbsp;a&nbsp;text&nbsp;editor&nbsp;or&nbsp;a<br>
spreadsheet&nbsp;program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getMultiplyChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has<br>
been&nbsp;multiplied,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;getFillChainGcode&nbsp;in&nbsp;fill.py&nbsp;to&nbsp;get&nbsp;filled&nbsp;gcode;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;filled&nbsp;text,&nbsp;then&nbsp;they&nbsp;multiply.<br>
@@ -29,8 +29,8 @@ been&nbsp;multiplied,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;getFillChainGcod
&nbsp;<br>
&gt;&nbsp;python&nbsp;multiply.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Multiply',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;multiplied.<br>
-The&nbsp;multiplied&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_multiply.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;multiplied.<br>
+The&nbsp;multiplied&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_multiply.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -43,13 +43,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;multiply&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;multiply.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;multiplied.<br>
-The&nbsp;multiplied&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_multiply.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;multiplied.<br>
+The&nbsp;multiplied&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_multiply.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;multiply.<a href="#-getMultiplyGcode">getMultiplyGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -58,7 +58,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;multiply.<a href="#-getMultiplyChainGcode">getMultiplyChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -77,8 +77,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.fill.html">skeinforge_tools.fill</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.material.html">skeinforge_tools.material</a><br>
<a href="math.html">math</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
@@ -106,7 +106,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;multiply&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="MultiplyPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="MultiplyPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="MultiplyPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Multiply&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -128,9 +128,9 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="MultiplySkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="MultiplySkein-getGcodeFromMovement"><strong>getGcodeFromMovement</strong></a>(self, point)</dt><dd><tt>Get&nbsp;a&nbsp;gcode&nbsp;movement.</tt></dd></dl>
+<dl><dt><a name="MultiplySkein-getGcodeFromMovementZ"><strong>getGcodeFromMovementZ</strong></a>(self, point, z)</dt><dd><tt>Get&nbsp;a&nbsp;gcode&nbsp;movement.</tt></dd></dl>
-<dl><dt><a name="MultiplySkein-getMultipliedLine"><strong>getMultipliedLine</strong></a>(self, splitLine)</dt><dd><tt>Get&nbsp;elevated&nbsp;gcode&nbsp;line&nbsp;with&nbsp;operating&nbsp;feedrate.</tt></dd></dl>
+<dl><dt><a name="MultiplySkein-getMovedLocationSetOldLocation"><strong>getMovedLocationSetOldLocation</strong></a>(self, offset, splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;moved&nbsp;location&nbsp;and&nbsp;set&nbsp;the&nbsp;old&nbsp;location.</tt></dd></dl>
<dl><dt><a name="MultiplySkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
@@ -149,11 +149,11 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getMultiplyChainGcode"><strong>getMultiplyChainGcode</strong></a>(filename, gcodeText, multiplyPreferences<font color="#909090">=None</font>)</dt><dd><tt>Multiply&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;multiply&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;multiplied.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getMultiplyChainGcode"><strong>getMultiplyChainGcode</strong></a>(fileName, gcodeText, multiplyPreferences<font color="#909090">=None</font>)</dt><dd><tt>Multiply&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;multiply&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;multiplied.</tt></dd></dl>
<dl><dt><a name="-getMultiplyGcode"><strong>getMultiplyGcode</strong></a>(gcodeText, multiplyPreferences<font color="#909090">=None</font>)</dt><dd><tt>Multiply&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;multiply&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Multiply&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;multiply&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;multiplied.<br>
-If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;multiply&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Multiply&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;multiply&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;multiplied.<br>
+If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;multiply&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.nozzle_wipe.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.nozzle_wipe.html
deleted file mode 100644
index 0e1a2894..00000000
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.nozzle_wipe.html
+++ /dev/null
@@ -1,180 +0,0 @@
-
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: module skeinforge_tools.nozzle_wipe</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.nozzle_wipe</strong></big></big> ($Date: 2008/21/04 $)</font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/nozzle_wipe.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/nozzle_wipe.py</a></font></td></tr></table>
- <p><tt>Nozzle&nbsp;wipe&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;wipe&nbsp;the&nbsp;nozzle.<br>
-&nbsp;<br>
-At&nbsp;the&nbsp;beginning&nbsp;of&nbsp;a&nbsp;layer,&nbsp;depending&nbsp;on&nbsp;the&nbsp;preferences&nbsp;nozzle,&nbsp;wipe&nbsp;will&nbsp;move&nbsp;the&nbsp;nozzle&nbsp;with&nbsp;the&nbsp;extruder&nbsp;off&nbsp;to&nbsp;the&nbsp;arrival&nbsp;point,<br>
-then&nbsp;to&nbsp;the&nbsp;wipe&nbsp;point,&nbsp;then&nbsp;to&nbsp;the&nbsp;departure&nbsp;point,&nbsp;then&nbsp;back&nbsp;to&nbsp;the&nbsp;layer.<br>
-&nbsp;<br>
-The&nbsp;default&nbsp;'Activate&nbsp;Nozzle&nbsp;Wipe'&nbsp;checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;When&nbsp;it&nbsp;is&nbsp;on,&nbsp;the&nbsp;functions&nbsp;described&nbsp;below&nbsp;will&nbsp;work,&nbsp;when&nbsp;it&nbsp;is&nbsp;off,&nbsp;the&nbsp;functions<br>
-will&nbsp;not&nbsp;be&nbsp;called.<br>
-&nbsp;<br>
-The&nbsp;"Location&nbsp;Arrival&nbsp;X"&nbsp;preference,&nbsp;is&nbsp;the&nbsp;x&nbsp;coordinate&nbsp;of&nbsp;the&nbsp;arrival&nbsp;location.&nbsp;&nbsp;The&nbsp;"Location&nbsp;Arrival&nbsp;Y"&nbsp;and&nbsp;"Location&nbsp;Arrival&nbsp;Z"<br>
-preferences&nbsp;are&nbsp;the&nbsp;y&nbsp;&amp;&nbsp;z&nbsp;coordinates&nbsp;of&nbsp;the&nbsp;location.&nbsp;&nbsp;The&nbsp;equivalent&nbsp;"Location&nbsp;Wipe.."&nbsp;and&nbsp;"Location&nbsp;Departure.."&nbsp;preferences&nbsp;are&nbsp;for<br>
-the&nbsp;wipe&nbsp;and&nbsp;departure&nbsp;locations.<br>
-&nbsp;<br>
-The&nbsp;"Nozzle&nbsp;Wipe&nbsp;Period&nbsp;(layers)"&nbsp;preference&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;layers&nbsp;between&nbsp;nozzle&nbsp;wipes.&nbsp;&nbsp;Nozzle&nbsp;wipe&nbsp;will&nbsp;always&nbsp;wipe&nbsp;just&nbsp;before<br>
-the&nbsp;first&nbsp;layer,&nbsp;afterwards&nbsp;it&nbsp;will&nbsp;wipe&nbsp;every&nbsp;"Nozzle&nbsp;Wipe&nbsp;Period"&nbsp;layers.&nbsp;&nbsp;With&nbsp;the&nbsp;default&nbsp;of&nbsp;three,&nbsp;nozzle&nbsp;wipe&nbsp;will&nbsp;wipe&nbsp;just&nbsp;before<br>
-the&nbsp;zeroth&nbsp;layer,&nbsp;the&nbsp;third&nbsp;layer,&nbsp;sixth&nbsp;layer&nbsp;and&nbsp;so&nbsp;on.<br>
-&nbsp;<br>
-To&nbsp;run&nbsp;nozzle&nbsp;wipe,&nbsp;in&nbsp;a&nbsp;shell&nbsp;which&nbsp;nozzle&nbsp;wipe&nbsp;is&nbsp;in&nbsp;type:<br>
-&gt;&nbsp;python&nbsp;nozzle_wipe.py<br>
-&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;nozzle&nbsp;wipes&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;nozzle_wipe.py.&nbsp;&nbsp;The&nbsp;nozzle&nbsp;wipe&nbsp;function&nbsp;will&nbsp;nozzle&nbsp;wipe&nbsp;if&nbsp;the<br>
-'Activate&nbsp;Nozzle&nbsp;Wipe'&nbsp;checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getNozzleWipeChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been<br>
-nozzle&nbsp;wiped,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;the&nbsp;getHopChainGcode&nbsp;in&nbsp;hop.py&nbsp;to&nbsp;hop&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;hopped&nbsp;text,&nbsp;then&nbsp;they&nbsp;nozzle&nbsp;wipe.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python&nbsp;nozzle_wipe.py<br>
-This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Nozzle&nbsp;Wipe',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;nozzle&nbsp;wiped.<br>
-The&nbsp;nozzle&nbsp;wiped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_nozzle_wipe.gcode<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python&nbsp;nozzle_wipe.py&nbsp;Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;nozzle&nbsp;wiped.<br>
-The&nbsp;nozzle&nbsp;wiped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_nozzle_wipe.gcode<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python<br>
-Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
-[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
-Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
-&gt;&gt;&gt;&nbsp;import&nbsp;nozzle_wipe<br>
-&gt;&gt;&gt;&nbsp;nozzle_wipe.<a href="#-main">main</a>()<br>
-This&nbsp;brings&nbsp;up&nbsp;the&nbsp;nozzle&nbsp;wipe&nbsp;dialog.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&gt;&gt;&nbsp;nozzle_wipe.<a href="#-writeOutput">writeOutput</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;nozzle&nbsp;wiped.<br>
-The&nbsp;nozzle&nbsp;wiped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_nozzle_wipe.gcode<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&gt;&gt;&nbsp;nozzle_wipe.<a href="#-getNozzleWipeGcode">getNozzleWipeGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
-(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
-..<br>
-many&nbsp;lines&nbsp;of&nbsp;gcode<br>
-..<br>
-")<br>
-Many&nbsp;line&nbsp;of&nbsp;nozzle&nbsp;wiped&nbsp;gcode.<br>
-&nbsp;<br>
-&gt;&gt;&gt;&nbsp;nozzle_wipe.<a href="#-getNozzleWipeChainGcode">getNozzleWipeChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
-(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
-..<br>
-many&nbsp;lines&nbsp;of&nbsp;gcode<br>
-..<br>
-")<br>
-Many&nbsp;line&nbsp;of&nbsp;nozzle&nbsp;wiped&nbsp;gcode.</tt></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
-
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
-<a href="skeinforge_tools.analyze.html">skeinforge_tools.analyze</a><br>
-<a href="cStringIO.html">cStringIO</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.hop.html">skeinforge_tools.hop</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
-<a href="math.html">math</a><br>
-<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
-<a href="sys.html">sys</a><br>
-<a href="time.html">time</a><br>
-</td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ee77aa">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
-
-<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl>
-<dt><font face="helvetica, arial"><a href="skeinforge_tools.nozzle_wipe.html#NozzleWipePreferences">NozzleWipePreferences</a>
-</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.nozzle_wipe.html#NozzleWipeSkein">NozzleWipeSkein</a>
-</font></dt></dl>
- <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="NozzleWipePreferences">class <strong>NozzleWipePreferences</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;nozzle&nbsp;wipe&nbsp;preferences.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="NozzleWipePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Nozzle&nbsp;wipe&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
-
-</td></tr></table> <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="NozzleWipeSkein">class <strong>NozzleWipeSkein</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;nozzle&nbsp;wipe&nbsp;a&nbsp;skein&nbsp;of&nbsp;extrusions.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="NozzleWipeSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="NozzleWipeSkein-addHop"><strong>addHop</strong></a>(self, begin, end)</dt><dd><tt>Add&nbsp;hop&nbsp;to&nbsp;highest&nbsp;point.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipeSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipeSkein-addWipeTravel"><strong>addWipeTravel</strong></a>(self, splitLine)</dt><dd><tt>Add&nbsp;the&nbsp;wipe&nbsp;travel&nbsp;gcode.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipeSkein-getLinearMoveWithFeedrate"><strong>getLinearMoveWithFeedrate</strong></a>(self, feedrate, location)</dt><dd><tt>Get&nbsp;a&nbsp;linear&nbsp;move&nbsp;line&nbsp;with&nbsp;the&nbsp;feedrate.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipeSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipeSkein-parseGcode"><strong>parseGcode</strong></a>(self, gcodeText, nozzleWipePreferences)</dt><dd><tt>Parse&nbsp;gcode&nbsp;text&nbsp;and&nbsp;store&nbsp;the&nbsp;nozzle&nbsp;wipe&nbsp;gcode.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipeSkein-parseInitialization"><strong>parseInitialization</strong></a>(self, nozzleWipePreferences)</dt><dd><tt>Parse&nbsp;gcode&nbsp;initialization&nbsp;and&nbsp;store&nbsp;the&nbsp;parameters.</tt></dd></dl>
-
-<dl><dt><a name="NozzleWipeSkein-parseLine"><strong>parseLine</strong></a>(self, line)</dt><dd><tt>Parse&nbsp;a&nbsp;gcode&nbsp;line&nbsp;and&nbsp;add&nbsp;it&nbsp;to&nbsp;the&nbsp;bevel&nbsp;gcode.</tt></dd></dl>
-
-</td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#eeaa77">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
-
-<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getNozzleWipeChainGcode"><strong>getNozzleWipeChainGcode</strong></a>(filename, gcodeText, nozzleWipePreferences<font color="#909090">=None</font>)</dt><dd><tt>Nozzle&nbsp;wipe&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;nozzle&nbsp;wipe&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;nozzle&nbsp;wiped.</tt></dd></dl>
- <dl><dt><a name="-getNozzleWipeGcode"><strong>getNozzleWipeGcode</strong></a>(gcodeText, nozzleWipePreferences<font color="#909090">=None</font>)</dt><dd><tt>Nozzle&nbsp;wipe&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
- <dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;nozzle&nbsp;wipe&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Nozzle&nbsp;wipe&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;nozzle&nbsp;wipe&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;nozzle&nbsp;wiped.&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;nozzle&nbsp;wipe&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
-</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#55aa55">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
-
-<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
-<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
-<strong>__license__</strong> = 'GPL 3.0'<br>
-<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#7799ee">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
-
-<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
-</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.oozebane.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.oozebane.html
index 0a5a6353..bb55aff0 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.oozebane.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.oozebane.html
@@ -24,8 +24,11 @@ the&nbsp;feedrate&nbsp;will&nbsp;be&nbsp;decreased&nbsp;and&nbsp;the&nbsp;larger
&nbsp;<br>
Oozebane&nbsp;also&nbsp;turns&nbsp;the&nbsp;extruder&nbsp;on&nbsp;just&nbsp;before&nbsp;the&nbsp;start&nbsp;of&nbsp;a&nbsp;thread.&nbsp;&nbsp;The&nbsp;"Early&nbsp;Startup&nbsp;Maximum&nbsp;Distance&nbsp;Over&nbsp;Extrusion&nbsp;Width"<br>
preference&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;maximum&nbsp;distance&nbsp;before&nbsp;the&nbsp;thread&nbsp;starts&nbsp;that&nbsp;the&nbsp;extruder&nbsp;will&nbsp;be&nbsp;turned&nbsp;off&nbsp;over&nbsp;the&nbsp;extrusion&nbsp;width,<br>
-the&nbsp;default&nbsp;is&nbsp;2.0.&nbsp;&nbsp;The&nbsp;longer&nbsp;the&nbsp;extruder&nbsp;has&nbsp;been&nbsp;off,&nbsp;the&nbsp;sooner&nbsp;the&nbsp;extruder&nbsp;will&nbsp;turn&nbsp;back&nbsp;on,&nbsp;the&nbsp;ratio&nbsp;is&nbsp;one&nbsp;minus&nbsp;one&nbsp;over&nbsp;e<br>
-to&nbsp;the&nbsp;power&nbsp;of&nbsp;the&nbsp;distance&nbsp;the&nbsp;extruder&nbsp;has&nbsp;been&nbsp;off&nbsp;over&nbsp;the&nbsp;"Early&nbsp;Startup&nbsp;Distance&nbsp;Constant&nbsp;Over&nbsp;Extrusion&nbsp;Width".<br>
+the&nbsp;default&nbsp;is&nbsp;2.0.&nbsp;&nbsp;The&nbsp;longer&nbsp;the&nbsp;extruder&nbsp;has&nbsp;been&nbsp;off,&nbsp;the&nbsp;earlier&nbsp;the&nbsp;extruder&nbsp;will&nbsp;turn&nbsp;back&nbsp;on,&nbsp;the&nbsp;ratio&nbsp;is&nbsp;one&nbsp;minus&nbsp;one&nbsp;over&nbsp;e<br>
+to&nbsp;the&nbsp;power&nbsp;of&nbsp;the&nbsp;distance&nbsp;the&nbsp;extruder&nbsp;has&nbsp;been&nbsp;off&nbsp;over&nbsp;the&nbsp;"Early&nbsp;Startup&nbsp;Distance&nbsp;Constant&nbsp;Over&nbsp;Extrusion&nbsp;Width".&nbsp;&nbsp;The&nbsp;'First<br>
+Early&nbsp;Startup&nbsp;Distance&nbsp;over&nbsp;Extrusion&nbsp;Width'&nbsp;preference&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;distance&nbsp;before&nbsp;the&nbsp;first&nbsp;thread&nbsp;starts&nbsp;that&nbsp;the&nbsp;extruder<br>
+will&nbsp;be&nbsp;turned&nbsp;off&nbsp;over&nbsp;the&nbsp;extrusion&nbsp;width.&nbsp;&nbsp;This&nbsp;value&nbsp;should&nbsp;be&nbsp;high&nbsp;because,&nbsp;according&nbsp;to&nbsp;Marius,&nbsp;the&nbsp;extruder&nbsp;takes&nbsp;a&nbsp;second&nbsp;or<br>
+two&nbsp;to&nbsp;extrude&nbsp;when&nbsp;starting&nbsp;for&nbsp;the&nbsp;first&nbsp;time,&nbsp;the&nbsp;default&nbsp;is&nbsp;forty.<br>
&nbsp;<br>
The&nbsp;"Minimum&nbsp;Distance&nbsp;for&nbsp;Early&nbsp;Startup&nbsp;over&nbsp;Extrusion&nbsp;Width"&nbsp;ratio&nbsp;is&nbsp;the&nbsp;minimum&nbsp;distance&nbsp;that&nbsp;the&nbsp;extruder&nbsp;has&nbsp;to&nbsp;be&nbsp;off&nbsp;before<br>
the&nbsp;thread&nbsp;begins&nbsp;over&nbsp;the&nbsp;extrusion&nbsp;width&nbsp;for&nbsp;the&nbsp;early&nbsp;start&nbsp;up&nbsp;feature&nbsp;to&nbsp;activate.&nbsp;&nbsp;The&nbsp;"Minimum&nbsp;Distance&nbsp;for&nbsp;Early&nbsp;Shutdown<br>
@@ -38,22 +41,22 @@ the&nbsp;thread&nbsp;will&nbsp;remain&nbsp;at&nbsp;roughly&nbsp;the&nbsp;same&nb
To&nbsp;run&nbsp;oozebane,&nbsp;in&nbsp;a&nbsp;shell&nbsp;which&nbsp;oozebane&nbsp;is&nbsp;in&nbsp;type:<br>
&gt;&nbsp;python&nbsp;oozebane.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;oozebane&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;oozebane.py.&nbsp;&nbsp;The&nbsp;oozebane&nbsp;function&nbsp;will&nbsp;oozebane&nbsp;if&nbsp;the<br>
+The&nbsp;following&nbsp;examples&nbsp;oozebane&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;oozebane.py.&nbsp;&nbsp;The&nbsp;oozebane&nbsp;function&nbsp;will&nbsp;oozebane&nbsp;if&nbsp;the<br>
'Activate&nbsp;Oozebane'&nbsp;checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getOozebaneChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been<br>
-oozebaned,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;the&nbsp;getNozzleWipeChainGcode&nbsp;in&nbsp;nozzle_wipe.py&nbsp;to&nbsp;nozzle&nbsp;wipe&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;nozzle<br>
+oozebaned,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;the&nbsp;getWipeChainGcode&nbsp;in&nbsp;wipe.py&nbsp;to&nbsp;nozzle&nbsp;wipe&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;nozzle<br>
wiped&nbsp;text,&nbsp;then&nbsp;they&nbsp;oozebane.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;oozebane.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Oozebane',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;oozebaned.<br>
-The&nbsp;oozebaned&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_oozebane.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;oozebaned.<br>
+The&nbsp;oozebaned&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_oozebane.gcode<br>
&nbsp;<br>
&nbsp;<br>
-&gt;&nbsp;python&nbsp;oozebane.py&nbsp;Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;oozebaned.<br>
-The&nbsp;oozebaned&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_oozebane.gcode<br>
+&gt;&nbsp;python&nbsp;oozebane.py&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;oozebaned.<br>
+The&nbsp;oozebaned&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_oozebane.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python<br>
@@ -66,12 +69,12 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;oozebane&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;oozebane.<a href="#-writeOutput">writeOutput</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;oozebaned.<br>
-The&nbsp;oozebaned&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_oozebane.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;oozebaned.<br>
+The&nbsp;oozebaned&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_oozebane.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;oozebane.<a href="#-getOozebaneGcode">getOozebaneGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -80,7 +83,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;oozebane.<a href="#-getOozebaneChainGcode">getOozebaneChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -98,13 +101,13 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="cStringIO.html">cStringIO</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
-<a href="skeinforge_tools.nozzle_wipe.html">skeinforge_tools.nozzle_wipe</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
-<a href="sys.html">sys</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
+</td><td width="25%" valign=top><a href="sys.html">sys</a><br>
<a href="time.html">time</a><br>
+<a href="skeinforge_tools.wipe.html">skeinforge_tools.wipe</a><br>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
@@ -126,7 +129,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;oozebane&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="OozebanePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="OozebanePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="OozebanePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Oozebane&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -148,6 +151,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="OozebaneSkein-addLineSetShutdowns"><strong>addLineSetShutdowns</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;and&nbsp;set&nbsp;the&nbsp;shutdown&nbsp;variables.</tt></dd></dl>
+<dl><dt><a name="OozebaneSkein-getActiveFeedrateRatio"><strong>getActiveFeedrateRatio</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;feedrate&nbsp;of&nbsp;the&nbsp;first&nbsp;active&nbsp;move&nbsp;over&nbsp;the&nbsp;operating&nbsp;feedrate.</tt></dd></dl>
+
<dl><dt><a name="OozebaneSkein-getAddAfterStartupLines"><strong>getAddAfterStartupLines</strong></a>(self, line)</dt><dd><tt>Get&nbsp;and&nbsp;/&nbsp;or&nbsp;add&nbsp;after&nbsp;the&nbsp;startup&nbsp;lines.</tt></dd></dl>
<dl><dt><a name="OozebaneSkein-getAddBeforeStartupLines"><strong>getAddBeforeStartupLines</strong></a>(self, line)</dt><dd><tt>Get&nbsp;and&nbsp;/&nbsp;or&nbsp;add&nbsp;before&nbsp;the&nbsp;startup&nbsp;lines.</tt></dd></dl>
@@ -207,10 +212,10 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getOozebaneChainGcode"><strong>getOozebaneChainGcode</strong></a>(filename, gcodeText, oozebanePreferences<font color="#909090">=None</font>)</dt><dd><tt>Oozebane&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;oozebane&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;oozebaned.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getOozebaneChainGcode"><strong>getOozebaneChainGcode</strong></a>(fileName, gcodeText, oozebanePreferences<font color="#909090">=None</font>)</dt><dd><tt>Oozebane&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;oozebane&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;oozebaned.</tt></dd></dl>
<dl><dt><a name="-getOozebaneGcode"><strong>getOozebaneGcode</strong></a>(gcodeText, oozebanePreferences<font color="#909090">=None</font>)</dt><dd><tt>Oozebane&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;oozebane&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Oozebane&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;oozebane&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;oozebaned.&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;oozebane&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Oozebane&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;oozebane&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;oozebaned.&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;oozebane&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.polyfile.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.polyfile.html
index a839e3eb..cd4facae 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.polyfile.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.polyfile.html
@@ -62,7 +62,7 @@ This&nbsp;returns&nbsp;true&nbsp;if&nbsp;'Execute&nbsp;All&nbsp;Unmodified&nbsp;
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;polyfile&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="PolyfilePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="PolyfilePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -71,11 +71,11 @@ This&nbsp;returns&nbsp;true&nbsp;if&nbsp;'Execute&nbsp;All&nbsp;Unmodified&nbsp;
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getFileOrDirectoryTypes"><strong>getFileOrDirectoryTypes</strong></a>(filename, fileTypes, wasCancelled)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;files&nbsp;in&nbsp;the&nbsp;directory&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;if&nbsp;directory&nbsp;preference&nbsp;is&nbsp;true.&nbsp;&nbsp;Otherwise,&nbsp;return&nbsp;the&nbsp;file&nbsp;in&nbsp;a&nbsp;list.</tt></dd></dl>
- <dl><dt><a name="-getFileOrDirectoryTypesUnmodifiedGcode"><strong>getFileOrDirectoryTypesUnmodifiedGcode</strong></a>(filename, fileTypes, wasCancelled)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;files&nbsp;in&nbsp;the&nbsp;directory&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;if&nbsp;directory&nbsp;preference&nbsp;is&nbsp;true.&nbsp;&nbsp;Otherwise,&nbsp;return&nbsp;the&nbsp;file&nbsp;in&nbsp;a&nbsp;list.</tt></dd></dl>
- <dl><dt><a name="-getFileOrGcodeDirectory"><strong>getFileOrGcodeDirectory</strong></a>(filename, wasCancelled, words<font color="#909090">=[]</font>)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;files&nbsp;in&nbsp;the&nbsp;directory&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;if&nbsp;directory&nbsp;preference&nbsp;is&nbsp;true.&nbsp;&nbsp;Otherwise,&nbsp;return&nbsp;the&nbsp;file&nbsp;in&nbsp;a&nbsp;list.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getFileOrDirectoryTypes"><strong>getFileOrDirectoryTypes</strong></a>(fileName, fileTypes, wasCancelled)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;files&nbsp;in&nbsp;the&nbsp;directory&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;if&nbsp;directory&nbsp;preference&nbsp;is&nbsp;true.&nbsp;&nbsp;Otherwise,&nbsp;return&nbsp;the&nbsp;file&nbsp;in&nbsp;a&nbsp;list.</tt></dd></dl>
+ <dl><dt><a name="-getFileOrDirectoryTypesUnmodifiedGcode"><strong>getFileOrDirectoryTypesUnmodifiedGcode</strong></a>(fileName, fileTypes, wasCancelled)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;files&nbsp;in&nbsp;the&nbsp;directory&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;if&nbsp;directory&nbsp;preference&nbsp;is&nbsp;true.&nbsp;&nbsp;Otherwise,&nbsp;return&nbsp;the&nbsp;file&nbsp;in&nbsp;a&nbsp;list.</tt></dd></dl>
+ <dl><dt><a name="-getFileOrGcodeDirectory"><strong>getFileOrGcodeDirectory</strong></a>(fileName, wasCancelled, words<font color="#909090">=[]</font>)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;files&nbsp;in&nbsp;the&nbsp;directory&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;if&nbsp;directory&nbsp;preference&nbsp;is&nbsp;true.&nbsp;&nbsp;Otherwise,&nbsp;return&nbsp;the&nbsp;file&nbsp;in&nbsp;a&nbsp;list.</tt></dd></dl>
<dl><dt><a name="-isDirectoryPreference"><strong>isDirectoryPreference</strong></a>()</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;directory&nbsp;preference&nbsp;is&nbsp;true.</tt></dd></dl>
- <dl><dt><a name="-isEmptyOrCancelled"><strong>isEmptyOrCancelled</strong></a>(filename, wasCancelled)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;filename&nbsp;is&nbsp;empty&nbsp;or&nbsp;the&nbsp;dialog&nbsp;was&nbsp;cancelled.</tt></dd></dl>
+ <dl><dt><a name="-isEmptyOrCancelled"><strong>isEmptyOrCancelled</strong></a>(fileName, wasCancelled)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;fileName&nbsp;is&nbsp;empty&nbsp;or&nbsp;the&nbsp;dialog&nbsp;was&nbsp;cancelled.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;file&nbsp;or&nbsp;directory&nbsp;dialog.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.raft.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.raft.html
index 657d1b87..46e2ac10 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.raft.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.raft.html
@@ -33,14 +33,14 @@ those&nbsp;will&nbsp;be&nbsp;in&nbsp;the&nbsp;raft&nbsp;dialog.&nbsp;&nbsp;If&nb
will&nbsp;have&nbsp;to&nbsp;set&nbsp;new&nbsp;preferences&nbsp;for&nbsp;the&nbsp;new&nbsp;material.<br>
&nbsp;<br>
The&nbsp;"Base&nbsp;Infill&nbsp;Density"&nbsp;preference&nbsp;is&nbsp;the&nbsp;infill&nbsp;density&nbsp;ratio&nbsp;of&nbsp;the&nbsp;base&nbsp;of&nbsp;the&nbsp;raft,&nbsp;the&nbsp;default&nbsp;ratio&nbsp;is&nbsp;half.&nbsp;&nbsp;The&nbsp;"Base&nbsp;Layer<br>
-Height&nbsp;over&nbsp;Extrusion&nbsp;Height"&nbsp;preference&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;height&nbsp;&amp;&nbsp;width&nbsp;of&nbsp;the&nbsp;base&nbsp;layer&nbsp;compared&nbsp;to&nbsp;the&nbsp;height&nbsp;and&nbsp;width<br>
+Height&nbsp;over&nbsp;Layer&nbsp;Thickness"&nbsp;preference&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;height&nbsp;&amp;&nbsp;width&nbsp;of&nbsp;the&nbsp;base&nbsp;layer&nbsp;compared&nbsp;to&nbsp;the&nbsp;height&nbsp;and&nbsp;width<br>
of&nbsp;the&nbsp;shape&nbsp;infill,&nbsp;the&nbsp;default&nbsp;is&nbsp;two.&nbsp;&nbsp;The&nbsp;feedrate&nbsp;will&nbsp;be&nbsp;slower&nbsp;for&nbsp;raft&nbsp;layers&nbsp;which&nbsp;have&nbsp;thicker&nbsp;extrusions&nbsp;than&nbsp;the&nbsp;shape<br>
infill.&nbsp;&nbsp;The&nbsp;"Base&nbsp;Layers"&nbsp;preference&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;base&nbsp;layers,&nbsp;the&nbsp;default&nbsp;is&nbsp;one.&nbsp;&nbsp;The&nbsp;"Base&nbsp;Nozzle&nbsp;Lift&nbsp;over&nbsp;Half&nbsp;Base<br>
-Extrusion&nbsp;Height"&nbsp;is&nbsp;the&nbsp;amount&nbsp;the&nbsp;nozzle&nbsp;is&nbsp;above&nbsp;the&nbsp;center&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;divided&nbsp;by&nbsp;half&nbsp;the&nbsp;base&nbsp;extrusion&nbsp;height.<br>
+Layer&nbsp;Thickness"&nbsp;is&nbsp;the&nbsp;amount&nbsp;the&nbsp;nozzle&nbsp;is&nbsp;above&nbsp;the&nbsp;center&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;divided&nbsp;by&nbsp;half&nbsp;the&nbsp;base&nbsp;layer&nbsp;thickness.<br>
&nbsp;<br>
-The&nbsp;interface&nbsp;of&nbsp;the&nbsp;raft&nbsp;has&nbsp;equivalent&nbsp;preferences&nbsp;called&nbsp;"Interface&nbsp;Infill&nbsp;Density",&nbsp;"Interface&nbsp;Layer&nbsp;Height&nbsp;over&nbsp;Extrusion<br>
-Height",&nbsp;"Interface&nbsp;Layers"&nbsp;and&nbsp;"Interface&nbsp;Nozzle&nbsp;Lift&nbsp;over&nbsp;Half&nbsp;Base&nbsp;Extrusion&nbsp;Height".&nbsp;&nbsp;The&nbsp;shape&nbsp;has&nbsp;the&nbsp;equivalent<br>
-preference&nbsp;of&nbsp;called&nbsp;"Operating&nbsp;Nozzle&nbsp;Lift&nbsp;over&nbsp;Half&nbsp;Extrusion&nbsp;Height".<br>
+The&nbsp;interface&nbsp;of&nbsp;the&nbsp;raft&nbsp;has&nbsp;equivalent&nbsp;preferences&nbsp;called&nbsp;"Interface&nbsp;Infill&nbsp;Density",&nbsp;"Interface&nbsp;Layer&nbsp;Thickness&nbsp;over&nbsp;Extrusion<br>
+Height",&nbsp;"Interface&nbsp;Layers"&nbsp;and&nbsp;"Interface&nbsp;Nozzle&nbsp;Lift&nbsp;over&nbsp;Half&nbsp;Base&nbsp;Layer&nbsp;Thickness".&nbsp;&nbsp;The&nbsp;shape&nbsp;has&nbsp;the&nbsp;equivalent<br>
+preference&nbsp;of&nbsp;called&nbsp;"Operating&nbsp;Nozzle&nbsp;Lift&nbsp;over&nbsp;Half&nbsp;Layer&nbsp;Thickness".<br>
&nbsp;<br>
The&nbsp;altitude&nbsp;that&nbsp;the&nbsp;bottom&nbsp;of&nbsp;the&nbsp;raft&nbsp;will&nbsp;be&nbsp;set&nbsp;to&nbsp;the&nbsp;"Bottom&nbsp;Altitude"&nbsp;preference.<br>
&nbsp;<br>
@@ -73,12 +73,8 @@ preference&nbsp;sets&nbsp;the&nbsp;temperature&nbsp;of&nbsp;the&nbsp;next&nbsp;l
temperature&nbsp;of&nbsp;the&nbsp;support&nbsp;layer.&nbsp;&nbsp;The&nbsp;"Temperature&nbsp;of&nbsp;Supported&nbsp;Layers"&nbsp;preference&nbsp;sets&nbsp;the&nbsp;temperature&nbsp;of&nbsp;the&nbsp;layer&nbsp;of&nbsp;the<br>
shape&nbsp;above&nbsp;the&nbsp;support&nbsp;layer.<br>
&nbsp;<br>
-If&nbsp;the&nbsp;"Turn&nbsp;Extruder&nbsp;On&nbsp;Early"&nbsp;checkbox&nbsp;is&nbsp;checked,&nbsp;the&nbsp;extruder&nbsp;will&nbsp;be&nbsp;turned&nbsp;on&nbsp;before&nbsp;the&nbsp;first&nbsp;layer&nbsp;is&nbsp;extruded.&nbsp;&nbsp;Now&nbsp;that<br>
-oozebane&nbsp;turns&nbsp;on&nbsp;the&nbsp;extruder&nbsp;just&nbsp;before&nbsp;a&nbsp;thread&nbsp;begins,&nbsp;the&nbsp;"Turn&nbsp;Extruder&nbsp;On&nbsp;Early"&nbsp;option&nbsp;is&nbsp;probably&nbsp;not&nbsp;necesary&nbsp;so&nbsp;the<br>
-default&nbsp;is&nbsp;now&nbsp;off.<br>
-&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;raft&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
-which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;raft.py.&nbsp;&nbsp;The&nbsp;raft&nbsp;function&nbsp;will&nbsp;raft&nbsp;if&nbsp;"Activate&nbsp;Raft,&nbsp;Elevate&nbsp;Nozzle,<br>
+The&nbsp;following&nbsp;examples&nbsp;raft&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
+which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;raft.py.&nbsp;&nbsp;The&nbsp;raft&nbsp;function&nbsp;will&nbsp;raft&nbsp;if&nbsp;"Activate&nbsp;Raft,&nbsp;Elevate&nbsp;Nozzle,<br>
Orbit&nbsp;and&nbsp;Set&nbsp;Altitude"&nbsp;is&nbsp;true,&nbsp;which&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'raft.csv'&nbsp;with&nbsp;a&nbsp;text&nbsp;editor&nbsp;or&nbsp;a<br>
spreadsheet&nbsp;program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getRaftChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has<br>
been&nbsp;rafted,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;getSpeedChainGcode&nbsp;in&nbsp;speed.py&nbsp;to&nbsp;get&nbsp;speeded&nbsp;gcode;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;speeded&nbsp;text,&nbsp;then<br>
@@ -88,8 +84,8 @@ they&nbsp;raft.&nbsp;&nbsp;Pictures&nbsp;of&nbsp;rafting&nbsp;in&nbsp;action&nbs
&nbsp;<br>
&gt;&nbsp;python&nbsp;raft.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Raft',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;rafted.<br>
-The&nbsp;rafted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_raft.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;rafted.<br>
+The&nbsp;rafted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_raft.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -102,13 +98,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;raft&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;raft.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;rafted.<br>
-The&nbsp;rafted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_raft.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;rafted.<br>
+The&nbsp;rafted&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_raft.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;raft.<a href="#-getRaftGcode">getRaftGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -117,7 +113,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;raft.<a href="#-getRaftChainGcode">getRaftChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -135,8 +131,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="cStringIO.html">cStringIO</a><br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
<a href="skeinforge_tools.material.html">skeinforge_tools.material</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
@@ -165,7 +161,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;raft&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="RaftPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="RaftPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="RaftPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Raft&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -183,33 +179,33 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="RaftSkein-addBaseLayer"><strong>addBaseLayer</strong></a>(self, baseExtrusionWidth, baseStep, stepBegin, stepEnd)</dt><dd><tt>Add&nbsp;a&nbsp;base&nbsp;layer.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-addGcodeFromFeedrateMovement"><strong>addGcodeFromFeedrateMovement</strong></a>(self, feedrateMinute, point)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-addGcodeFromFeedrateMovementZ"><strong>addGcodeFromFeedrateMovementZ</strong></a>(self, feedrateMinute, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-addGcodeFromFeedrateThread"><strong>addGcodeFromFeedrateThread</strong></a>(self, feedrateMinute, thread)</dt><dd><tt>Add&nbsp;a&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-addGcodeFromFeedrateThreadZ"><strong>addGcodeFromFeedrateThreadZ</strong></a>(self, feedrateMinute, thread, z)</dt><dd><tt>Add&nbsp;a&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="RaftSkein-addInterfaceLayer"><strong>addInterfaceLayer</strong></a>(self)</dt><dd><tt>Add&nbsp;an&nbsp;interface&nbsp;layer.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-addLayerFromSegments"><strong>addLayerFromSegments</strong></a>(self, feedrateMinute, layerExtrusionHeight, segments, zCenter)</dt><dd><tt>Add&nbsp;a&nbsp;layer&nbsp;from&nbsp;segments&nbsp;and&nbsp;raise&nbsp;the&nbsp;extrusion&nbsp;top.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-addLayerFromSegments"><strong>addLayerFromSegments</strong></a>(self, feedrateMinute, layerLayerThickness, segments, zCenter, z)</dt><dd><tt>Add&nbsp;a&nbsp;layer&nbsp;from&nbsp;segments&nbsp;and&nbsp;raise&nbsp;the&nbsp;extrusion&nbsp;top.</tt></dd></dl>
<dl><dt><a name="RaftSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="RaftSkein-addRaft"><strong>addRaft</strong></a>(self)</dt></dl>
-<dl><dt><a name="RaftSkein-addSupportLayerTable"><strong>addSupportLayerTable</strong></a>(self, layerIndex)</dt><dd><tt>Add&nbsp;support&nbsp;segments&nbsp;from&nbsp;the&nbsp;boundary&nbsp;layers.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-addSupportLayerTemperature"><strong>addSupportLayerTemperature</strong></a>(self, supportSegments, z)</dt><dd><tt>Add&nbsp;support&nbsp;layer&nbsp;and&nbsp;temperature&nbsp;before&nbsp;the&nbsp;object&nbsp;layer.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-addSupportLayerTemperature"><strong>addSupportLayerTemperature</strong></a>(self, segments)</dt><dd><tt>Add&nbsp;support&nbsp;layer&nbsp;and&nbsp;temperature&nbsp;before&nbsp;the&nbsp;object&nbsp;layer.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-addSupportSegmentTable"><strong>addSupportSegmentTable</strong></a>(self, layerIndex)</dt><dd><tt>Add&nbsp;support&nbsp;segments&nbsp;from&nbsp;the&nbsp;boundary&nbsp;layers.</tt></dd></dl>
<dl><dt><a name="RaftSkein-addTemperature"><strong>addTemperature</strong></a>(self, temperature)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;temperature.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-addTemperatureOrbits"><strong>addTemperatureOrbits</strong></a>(self, segments, temperaturePreference, temperatureTimeChangePreference)</dt><dd><tt>Add&nbsp;the&nbsp;temperature&nbsp;and&nbsp;orbits&nbsp;around&nbsp;the&nbsp;support&nbsp;layer.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-addTemperatureOrbits"><strong>addTemperatureOrbits</strong></a>(self, segments, temperaturePreference, temperatureTimeChangePreference, z)</dt><dd><tt>Add&nbsp;the&nbsp;temperature&nbsp;and&nbsp;orbits&nbsp;around&nbsp;the&nbsp;support&nbsp;layer.</tt></dd></dl>
<dl><dt><a name="RaftSkein-addToFillXIntersectionIndexTables"><strong>addToFillXIntersectionIndexTables</strong></a>(self, fillXIntersectionIndexTables, layerIndex)</dt><dd><tt>Add&nbsp;fill&nbsp;segments&nbsp;from&nbsp;the&nbsp;boundary&nbsp;layers.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-extendSegments"><strong>extendSegments</strong></a>(self, supportLayerTable)</dt><dd><tt>Extend&nbsp;the&nbsp;support&nbsp;segments.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-extendSegments"><strong>extendSegments</strong></a>(self, supportSegmentTable)</dt><dd><tt>Extend&nbsp;the&nbsp;support&nbsp;segments.</tt></dd></dl>
<dl><dt><a name="RaftSkein-getBoundaryLine"><strong>getBoundaryLine</strong></a>(self, splitLine)</dt><dd><tt>Get&nbsp;elevated&nbsp;boundary&nbsp;gcode&nbsp;line.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-getGcodeFromFeedrateMovement"><strong>getGcodeFromFeedrateMovement</strong></a>(self, feedrateMinute, point)</dt><dd><tt>Get&nbsp;a&nbsp;gcode&nbsp;movement.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-getGcodeFromFeedrateMovementZ"><strong>getGcodeFromFeedrateMovementZ</strong></a>(self, feedrateMinute, point, z)</dt><dd><tt>Get&nbsp;a&nbsp;gcode&nbsp;movement.</tt></dd></dl>
<dl><dt><a name="RaftSkein-getRaftedLine"><strong>getRaftedLine</strong></a>(self, splitLine)</dt><dd><tt>Get&nbsp;elevated&nbsp;gcode&nbsp;line&nbsp;with&nbsp;operating&nbsp;feedrate.</tt></dd></dl>
@@ -217,9 +213,9 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="RaftSkein-getStepsUntilEnd"><strong>getStepsUntilEnd</strong></a>(self, begin, end, stepSize)</dt><dd><tt>Get&nbsp;steps&nbsp;from&nbsp;the&nbsp;beginning&nbsp;until&nbsp;the&nbsp;end.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-getSupportLayerSegments"><strong>getSupportLayerSegments</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;support&nbsp;layer&nbsp;segments.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-getSupportSegments"><strong>getSupportSegments</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;support&nbsp;layer&nbsp;segments.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-joinSegments"><strong>joinSegments</strong></a>(self, supportLayerTableIndex)</dt><dd><tt>Join&nbsp;the&nbsp;support&nbsp;segments&nbsp;of&nbsp;this&nbsp;layer&nbsp;with&nbsp;those&nbsp;of&nbsp;the&nbsp;layer&nbsp;above.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-joinSegments"><strong>joinSegments</strong></a>(self, supportSegmentTableIndex)</dt><dd><tt>Join&nbsp;the&nbsp;support&nbsp;segments&nbsp;of&nbsp;this&nbsp;layer&nbsp;with&nbsp;those&nbsp;of&nbsp;the&nbsp;layer&nbsp;above.</tt></dd></dl>
<dl><dt><a name="RaftSkein-parseGcode"><strong>parseGcode</strong></a>(self, gcodeText, raftPreferences)</dt><dd><tt>Parse&nbsp;gcode&nbsp;text&nbsp;and&nbsp;store&nbsp;the&nbsp;raft&nbsp;gcode.</tt></dd></dl>
@@ -233,9 +229,9 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="RaftSkein-setInterfaceVariables"><strong>setInterfaceVariables</strong></a>(self, interfaceExtrusionWidth, stepBegin, stepEnd)</dt><dd><tt>Set&nbsp;the&nbsp;interface&nbsp;variables.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-subtractJoinedFill"><strong>subtractJoinedFill</strong></a>(self, fillXIntersectionIndexTables, supportLayerTableIndex)</dt><dd><tt>Join&nbsp;the&nbsp;fill&nbsp;then&nbsp;subtract&nbsp;it&nbsp;from&nbsp;the&nbsp;support&nbsp;layer&nbsp;table.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-subtractJoinedFill"><strong>subtractJoinedFill</strong></a>(self, fillXIntersectionIndexTables, supportSegmentTableIndex)</dt><dd><tt>Join&nbsp;the&nbsp;fill&nbsp;then&nbsp;subtract&nbsp;it&nbsp;from&nbsp;the&nbsp;support&nbsp;layer&nbsp;table.</tt></dd></dl>
-<dl><dt><a name="RaftSkein-truncateSupportLayerTables"><strong>truncateSupportLayerTables</strong></a>(self)</dt><dd><tt>Truncate&nbsp;the&nbsp;support&nbsp;segments&nbsp;after&nbsp;the&nbsp;last&nbsp;support&nbsp;segment&nbsp;which&nbsp;contains&nbsp;elements.</tt></dd></dl>
+<dl><dt><a name="RaftSkein-truncateSupportSegmentTables"><strong>truncateSupportSegmentTables</strong></a>(self)</dt><dd><tt>Truncate&nbsp;the&nbsp;support&nbsp;segments&nbsp;after&nbsp;the&nbsp;last&nbsp;support&nbsp;segment&nbsp;which&nbsp;contains&nbsp;elements.</tt></dd></dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -249,16 +245,16 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="-getEndpointsFromSegments"><strong>getEndpointsFromSegments</strong></a>(segments)</dt><dd><tt>Get&nbsp;the&nbsp;endpoints&nbsp;from&nbsp;the&nbsp;segments.</tt></dd></dl>
<dl><dt><a name="-getExtendedLineSegment"><strong>getExtendedLineSegment</strong></a>(extensionDistance, lineSegment)</dt><dd><tt>Add&nbsp;shortened&nbsp;line&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-getFillXIntersectionIndexes"><strong>getFillXIntersectionIndexes</strong></a>(fillLoops, y)</dt><dd><tt>Get&nbsp;fill&nbsp;x&nbsp;intersection&nbsp;indexes&nbsp;inside&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getHorizontalSegments"><strong>getHorizontalSegments</strong></a>(fillLoops, alreadyFilledArounds, y, z)</dt><dd><tt>Get&nbsp;horizontal&nbsp;segments&nbsp;inside&nbsp;loops.</tt></dd></dl>
+ <dl><dt><a name="-getHorizontalSegments"><strong>getHorizontalSegments</strong></a>(fillLoops, alreadyFilledArounds, y)</dt><dd><tt>Get&nbsp;horizontal&nbsp;segments&nbsp;inside&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-getJoinOfXIntersectionIndexes"><strong>getJoinOfXIntersectionIndexes</strong></a>(xIntersectionIndexList)</dt><dd><tt>Get&nbsp;x&nbsp;intersections&nbsp;from&nbsp;surrounding&nbsp;layers.</tt></dd></dl>
- <dl><dt><a name="-getRaftChainGcode"><strong>getRaftChainGcode</strong></a>(filename, gcodeText, raftPreferences<font color="#909090">=None</font>)</dt><dd><tt>Raft&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;raft&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;rafted.</tt></dd></dl>
+ <dl><dt><a name="-getRaftChainGcode"><strong>getRaftChainGcode</strong></a>(fileName, gcodeText, raftPreferences<font color="#909090">=None</font>)</dt><dd><tt>Raft&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;raft&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;rafted.</tt></dd></dl>
<dl><dt><a name="-getRaftGcode"><strong>getRaftGcode</strong></a>(gcodeText, raftPreferences<font color="#909090">=None</font>)</dt><dd><tt>Raft&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
- <dl><dt><a name="-getSquareLoop"><strong>getSquareLoop</strong></a>(beginComplex, endComplex, z)</dt><dd><tt>Get&nbsp;a&nbsp;square&nbsp;loop&nbsp;from&nbsp;the&nbsp;beginning&nbsp;to&nbsp;the&nbsp;end&nbsp;and&nbsp;back.</tt></dd></dl>
- <dl><dt><a name="-joinSegmentTables"><strong>joinSegmentTables</strong></a>(fromTable, intoTable, z)</dt><dd><tt>Join&nbsp;both&nbsp;segment&nbsp;tables&nbsp;and&nbsp;put&nbsp;the&nbsp;join&nbsp;into&nbsp;the&nbsp;intoTable.</tt></dd></dl>
+ <dl><dt><a name="-getSquareLoop"><strong>getSquareLoop</strong></a>(beginComplex, endComplex)</dt><dd><tt>Get&nbsp;a&nbsp;square&nbsp;loop&nbsp;from&nbsp;the&nbsp;beginning&nbsp;to&nbsp;the&nbsp;end&nbsp;and&nbsp;back.</tt></dd></dl>
+ <dl><dt><a name="-joinSegmentTables"><strong>joinSegmentTables</strong></a>(fromTable, intoTable)</dt><dd><tt>Join&nbsp;both&nbsp;segment&nbsp;tables&nbsp;and&nbsp;put&nbsp;the&nbsp;join&nbsp;into&nbsp;the&nbsp;intoTable.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;raft&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-subtractFill"><strong>subtractFill</strong></a>(fillXIntersectionIndexTable, supportLayerTable)</dt><dd><tt>Subtract&nbsp;fill&nbsp;from&nbsp;the&nbsp;support&nbsp;layer&nbsp;table.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Raft&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;raft&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;rafted.<br>
-If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;raft&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-subtractFill"><strong>subtractFill</strong></a>(fillXIntersectionIndexTable, supportSegmentLayerTable)</dt><dd><tt>Subtract&nbsp;fill&nbsp;from&nbsp;the&nbsp;support&nbsp;layer&nbsp;table.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Raft&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;raft&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;rafted.<br>
+If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;raft&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.euclidean.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.euclidean.html
index fdba82f6..09034db4 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.euclidean.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.euclidean.html
@@ -9,25 +9,22 @@
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.skeinforge_utilities.html"><font color="#ffffff">skeinforge_utilities</font></a>.euclidean</strong></big></big> ($Date: 2008/21/04 $)</font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/euclidean.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/euclidean.py</a></font></td></tr></table>
- <p><tt>Euclidean&nbsp;is&nbsp;a&nbsp;collection&nbsp;of&nbsp;python&nbsp;utilities&nbsp;for&nbsp;complex&nbsp;numbers,&nbsp;paths,&nbsp;polygons&nbsp;&amp;&nbsp;Vec3s.<br>
+ <p><tt>Euclidean&nbsp;is&nbsp;a&nbsp;collection&nbsp;of&nbsp;python&nbsp;utilities&nbsp;for&nbsp;complex&nbsp;numbers,&nbsp;paths,&nbsp;polygons&nbsp;&amp;&nbsp;Vector3s.<br>
&nbsp;<br>
To&nbsp;use&nbsp;euclidean,&nbsp;install&nbsp;python&nbsp;2.x&nbsp;on&nbsp;your&nbsp;machine,&nbsp;which&nbsp;is&nbsp;avaliable&nbsp;from&nbsp;<a href="http://www.python.org/download/">http://www.python.org/download/</a><br>
&nbsp;<br>
Then&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;euclidean&nbsp;is&nbsp;in,&nbsp;type&nbsp;'python'&nbsp;in&nbsp;a&nbsp;shell&nbsp;to&nbsp;run&nbsp;the&nbsp;python&nbsp;interpreter.&nbsp;&nbsp;Finally&nbsp;type<br>
-'import&nbsp;euclidean'&nbsp;to&nbsp;import&nbsp;these&nbsp;utilities&nbsp;and&nbsp;'from&nbsp;vec3&nbsp;import&nbsp;Vec3'&nbsp;to&nbsp;import&nbsp;the&nbsp;Vec3&nbsp;class.<br>
+'import&nbsp;euclidean'&nbsp;to&nbsp;import&nbsp;these&nbsp;utilities&nbsp;and&nbsp;'from&nbsp;vector3&nbsp;import&nbsp;Vector3'&nbsp;to&nbsp;import&nbsp;the&nbsp;Vector3&nbsp;class.<br>
&nbsp;<br>
&nbsp;<br>
Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;euclidean&nbsp;use.<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;from&nbsp;euclidean&nbsp;import&nbsp;*<br>
-&gt;&gt;&gt;&nbsp;from&nbsp;vec3&nbsp;import&nbsp;Vec3<br>
-&gt;&gt;&gt;&nbsp;origin=Vec3()<br>
-&gt;&gt;&gt;&nbsp;right=Vec3(1.0,0.0,0.0)<br>
-&gt;&gt;&gt;&nbsp;back=Vec3(0.0,1.0,0.0)<br>
-&gt;&gt;&gt;&nbsp;<a href="#-getAngleAroundZAxisDifference">getAngleAroundZAxisDifference</a>(back,&nbsp;right)<br>
-1.5707963267948966<br>
-&gt;&gt;&gt;&nbsp;<a href="#-getPointMaximum">getPointMaximum</a>(right,back)<br>
-1.0,&nbsp;1.0,&nbsp;0.0<br>
+&gt;&gt;&gt;&nbsp;origin=complex()<br>
+&gt;&gt;&gt;&nbsp;right=complex(1.0,0.0)<br>
+&gt;&gt;&gt;&nbsp;back=complex(0.0,1.0)<br>
+&gt;&gt;&gt;&nbsp;<a href="#-getMaximum">getMaximum</a>(right,back)<br>
+1.0,&nbsp;1.0<br>
&gt;&gt;&gt;&nbsp;polygon=[origin,&nbsp;right,&nbsp;back]<br>
&gt;&gt;&gt;&nbsp;<a href="#-getPolygonLength">getPolygonLength</a>(polygon)<br>
3.4142135623730949<br>
@@ -50,9 +47,11 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;euclidean&nbsp;use.<br>
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
-<dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#Endpoint">Endpoint</a>
-</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#EndpointComplex">EndpointComplex</a>
+<dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#DistanceIndex">DistanceIndex</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#Endpoint">Endpoint</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#LoopLayer">LoopLayer</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#PathZ">PathZ</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#RotatedLoopLayer">RotatedLoopLayer</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#SurroundingLoop">SurroundingLoop</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.euclidean.html#XIntersectionIndex">XIntersectionIndex</a>
</font></dt></dl>
@@ -60,6 +59,20 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;euclidean&nbsp;use.<br>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="DistanceIndex">class <strong>DistanceIndex</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;hold&nbsp;the&nbsp;distance&nbsp;and&nbsp;the&nbsp;index&nbsp;of&nbsp;the&nbsp;loop.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="DistanceIndex-__init__"><strong>__init__</strong></a>(self, distance, index)</dt></dl>
+
+<dl><dt><a name="DistanceIndex-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;distance&nbsp;index.</tt></dd></dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="Endpoint">class <strong>Endpoint</strong></a></font></td></tr>
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
@@ -80,21 +93,15 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;euclidean&nbsp;use.<br>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="EndpointComplex">class <strong>EndpointComplex</strong></a></font></td></tr>
+<font color="#000000" face="helvetica, arial"><a name="LoopLayer">class <strong>LoopLayer</strong></a></font></td></tr>
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>The&nbsp;endpoint&nbsp;of&nbsp;a&nbsp;segment.<br>&nbsp;</tt></td></tr>
+<td colspan=2><tt>Loops&nbsp;with&nbsp;a&nbsp;z.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="EndpointComplex-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#Endpoint">Endpoint</a>.</tt></dd></dl>
-
-<dl><dt><a name="EndpointComplex-getFromOtherPoint"><strong>getFromOtherPoint</strong></a>(self, otherEndpoint, point)</dt><dd><tt>Initialize&nbsp;from&nbsp;other&nbsp;endpoint.</tt></dd></dl>
-
-<dl><dt><a name="EndpointComplex-getHop"><strong>getHop</strong></a>(self, fillInset, path)</dt><dd><tt>Get&nbsp;a&nbsp;hop&nbsp;away&nbsp;from&nbsp;the&nbsp;endpoint&nbsp;if&nbsp;the&nbsp;other&nbsp;endpoint&nbsp;is&nbsp;doubling&nbsp;back.</tt></dd></dl>
-
-<dl><dt><a name="EndpointComplex-getNearestEndpoint"><strong>getNearestEndpoint</strong></a>(self, endpoints)</dt><dd><tt>Get&nbsp;nearest&nbsp;endpoint.</tt></dd></dl>
+<dl><dt><a name="LoopLayer-__init__"><strong>__init__</strong></a>(self, z)</dt></dl>
-<dl><dt><a name="EndpointComplex-getNearestMiss"><strong>getNearestMiss</strong></a>(self, endpoints, path, pixelTable, width)</dt><dd><tt>Get&nbsp;the&nbsp;nearest&nbsp;endpoint&nbsp;which&nbsp;the&nbsp;segment&nbsp;to&nbsp;that&nbsp;endpoint&nbsp;misses&nbsp;the&nbsp;other&nbsp;extrusions.</tt></dd></dl>
+<dl><dt><a name="LoopLayer-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;loop&nbsp;layer.</tt></dd></dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -106,11 +113,23 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;euclidean&nbsp;use.<br>
<td colspan=2><tt>Complex&nbsp;path&nbsp;with&nbsp;a&nbsp;z.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="PathZ-__init__"><strong>__init__</strong></a>(self, path, z)</dt></dl>
+<dl><dt><a name="PathZ-__init__"><strong>__init__</strong></a>(self, z)</dt></dl>
-<dl><dt><a name="PathZ-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;flat&nbsp;path.</tt></dd></dl>
+<dl><dt><a name="PathZ-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;path&nbsp;z.</tt></dd></dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="RotatedLoopLayer">class <strong>RotatedLoopLayer</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;rotated&nbsp;layer.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="RotatedLoopLayer-__init__"><strong>__init__</strong></a>(self, z)</dt></dl>
-<dl><dt><a name="PathZ-getPath"><strong>getPath</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;Vec3&nbsp;path.</tt></dd></dl>
+<dl><dt><a name="RotatedLoopLayer-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;rotated&nbsp;loop&nbsp;layer.</tt></dd></dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -126,6 +145,10 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;euclidean&nbsp;use.<br>
<dl><dt><a name="SurroundingLoop-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;surrounding&nbsp;loop.</tt></dd></dl>
+<dl><dt><a name="SurroundingLoop-addToBoundary"><strong>addToBoundary</strong></a>(self, vector3)</dt><dd><tt>Add&nbsp;vector3&nbsp;to&nbsp;boundary.</tt></dd></dl>
+
+<dl><dt><a name="SurroundingLoop-addToLoop"><strong>addToLoop</strong></a>(self, vector3)</dt><dd><tt>Add&nbsp;vector3&nbsp;to&nbsp;loop.</tt></dd></dl>
+
<dl><dt><a name="SurroundingLoop-addToThreads"><strong>addToThreads</strong></a>(self, oldOrderedLocation, skein)</dt><dd><tt>Add&nbsp;to&nbsp;paths&nbsp;from&nbsp;the&nbsp;last&nbsp;location.</tt></dd></dl>
<dl><dt><a name="SurroundingLoop-getFillLoops"><strong>getFillLoops</strong></a>(self)</dt><dd><tt>Get&nbsp;last&nbsp;fill&nbsp;loops&nbsp;from&nbsp;the&nbsp;outside&nbsp;loop&nbsp;and&nbsp;the&nbsp;loops&nbsp;inside&nbsp;the&nbsp;inside&nbsp;loops.</tt></dd></dl>
@@ -167,157 +190,101 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;euclidean&nbsp;use.<br>
<dl><dt><a name="-addPixelToPixelTableWithSteepness"><strong>addPixelToPixelTableWithSteepness</strong></a>(isSteep, pixelTable, x, y)</dt><dd><tt>Add&nbsp;pixels&nbsp;to&nbsp;the&nbsp;pixel&nbsp;table&nbsp;with&nbsp;steepness.</tt></dd></dl>
<dl><dt><a name="-addPointToPath"><strong>addPointToPath</strong></a>(path, pixelTable, point, width)</dt><dd><tt>Add&nbsp;a&nbsp;point&nbsp;to&nbsp;a&nbsp;path&nbsp;and&nbsp;the&nbsp;pixel&nbsp;table.</tt></dd></dl>
<dl><dt><a name="-addSegmentToPixelTable"><strong>addSegmentToPixelTable</strong></a>(beginComplex, endComplex, pixelTable, shortenDistanceBegin, shortenDistanceEnd, width)</dt><dd><tt>Add&nbsp;line&nbsp;segment&nbsp;to&nbsp;the&nbsp;pixel&nbsp;table.</tt></dd></dl>
- <dl><dt><a name="-addSurroundingLoopBeginning"><strong>addSurroundingLoopBeginning</strong></a>(loop, skein)</dt><dd><tt>Add&nbsp;surrounding&nbsp;loop&nbsp;beginning&nbsp;to&nbsp;gcode&nbsp;output.</tt></dd></dl>
- <dl><dt><a name="-addSurroundingLoopComplexBeginning"><strong>addSurroundingLoopComplexBeginning</strong></a>(loop, skein, z)</dt><dd><tt>Add&nbsp;surrounding&nbsp;loop&nbsp;beginning&nbsp;to&nbsp;gcode&nbsp;output.</tt></dd></dl>
- <dl><dt><a name="-addToThreadsFromLoop"><strong>addToThreadsFromLoop</strong></a>(extrusionHalfWidthSquared, gcodeType, loop, oldOrderedLocation, skein)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-addSurroundingLoopBeginning"><strong>addSurroundingLoopBeginning</strong></a>(loop, skein, z)</dt><dd><tt>Add&nbsp;surrounding&nbsp;loop&nbsp;beginning&nbsp;to&nbsp;gcode&nbsp;output.</tt></dd></dl>
+ <dl><dt><a name="-addToThreadsFromLoop"><strong>addToThreadsFromLoop</strong></a>(extrusionHalfWidth, gcodeType, loop, oldOrderedLocation, skein)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-addToThreadsRemoveFromSurroundings"><strong>addToThreadsRemoveFromSurroundings</strong></a>(oldOrderedLocation, surroundingLoops, skein)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-addXIntersectionIndexes"><strong>addXIntersectionIndexes</strong></a>(loop, solidIndex, xIntersectionIndexList, y)</dt><dd><tt>Add&nbsp;the&nbsp;x&nbsp;intersections&nbsp;for&nbsp;a&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-addXIntersectionIndexesFromComplexes"><strong>addXIntersectionIndexesFromComplexes</strong></a>(loop, solidIndex, xIntersectionIndexList, y)</dt><dd><tt>Add&nbsp;the&nbsp;x&nbsp;intersections&nbsp;for&nbsp;a&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-addXIntersectionIndexesFromLoopListComplexes"><strong>addXIntersectionIndexesFromLoopListComplexes</strong></a>(loopLists, xIntersectionIndexList, y)</dt><dd><tt>Add&nbsp;the&nbsp;x&nbsp;intersections&nbsp;for&nbsp;the&nbsp;loop&nbsp;lists.</tt></dd></dl>
<dl><dt><a name="-addXIntersectionIndexesFromLoopLists"><strong>addXIntersectionIndexesFromLoopLists</strong></a>(loopLists, xIntersectionIndexList, y)</dt><dd><tt>Add&nbsp;the&nbsp;x&nbsp;intersections&nbsp;for&nbsp;the&nbsp;loop&nbsp;lists.</tt></dd></dl>
<dl><dt><a name="-addXIntersectionIndexesFromLoops"><strong>addXIntersectionIndexesFromLoops</strong></a>(loops, solidIndex, xIntersectionIndexList, y)</dt><dd><tt>Add&nbsp;the&nbsp;x&nbsp;intersections&nbsp;for&nbsp;the&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getAngleAroundZAxisDifference"><strong>getAngleAroundZAxisDifference</strong></a>(subtractFromVec3, subtractVec3)</dt><dd><tt>Get&nbsp;the&nbsp;angle&nbsp;around&nbsp;the&nbsp;Z&nbsp;axis&nbsp;difference&nbsp;between&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s.<br>
+ <dl><dt><a name="-compareSegmentLength"><strong>compareSegmentLength</strong></a>(endpoint, otherEndpoint)</dt><dd><tt>Get&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;sort&nbsp;endpoints&nbsp;in&nbsp;ascending&nbsp;order&nbsp;of&nbsp;segment&nbsp;length.</tt></dd></dl>
+ <dl><dt><a name="-getAngleAroundZAxisDifference"><strong>getAngleAroundZAxisDifference</strong></a>(subtractFromVec3, subtractVec3)</dt><dd><tt>Get&nbsp;the&nbsp;angle&nbsp;around&nbsp;the&nbsp;Z&nbsp;axis&nbsp;difference&nbsp;between&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vector3s.<br>
&nbsp;<br>
Keyword&nbsp;arguments:<br>
-subtractFromVec3&nbsp;--&nbsp;Vec3&nbsp;whose&nbsp;angle&nbsp;will&nbsp;be&nbsp;subtracted&nbsp;from<br>
-subtractVec3&nbsp;--&nbsp;Vec3&nbsp;whose&nbsp;angle&nbsp;will&nbsp;be&nbsp;subtracted</tt></dd></dl>
+subtractFromVec3&nbsp;--&nbsp;Vector3&nbsp;whose&nbsp;angle&nbsp;will&nbsp;be&nbsp;subtracted&nbsp;from<br>
+subtractVec3&nbsp;--&nbsp;Vector3&nbsp;whose&nbsp;angle&nbsp;will&nbsp;be&nbsp;subtracted</tt></dd></dl>
<dl><dt><a name="-getAroundLoop"><strong>getAroundLoop</strong></a>(begin, end, loop)</dt><dd><tt>Get&nbsp;an&nbsp;arc&nbsp;around&nbsp;a&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getAwayPath"><strong>getAwayPath</strong></a>(path, radius)</dt><dd><tt>Get&nbsp;a&nbsp;loop&nbsp;with&nbsp;only&nbsp;the&nbsp;points&nbsp;that&nbsp;are&nbsp;far&nbsp;enough&nbsp;away&nbsp;from&nbsp;each&nbsp;other.</tt></dd></dl>
- <dl><dt><a name="-getAwayPointComplexes"><strong>getAwayPointComplexes</strong></a>(pointComplexes, radius)</dt><dd><tt>Get&nbsp;a&nbsp;path&nbsp;with&nbsp;only&nbsp;the&nbsp;points&nbsp;that&nbsp;are&nbsp;far&nbsp;enough&nbsp;away&nbsp;from&nbsp;each&nbsp;other.</tt></dd></dl>
+ <dl><dt><a name="-getAwayPoints"><strong>getAwayPoints</strong></a>(pointComplexes, radius)</dt><dd><tt>Get&nbsp;a&nbsp;path&nbsp;with&nbsp;only&nbsp;the&nbsp;points&nbsp;that&nbsp;are&nbsp;far&nbsp;enough&nbsp;away&nbsp;from&nbsp;each&nbsp;other.</tt></dd></dl>
<dl><dt><a name="-getBackOfLoops"><strong>getBackOfLoops</strong></a>(loops)</dt><dd><tt>Get&nbsp;the&nbsp;back&nbsp;of&nbsp;the&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-getClippedAtEndLoopPath"><strong>getClippedAtEndLoopPath</strong></a>(clip, loopPath)</dt><dd><tt>Get&nbsp;a&nbsp;clipped&nbsp;loop&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-getClippedLoopPath"><strong>getClippedLoopPath</strong></a>(clip, loopPath)</dt><dd><tt>Get&nbsp;a&nbsp;clipped&nbsp;loop&nbsp;path.</tt></dd></dl>
- <dl><dt><a name="-getComplexCrossProduct"><strong>getComplexCrossProduct</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;z&nbsp;component&nbsp;cross&nbsp;product&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
- <dl><dt><a name="-getComplexDot"><strong>getComplexDot</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;the&nbsp;dot&nbsp;product&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
- <dl><dt><a name="-getComplexDotPlusOne"><strong>getComplexDotPlusOne</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;the&nbsp;dot&nbsp;product&nbsp;plus&nbsp;one&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
- <dl><dt><a name="-getComplexMaximum"><strong>getComplexMaximum</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
- <dl><dt><a name="-getComplexMaximumFromPointComplexes"><strong>getComplexMaximumFromPointComplexes</strong></a>(pointComplexes)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;list&nbsp;of&nbsp;complex&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-getComplexMaximumFromVec3List"><strong>getComplexMaximumFromVec3List</strong></a>(vec3List)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;list&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
- <dl><dt><a name="-getComplexMinimum"><strong>getComplexMinimum</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
- <dl><dt><a name="-getComplexMinimumFromPointComplexes"><strong>getComplexMinimumFromPointComplexes</strong></a>(pointComplexes)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;list&nbsp;of&nbsp;complex&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-getComplexMinimumFromVec3List"><strong>getComplexMinimumFromVec3List</strong></a>(vec3List)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;list&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
- <dl><dt><a name="-getDistanceSquaredToPlaneSegment"><strong>getDistanceSquaredToPlaneSegment</strong></a>(segmentBegin, segmentEnd, point)</dt><dd><tt>Get&nbsp;the&nbsp;distance&nbsp;squared&nbsp;from&nbsp;a&nbsp;point&nbsp;to&nbsp;the&nbsp;x&nbsp;&amp;&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-getCrossProduct"><strong>getCrossProduct</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;z&nbsp;component&nbsp;cross&nbsp;product&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
+ <dl><dt><a name="-getDistanceToPlaneSegment"><strong>getDistanceToPlaneSegment</strong></a>(segmentBegin, segmentEnd, point)</dt><dd><tt>Get&nbsp;the&nbsp;distance&nbsp;squared&nbsp;from&nbsp;a&nbsp;point&nbsp;to&nbsp;the&nbsp;x&nbsp;&amp;&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-getDotProduct"><strong>getDotProduct</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;the&nbsp;dot&nbsp;product&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
+ <dl><dt><a name="-getDotProductPlusOne"><strong>getDotProductPlusOne</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;the&nbsp;dot&nbsp;product&nbsp;plus&nbsp;one&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vector3s.</tt></dd></dl>
<dl><dt><a name="-getFillOfSurroundings"><strong>getFillOfSurroundings</strong></a>(surroundingLoops)</dt><dd><tt>Get&nbsp;extra&nbsp;fill&nbsp;loops&nbsp;of&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-getFloatPart"><strong>getFloatPart</strong></a>(number)</dt><dd><tt>Get&nbsp;the&nbsp;float&nbsp;part&nbsp;of&nbsp;the&nbsp;number.</tt></dd></dl>
<dl><dt><a name="-getFrontOfLoops"><strong>getFrontOfLoops</strong></a>(loops)</dt><dd><tt>Get&nbsp;the&nbsp;front&nbsp;of&nbsp;the&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getHalfSimplifiedLoop"><strong>getHalfSimplifiedLoop</strong></a>(loop, radius, remainder)</dt><dd><tt>Get&nbsp;the&nbsp;loop&nbsp;with&nbsp;half&nbsp;of&nbsp;the&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
- <dl><dt><a name="-getHalfSimplifiedLoopComplex"><strong>getHalfSimplifiedLoopComplex</strong></a>(loopComplex, radius, remainder)</dt><dd><tt>Get&nbsp;the&nbsp;loop&nbsp;with&nbsp;half&nbsp;of&nbsp;the&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
+ <dl><dt><a name="-getHalfSimplifiedLoop"><strong>getHalfSimplifiedLoop</strong></a>(loopComplex, radius, remainder)</dt><dd><tt>Get&nbsp;the&nbsp;loop&nbsp;with&nbsp;half&nbsp;of&nbsp;the&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
<dl><dt><a name="-getHalfSimplifiedPath"><strong>getHalfSimplifiedPath</strong></a>(path, radius, remainder)</dt><dd><tt>Get&nbsp;the&nbsp;path&nbsp;with&nbsp;half&nbsp;of&nbsp;the&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
<dl><dt><a name="-getInsidesAddToOutsides"><strong>getInsidesAddToOutsides</strong></a>(loops, outsides)</dt><dd><tt>Add&nbsp;loops&nbsp;to&nbsp;either&nbsp;the&nbsp;insides&nbsp;or&nbsp;outsides.</tt></dd></dl>
<dl><dt><a name="-getIntermediateLocation"><strong>getIntermediateLocation</strong></a>(alongWay, begin, end)</dt><dd><tt>Get&nbsp;the&nbsp;intermediate&nbsp;location&nbsp;between&nbsp;begin&nbsp;and&nbsp;end.</tt></dd></dl>
- <dl><dt><a name="-getIntermediateLocationComplex"><strong>getIntermediateLocationComplex</strong></a>(alongWay, begin, end)</dt><dd><tt>Get&nbsp;the&nbsp;intermediate&nbsp;location&nbsp;between&nbsp;begin&nbsp;and&nbsp;end.</tt></dd></dl>
<dl><dt><a name="-getLargestLoop"><strong>getLargestLoop</strong></a>(loops)</dt><dd><tt>Get&nbsp;largest&nbsp;loop&nbsp;from&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getLeftPoint"><strong>getLeftPoint</strong></a>(path)</dt><dd><tt>Get&nbsp;the&nbsp;leftmost&nbsp;point&nbsp;in&nbsp;the&nbsp;path.</tt></dd></dl>
- <dl><dt><a name="-getLeftPointComplex"><strong>getLeftPointComplex</strong></a>(pointComplexes)</dt><dd><tt>Get&nbsp;the&nbsp;leftmost&nbsp;complex&nbsp;point&nbsp;in&nbsp;the&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-getLoopComplexMaximumSpan"><strong>getLoopComplexMaximumSpan</strong></a>(loop)</dt><dd><tt>Get&nbsp;the&nbsp;maximum&nbsp;span&nbsp;of&nbsp;the&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getLoopStartingNearest"><strong>getLoopStartingNearest</strong></a>(extrusionHalfWidthSquared, location, loop)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getMaximumSpan"><strong>getMaximumSpan</strong></a>(loop)</dt><dd><tt>Get&nbsp;the&nbsp;maximum&nbsp;span&nbsp;in&nbsp;the&nbsp;xy&nbsp;plane.</tt></dd></dl>
- <dl><dt><a name="-getNearestDistanceSquaredIndex"><strong>getNearestDistanceSquaredIndex</strong></a>(point, loop)</dt><dd><tt>Get&nbsp;the&nbsp;distance&nbsp;squared&nbsp;to&nbsp;the&nbsp;nearest&nbsp;segment&nbsp;of&nbsp;the&nbsp;loop&nbsp;and&nbsp;index&nbsp;of&nbsp;that&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-getNearestPathDistanceSquaredIndex"><strong>getNearestPathDistanceSquaredIndex</strong></a>(point, path)</dt><dd><tt>Get&nbsp;the&nbsp;distance&nbsp;squared&nbsp;to&nbsp;the&nbsp;nearest&nbsp;segment&nbsp;of&nbsp;the&nbsp;path&nbsp;and&nbsp;index&nbsp;of&nbsp;that&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-getLeftPoint"><strong>getLeftPoint</strong></a>(pointComplexes)</dt><dd><tt>Get&nbsp;the&nbsp;leftmost&nbsp;complex&nbsp;point&nbsp;in&nbsp;the&nbsp;points.</tt></dd></dl>
+ <dl><dt><a name="-getLoopStartingNearest"><strong>getLoopStartingNearest</strong></a>(extrusionHalfWidth, location, loop)</dt><dd><tt>Add&nbsp;to&nbsp;threads&nbsp;from&nbsp;the&nbsp;last&nbsp;location&nbsp;from&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getMaximum"><strong>getMaximum</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
+ <dl><dt><a name="-getMaximumFromPoints"><strong>getMaximumFromPoints</strong></a>(pointComplexes)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;list&nbsp;of&nbsp;complex&nbsp;points.</tt></dd></dl>
+ <dl><dt><a name="-getMaximumSpan"><strong>getMaximumSpan</strong></a>(loop)</dt><dd><tt>Get&nbsp;the&nbsp;maximum&nbsp;span&nbsp;of&nbsp;the&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getMinimum"><strong>getMinimum</strong></a>(firstComplex, secondComplex)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes.</tt></dd></dl>
+ <dl><dt><a name="-getMinimumFromPoints"><strong>getMinimumFromPoints</strong></a>(pointComplexes)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;list&nbsp;of&nbsp;complex&nbsp;points.</tt></dd></dl>
+ <dl><dt><a name="-getMinimumFromVec3List"><strong>getMinimumFromVec3List</strong></a>(vec3List)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;list&nbsp;of&nbsp;Vector3s.</tt></dd></dl>
+ <dl><dt><a name="-getNearestDistanceIndex"><strong>getNearestDistanceIndex</strong></a>(point, loop)</dt><dd><tt>Get&nbsp;the&nbsp;distance&nbsp;squared&nbsp;to&nbsp;the&nbsp;nearest&nbsp;segment&nbsp;of&nbsp;the&nbsp;loop&nbsp;and&nbsp;index&nbsp;of&nbsp;that&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-getNearestPointOnSegment"><strong>getNearestPointOnSegment</strong></a>(segmentBegin, segmentEnd, point)</dt><dd><tt>Get&nbsp;the&nbsp;nearest&nbsp;point&nbsp;on&nbsp;the&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-getNormalized"><strong>getNormalized</strong></a>(complexNumber)</dt><dd><tt>Get&nbsp;the&nbsp;normalized&nbsp;complex.</tt></dd></dl>
- <dl><dt><a name="-getNumberOfIntersectionsToLeft"><strong>getNumberOfIntersectionsToLeft</strong></a>(leftPoint, loop)</dt><dd><tt>Get&nbsp;the&nbsp;number&nbsp;of&nbsp;intersections&nbsp;through&nbsp;the&nbsp;loop&nbsp;for&nbsp;the&nbsp;line&nbsp;starting&nbsp;from&nbsp;the&nbsp;left&nbsp;point&nbsp;and&nbsp;going&nbsp;left.</tt></dd></dl>
- <dl><dt><a name="-getNumberOfIntersectionsToLeftComplex"><strong>getNumberOfIntersectionsToLeftComplex</strong></a>(leftPointComplex, loopComplex)</dt><dd><tt>Get&nbsp;the&nbsp;number&nbsp;of&nbsp;intersections&nbsp;through&nbsp;the&nbsp;loop&nbsp;for&nbsp;the&nbsp;line&nbsp;starting&nbsp;from&nbsp;the&nbsp;left&nbsp;point&nbsp;and&nbsp;going&nbsp;left.</tt></dd></dl>
+ <dl><dt><a name="-getNumberOfIntersectionsToLeft"><strong>getNumberOfIntersectionsToLeft</strong></a>(leftPointComplex, loopComplex)</dt><dd><tt>Get&nbsp;the&nbsp;number&nbsp;of&nbsp;intersections&nbsp;through&nbsp;the&nbsp;loop&nbsp;for&nbsp;the&nbsp;line&nbsp;starting&nbsp;from&nbsp;the&nbsp;left&nbsp;point&nbsp;and&nbsp;going&nbsp;left.</tt></dd></dl>
<dl><dt><a name="-getOrderedSurroundingLoops"><strong>getOrderedSurroundingLoops</strong></a>(extrusionWidth, surroundingLoops)</dt><dd><tt>Get&nbsp;ordered&nbsp;surrounding&nbsp;loops&nbsp;from&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-getPathLength"><strong>getPathLength</strong></a>(path)</dt><dd><tt>Get&nbsp;the&nbsp;length&nbsp;of&nbsp;a&nbsp;path&nbsp;(&nbsp;an&nbsp;open&nbsp;polyline&nbsp;).</tt></dd></dl>
- <dl><dt><a name="-getPathRoundZAxisByPlaneAngle"><strong>getPathRoundZAxisByPlaneAngle</strong></a>(planeAngle, path)</dt><dd><tt>Get&nbsp;Vec3&nbsp;array&nbsp;rotated&nbsp;by&nbsp;a&nbsp;plane&nbsp;angle.<br>
-&nbsp;<br>
-Keyword&nbsp;arguments:<br>
-planeAngle&nbsp;-&nbsp;plane&nbsp;angle&nbsp;of&nbsp;the&nbsp;rotation<br>
-path&nbsp;-&nbsp;Vec3&nbsp;array&nbsp;whose&nbsp;rotation&nbsp;will&nbsp;be&nbsp;returned</tt></dd></dl>
<dl><dt><a name="-getPathsFromEndpoints"><strong>getPathsFromEndpoints</strong></a>(endpoints, fillInset, pixelTable, width)</dt><dd><tt>Get&nbsp;paths&nbsp;from&nbsp;endpoints.</tt></dd></dl>
- <dl><dt><a name="-getPlaneDot"><strong>getPlaneDot</strong></a>(vec3First, vec3Second)</dt><dd><tt>Get&nbsp;the&nbsp;dot&nbsp;product&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
- <dl><dt><a name="-getPlaneDotPlusOne"><strong>getPlaneDotPlusOne</strong></a>(vec3First, vec3Second)</dt><dd><tt>Get&nbsp;the&nbsp;dot&nbsp;product&nbsp;plus&nbsp;one&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
- <dl><dt><a name="-getPointComplexesFromPoints"><strong>getPointComplexesFromPoints</strong></a>(points)</dt><dd><tt>Get&nbsp;complex&nbsp;path&nbsp;from&nbsp;a&nbsp;Vec3&nbsp;path.</tt></dd></dl>
- <dl><dt><a name="-getPointComplexesRoundZAxisByComplex"><strong>getPointComplexesRoundZAxisByComplex</strong></a>(planeAngle, points)</dt><dd><tt>Get&nbsp;points&nbsp;rotated&nbsp;by&nbsp;the&nbsp;plane&nbsp;angle</tt></dd></dl>
- <dl><dt><a name="-getPointMaximum"><strong>getPointMaximum</strong></a>(firstPoint, secondPoint)</dt><dd><tt>Get&nbsp;a&nbsp;point&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
- <dl><dt><a name="-getPointMinimum"><strong>getPointMinimum</strong></a>(firstPoint, secondPoint)</dt><dd><tt>Get&nbsp;a&nbsp;point&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
+ <dl><dt><a name="-getPlaneDot"><strong>getPlaneDot</strong></a>(vec3First, vec3Second)</dt><dd><tt>Get&nbsp;the&nbsp;dot&nbsp;product&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vector3s.</tt></dd></dl>
+ <dl><dt><a name="-getPointMaximum"><strong>getPointMaximum</strong></a>(firstPoint, secondPoint)</dt><dd><tt>Get&nbsp;a&nbsp;point&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;maximum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vector3s.</tt></dd></dl>
+ <dl><dt><a name="-getPointMinimum"><strong>getPointMinimum</strong></a>(firstPoint, secondPoint)</dt><dd><tt>Get&nbsp;a&nbsp;point&nbsp;with&nbsp;each&nbsp;component&nbsp;the&nbsp;minimum&nbsp;of&nbsp;the&nbsp;respective&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vector3s.</tt></dd></dl>
<dl><dt><a name="-getPointPlusSegmentWithLength"><strong>getPointPlusSegmentWithLength</strong></a>(length, point, segment)</dt><dd><tt>Get&nbsp;point&nbsp;plus&nbsp;a&nbsp;segment&nbsp;scaled&nbsp;to&nbsp;a&nbsp;given&nbsp;length.</tt></dd></dl>
- <dl><dt><a name="-getPointsFromPointComplexesZ"><strong>getPointsFromPointComplexesZ</strong></a>(pointComplexes, z)</dt><dd><tt>Get&nbsp;Vec3&nbsp;points&nbsp;from&nbsp;a&nbsp;complex&nbsp;points&nbsp;and&nbsp;z.</tt></dd></dl>
- <dl><dt><a name="-getPointsListFromPointComplexesListZ"><strong>getPointsListFromPointComplexesListZ</strong></a>(pointComplexesList, z)</dt><dd><tt>Get&nbsp;Vec3&nbsp;points&nbsp;list&nbsp;from&nbsp;a&nbsp;complex&nbsp;points&nbsp;list&nbsp;and&nbsp;z.</tt></dd></dl>
- <dl><dt><a name="-getPolar"><strong>getPolar</strong></a>(angle, radius)</dt><dd><tt>Get&nbsp;polar&nbsp;complex&nbsp;from&nbsp;counterclockwise&nbsp;angle&nbsp;from&nbsp;1,&nbsp;0&nbsp;and&nbsp;radius.<br>
-&nbsp;<br>
-Keyword&nbsp;arguments:<br>
-angle&nbsp;--&nbsp;counterclockwise&nbsp;angle&nbsp;from&nbsp;1,&nbsp;0<br>
-radius&nbsp;--&nbsp;radius&nbsp;of&nbsp;complex</tt></dd></dl>
- <dl><dt><a name="-getPolygonArea"><strong>getPolygonArea</strong></a>(polygon)</dt><dd><tt>Get&nbsp;the&nbsp;xy&nbsp;plane&nbsp;area&nbsp;of&nbsp;a&nbsp;polygon.</tt></dd></dl>
- <dl><dt><a name="-getPolygonComplexArea"><strong>getPolygonComplexArea</strong></a>(polygonComplex)</dt><dd><tt>Get&nbsp;the&nbsp;area&nbsp;of&nbsp;a&nbsp;complex&nbsp;polygon.</tt></dd></dl>
+ <dl><dt><a name="-getPointsRoundZAxis"><strong>getPointsRoundZAxis</strong></a>(planeAngle, points)</dt><dd><tt>Get&nbsp;points&nbsp;rotated&nbsp;by&nbsp;the&nbsp;plane&nbsp;angle</tt></dd></dl>
+ <dl><dt><a name="-getPolar"><strong>getPolar</strong></a>(angle, radius)</dt><dd><tt>Get&nbsp;polar&nbsp;complex&nbsp;from&nbsp;counterclockwise&nbsp;angle&nbsp;from&nbsp;1,&nbsp;0&nbsp;and&nbsp;radius.</tt></dd></dl>
+ <dl><dt><a name="-getPolygonArea"><strong>getPolygonArea</strong></a>(polygonComplex)</dt><dd><tt>Get&nbsp;the&nbsp;area&nbsp;of&nbsp;a&nbsp;complex&nbsp;polygon.</tt></dd></dl>
<dl><dt><a name="-getPolygonLength"><strong>getPolygonLength</strong></a>(polygon)</dt><dd><tt>Get&nbsp;the&nbsp;length&nbsp;of&nbsp;a&nbsp;polygon&nbsp;perimeter.</tt></dd></dl>
<dl><dt><a name="-getReverseFloatPart"><strong>getReverseFloatPart</strong></a>(number)</dt><dd><tt>Get&nbsp;the&nbsp;reverse&nbsp;float&nbsp;part&nbsp;of&nbsp;the&nbsp;number.</tt></dd></dl>
- <dl><dt><a name="-getRotatedClockwiseQuarterAroundZAxis"><strong>getRotatedClockwiseQuarterAroundZAxis</strong></a>(vector3)</dt><dd><tt>Get&nbsp;vector3&nbsp;rotated&nbsp;a&nbsp;quarter&nbsp;clockwise&nbsp;turn&nbsp;around&nbsp;Z&nbsp;axis.</tt></dd></dl>
- <dl><dt><a name="-getRotatedWiddershinsQuarterAroundZAxis"><strong>getRotatedWiddershinsQuarterAroundZAxis</strong></a>(vector3)</dt><dd><tt>Get&nbsp;Vec3&nbsp;rotated&nbsp;a&nbsp;quarter&nbsp;widdershins&nbsp;turn&nbsp;around&nbsp;Z&nbsp;axis.</tt></dd></dl>
- <dl><dt><a name="-getRoundXAxis"><strong>getRoundXAxis</strong></a>(angle, vector3)</dt><dd><tt>Get&nbsp;Vec3&nbsp;rotated&nbsp;around&nbsp;X&nbsp;axis&nbsp;from&nbsp;widdershins&nbsp;angle&nbsp;and&nbsp;Vec3.<br>
-&nbsp;<br>
-Keyword&nbsp;arguments:<br>
-angle&nbsp;-&nbsp;widdershins&nbsp;angle&nbsp;from&nbsp;1,&nbsp;0<br>
-vector3&nbsp;-&nbsp;Vec3&nbsp;whose&nbsp;rotation&nbsp;will&nbsp;be&nbsp;returned</tt></dd></dl>
- <dl><dt><a name="-getRoundYAxis"><strong>getRoundYAxis</strong></a>(angle, vector3)</dt><dd><tt>Get&nbsp;Vec3&nbsp;rotated&nbsp;around&nbsp;Y&nbsp;axis&nbsp;from&nbsp;widdershins&nbsp;angle&nbsp;and&nbsp;Vec3.<br>
-&nbsp;<br>
-Keyword&nbsp;arguments:<br>
-angle&nbsp;-&nbsp;widdershins&nbsp;angle&nbsp;from&nbsp;1,&nbsp;0<br>
-vector3&nbsp;-&nbsp;Vec3&nbsp;whose&nbsp;rotation&nbsp;will&nbsp;be&nbsp;returned</tt></dd></dl>
- <dl><dt><a name="-getRoundZAxis"><strong>getRoundZAxis</strong></a>(angle, vector3)</dt><dd><tt>Get&nbsp;Vec3&nbsp;rotated&nbsp;around&nbsp;Z&nbsp;axis&nbsp;from&nbsp;widdershins&nbsp;angle&nbsp;and&nbsp;Vec3.<br>
-&nbsp;<br>
-Keyword&nbsp;arguments:<br>
-angle&nbsp;-&nbsp;widdershins&nbsp;angle&nbsp;from&nbsp;1,&nbsp;0<br>
-vector3&nbsp;-&nbsp;Vec3&nbsp;whose&nbsp;rotation&nbsp;will&nbsp;be&nbsp;returned</tt></dd></dl>
- <dl><dt><a name="-getRoundZAxisByPlaneAngle"><strong>getRoundZAxisByPlaneAngle</strong></a>(planeAngle, vector3)</dt><dd><tt>Get&nbsp;Vec3&nbsp;rotated&nbsp;by&nbsp;a&nbsp;plane&nbsp;angle.<br>
+ <dl><dt><a name="-getRotatedWiddershinsQuarterAroundZAxis"><strong>getRotatedWiddershinsQuarterAroundZAxis</strong></a>(vector3)</dt><dd><tt>Get&nbsp;Vector3&nbsp;rotated&nbsp;a&nbsp;quarter&nbsp;widdershins&nbsp;turn&nbsp;around&nbsp;Z&nbsp;axis.</tt></dd></dl>
+ <dl><dt><a name="-getRoundZAxisByPlaneAngle"><strong>getRoundZAxisByPlaneAngle</strong></a>(planeAngle, vector3)</dt><dd><tt>Get&nbsp;Vector3&nbsp;rotated&nbsp;by&nbsp;a&nbsp;plane&nbsp;angle.<br>
&nbsp;<br>
Keyword&nbsp;arguments:<br>
planeAngle&nbsp;-&nbsp;plane&nbsp;angle&nbsp;of&nbsp;the&nbsp;rotation<br>
-vector3&nbsp;-&nbsp;Vec3&nbsp;whose&nbsp;rotation&nbsp;will&nbsp;be&nbsp;returned</tt></dd></dl>
+vector3&nbsp;-&nbsp;Vector3&nbsp;whose&nbsp;rotation&nbsp;will&nbsp;be&nbsp;returned</tt></dd></dl>
<dl><dt><a name="-getRoundedPoint"><strong>getRoundedPoint</strong></a>(point)</dt><dd><tt>Get&nbsp;point&nbsp;with&nbsp;each&nbsp;component&nbsp;rounded.</tt></dd></dl>
<dl><dt><a name="-getRoundedToDecimalPlaces"><strong>getRoundedToDecimalPlaces</strong></a>(decimalPlaces, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;a&nbsp;number&nbsp;of&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
<dl><dt><a name="-getRoundedToThreePlaces"><strong>getRoundedToThreePlaces</strong></a>(number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;three&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
- <dl><dt><a name="-getSegmentComplexFromPoints"><strong>getSegmentComplexFromPoints</strong></a>(begin, end)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segment&nbsp;from&nbsp;a&nbsp;pair&nbsp;of&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-getSegmentComplexesFromXIntersectionIndexes"><strong>getSegmentComplexesFromXIntersectionIndexes</strong></a>(xIntersectionIndexList, y)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;x&nbsp;intersection&nbsp;indexes.</tt></dd></dl>
- <dl><dt><a name="-getSegmentComplexesFromXIntersections"><strong>getSegmentComplexesFromXIntersections</strong></a>(xIntersections, y)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;x&nbsp;intersections.</tt></dd></dl>
<dl><dt><a name="-getSegmentFromPoints"><strong>getSegmentFromPoints</strong></a>(begin, end)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segment&nbsp;from&nbsp;a&nbsp;pair&nbsp;of&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-getSegmentsFromXIntersectionIndexes"><strong>getSegmentsFromXIntersectionIndexes</strong></a>(xIntersectionIndexList, y, z)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;x&nbsp;intersection&nbsp;indexes.</tt></dd></dl>
- <dl><dt><a name="-getSegmentsFromXIntersections"><strong>getSegmentsFromXIntersections</strong></a>(xIntersections, y, z)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;x&nbsp;intersections.</tt></dd></dl>
- <dl><dt><a name="-getSimplifiedLoop"><strong>getSimplifiedLoop</strong></a>(loop, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;with&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
- <dl><dt><a name="-getSimplifiedLoopAtFirstZ"><strong>getSimplifiedLoopAtFirstZ</strong></a>(loop, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;at&nbsp;the&nbsp;first&nbsp;z&nbsp;with&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
- <dl><dt><a name="-getSimplifiedLoopComplex"><strong>getSimplifiedLoopComplex</strong></a>(loopComplex, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;with&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
+ <dl><dt><a name="-getSegmentsFromXIntersectionIndexes"><strong>getSegmentsFromXIntersectionIndexes</strong></a>(xIntersectionIndexList, y)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;x&nbsp;intersection&nbsp;indexes.</tt></dd></dl>
+ <dl><dt><a name="-getSegmentsFromXIntersections"><strong>getSegmentsFromXIntersections</strong></a>(xIntersections, y)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;x&nbsp;intersections.</tt></dd></dl>
+ <dl><dt><a name="-getSimplifiedLoop"><strong>getSimplifiedLoop</strong></a>(loopComplex, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;with&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
<dl><dt><a name="-getSimplifiedPath"><strong>getSimplifiedPath</strong></a>(path, radius)</dt><dd><tt>Get&nbsp;path&nbsp;with&nbsp;points&nbsp;inside&nbsp;the&nbsp;channel&nbsp;removed.</tt></dd></dl>
<dl><dt><a name="-getSquareValues"><strong>getSquareValues</strong></a>(pixelTable, x, y)</dt><dd><tt>Get&nbsp;a&nbsp;list&nbsp;of&nbsp;the&nbsp;values&nbsp;in&nbsp;a&nbsp;square&nbsp;around&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;pixel&nbsp;coordinates.</tt></dd></dl>
<dl><dt><a name="-getStepKey"><strong>getStepKey</strong></a>(x, y)</dt><dd><tt>Get&nbsp;step&nbsp;key&nbsp;for&nbsp;x&nbsp;and&nbsp;y.</tt></dd></dl>
<dl><dt><a name="-getTransferClosestSurroundingLoop"><strong>getTransferClosestSurroundingLoop</strong></a>(oldOrderedLocation, remainingSurroundingLoops, skein)</dt><dd><tt>Get&nbsp;and&nbsp;transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;surrounding&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-getTransferredPaths"><strong>getTransferredPaths</strong></a>(insides, loop)</dt><dd><tt>Get&nbsp;transferred&nbsp;paths&nbsp;from&nbsp;inside&nbsp;paths.</tt></dd></dl>
<dl><dt><a name="-getTransferredSurroundingLoops"><strong>getTransferredSurroundingLoops</strong></a>(insides, loop)</dt><dd><tt>Get&nbsp;transferred&nbsp;paths&nbsp;from&nbsp;inside&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getWiddershinsDot"><strong>getWiddershinsDot</strong></a>(vec3First, vec3Second)</dt><dd><tt>Get&nbsp;the&nbsp;magintude&nbsp;of&nbsp;the&nbsp;positive&nbsp;dot&nbsp;product&nbsp;plus&nbsp;one&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s,&nbsp;with&nbsp;the&nbsp;reversed&nbsp;sign&nbsp;of&nbsp;the&nbsp;cross&nbsp;product.</tt></dd></dl>
- <dl><dt><a name="-getWiddershinsDotGivenComplex"><strong>getWiddershinsDotGivenComplex</strong></a>(complexFirst, complexSecond)</dt><dd><tt>Get&nbsp;the&nbsp;magintude&nbsp;of&nbsp;the&nbsp;positive&nbsp;dot&nbsp;product&nbsp;plus&nbsp;one&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes,&nbsp;with&nbsp;the&nbsp;reversed&nbsp;sign&nbsp;of&nbsp;the&nbsp;cross&nbsp;product.</tt></dd></dl>
- <dl><dt><a name="-getXIntersection"><strong>getXIntersection</strong></a>(firstPoint, secondPoint, y)</dt><dd><tt>Get&nbsp;where&nbsp;the&nbsp;line&nbsp;crosses&nbsp;y.</tt></dd></dl>
- <dl><dt><a name="-getXIntersectionFromComplex"><strong>getXIntersectionFromComplex</strong></a>(firstComplex, secondComplex, y)</dt><dd><tt>Get&nbsp;where&nbsp;the&nbsp;line&nbsp;crosses&nbsp;y.</tt></dd></dl>
+ <dl><dt><a name="-getWiddershinsDotGiven"><strong>getWiddershinsDotGiven</strong></a>(complexFirst, complexSecond)</dt><dd><tt>Get&nbsp;the&nbsp;magintude&nbsp;of&nbsp;the&nbsp;positive&nbsp;dot&nbsp;product&nbsp;plus&nbsp;one&nbsp;of&nbsp;the&nbsp;x&nbsp;and&nbsp;y&nbsp;components&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;complexes,&nbsp;with&nbsp;the&nbsp;reversed&nbsp;sign&nbsp;of&nbsp;the&nbsp;cross&nbsp;product.</tt></dd></dl>
+ <dl><dt><a name="-getXIntersection"><strong>getXIntersection</strong></a>(firstComplex, secondComplex, y)</dt><dd><tt>Get&nbsp;where&nbsp;the&nbsp;line&nbsp;crosses&nbsp;y.</tt></dd></dl>
<dl><dt><a name="-getXIntersectionsFromIntersections"><strong>getXIntersectionsFromIntersections</strong></a>(xIntersectionIndexList)</dt><dd><tt>Get&nbsp;x&nbsp;intersections&nbsp;from&nbsp;the&nbsp;x&nbsp;intersection&nbsp;index&nbsp;list,&nbsp;in&nbsp;other&nbsp;words&nbsp;subtract&nbsp;non&nbsp;negative&nbsp;intersections&nbsp;from&nbsp;negatives.</tt></dd></dl>
- <dl><dt><a name="-getZComponentCrossProduct"><strong>getZComponentCrossProduct</strong></a>(vec3First, vec3Second)</dt><dd><tt>Get&nbsp;z&nbsp;component&nbsp;cross&nbsp;product&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vec3s.</tt></dd></dl>
- <dl><dt><a name="-isCloseXYPlane"><strong>isCloseXYPlane</strong></a>(overlapDistanceSquared, pixelTable, point, x, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;point&nbsp;is&nbsp;close&nbsp;to&nbsp;another&nbsp;point&nbsp;on&nbsp;the&nbsp;loop&nbsp;in&nbsp;the&nbsp;xy&nbsp;plane.</tt></dd></dl>
- <dl><dt><a name="-isCloseXYPlaneComplex"><strong>isCloseXYPlaneComplex</strong></a>(overlapDistance, pixelTable, pointComplex, x, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;point&nbsp;is&nbsp;close&nbsp;to&nbsp;another&nbsp;point&nbsp;on&nbsp;the&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getZComponentCrossProduct"><strong>getZComponentCrossProduct</strong></a>(vec3First, vec3Second)</dt><dd><tt>Get&nbsp;z&nbsp;component&nbsp;cross&nbsp;product&nbsp;of&nbsp;a&nbsp;pair&nbsp;of&nbsp;Vector3s.</tt></dd></dl>
+ <dl><dt><a name="-isCloseXYPlane"><strong>isCloseXYPlane</strong></a>(overlapDistance, pixelTable, pointComplex, x, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;point&nbsp;is&nbsp;close&nbsp;to&nbsp;another&nbsp;point&nbsp;on&nbsp;the&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-isInsideOtherLoops"><strong>isInsideOtherLoops</strong></a>(loopIndex, loops)</dt><dd><tt>Determine&nbsp;if&nbsp;a&nbsp;loop&nbsp;in&nbsp;a&nbsp;list&nbsp;is&nbsp;inside&nbsp;another&nbsp;loop&nbsp;in&nbsp;that&nbsp;list.</tt></dd></dl>
<dl><dt><a name="-isLargeSameDirection"><strong>isLargeSameDirection</strong></a>(inset, loop, requiredSize)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;inset&nbsp;is&nbsp;in&nbsp;the&nbsp;same&nbsp;direction&nbsp;as&nbsp;the&nbsp;loop&nbsp;and&nbsp;if&nbsp;the&nbsp;inset&nbsp;is&nbsp;as&nbsp;large&nbsp;as&nbsp;the&nbsp;required&nbsp;size.</tt></dd></dl>
- <dl><dt><a name="-isLineComplexIntersectingInsideXSegment"><strong>isLineComplexIntersectingInsideXSegment</strong></a>(segmentFirstX, segmentSecondX, vector3First, vector3Second, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;line&nbsp;is&nbsp;crossing&nbsp;inside&nbsp;the&nbsp;x&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-isLineIntersectingInsideXSegment"><strong>isLineIntersectingInsideXSegment</strong></a>(segmentFirstX, segmentSecondX, vector3First, vector3Second, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;line&nbsp;is&nbsp;crossing&nbsp;inside&nbsp;the&nbsp;x&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-isLineIntersectingLoopComplexes"><strong>isLineIntersectingLoopComplexes</strong></a>(loops, pointBegin, pointEnd)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;line&nbsp;is&nbsp;intersecting&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-isLineIntersectingLoops"><strong>isLineIntersectingLoops</strong></a>(loops, pointBegin, pointEnd)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;line&nbsp;is&nbsp;intersecting&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-isLoopComplexIntersectingInsideXSegment"><strong>isLoopComplexIntersectingInsideXSegment</strong></a>(loop, segmentFirstX, segmentSecondX, segmentYMirror, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;inside&nbsp;the&nbsp;x&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-isLoopComplexLargeSameDirection"><strong>isLoopComplexLargeSameDirection</strong></a>(inset, loop, requiredSize)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;inset&nbsp;is&nbsp;in&nbsp;the&nbsp;same&nbsp;direction&nbsp;as&nbsp;the&nbsp;loop&nbsp;and&nbsp;if&nbsp;the&nbsp;inset&nbsp;is&nbsp;as&nbsp;large&nbsp;as&nbsp;the&nbsp;required&nbsp;size.</tt></dd></dl>
<dl><dt><a name="-isLoopIntersectingInsideXSegment"><strong>isLoopIntersectingInsideXSegment</strong></a>(loop, segmentFirstX, segmentSecondX, segmentYMirror, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;inside&nbsp;the&nbsp;x&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-isLoopIntersectingLoopComplexes"><strong>isLoopIntersectingLoopComplexes</strong></a>(loop, otherLoops)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;other&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-isLoopIntersectingLoops"><strong>isLoopIntersectingLoops</strong></a>(loop, otherLoops)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;other&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-isLoopListComplexIntersectingInsideXSegment"><strong>isLoopListComplexIntersectingInsideXSegment</strong></a>(loopList, segmentFirstX, segmentSecondX, segmentYMirror, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;list&nbsp;is&nbsp;crossing&nbsp;inside&nbsp;the&nbsp;x&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-isLoopListIntersectingInsideXSegment"><strong>isLoopListIntersectingInsideXSegment</strong></a>(loopList, segmentFirstX, segmentSecondX, segmentYMirror, y)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;list&nbsp;is&nbsp;crossing&nbsp;inside&nbsp;the&nbsp;x&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-isPathInsideLoop"><strong>isPathInsideLoop</strong></a>(loop, path)</dt><dd><tt>Determine&nbsp;if&nbsp;a&nbsp;path&nbsp;is&nbsp;inside&nbsp;another&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-isPathInsideLoopComplex"><strong>isPathInsideLoopComplex</strong></a>(loop, path)</dt><dd><tt>Determine&nbsp;if&nbsp;a&nbsp;path&nbsp;is&nbsp;inside&nbsp;another&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-isPathInsideLoops"><strong>isPathInsideLoops</strong></a>(loops, path)</dt><dd><tt>Determine&nbsp;if&nbsp;a&nbsp;path&nbsp;is&nbsp;inside&nbsp;another&nbsp;loop&nbsp;in&nbsp;a&nbsp;list.</tt></dd></dl>
<dl><dt><a name="-isPixelTableIntersecting"><strong>isPixelTableIntersecting</strong></a>(bigTable, littleTable, maskTable<font color="#909090">={}</font>)</dt><dd><tt>Add&nbsp;path&nbsp;to&nbsp;the&nbsp;pixel&nbsp;table.</tt></dd></dl>
- <dl><dt><a name="-isPolygonComplexWiddershins"><strong>isPolygonComplexWiddershins</strong></a>(polygonComplex)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;complex&nbsp;polygon&nbsp;goes&nbsp;round&nbsp;in&nbsp;the&nbsp;widdershins&nbsp;direction.</tt></dd></dl>
+ <dl><dt><a name="-isPointInsideLoop"><strong>isPointInsideLoop</strong></a>(loop, point)</dt><dd><tt>Determine&nbsp;if&nbsp;a&nbsp;point&nbsp;is&nbsp;inside&nbsp;another&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-isSegmentCompletelyInX"><strong>isSegmentCompletelyInX</strong></a>(segment, xFirst, xSecond)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;segment&nbsp;overlaps&nbsp;within&nbsp;x.</tt></dd></dl>
- <dl><dt><a name="-isWiddershins"><strong>isWiddershins</strong></a>(polygon)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;polygon&nbsp;goes&nbsp;round&nbsp;in&nbsp;the&nbsp;widdershins&nbsp;direction.</tt></dd></dl>
- <dl><dt><a name="-isWithinChannel"><strong>isWithinChannel</strong></a>(channelRadius, pointIndex, loop)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;the&nbsp;point&nbsp;is&nbsp;within&nbsp;the&nbsp;channel&nbsp;between&nbsp;two&nbsp;adjacent&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-isWithinChannelComplex"><strong>isWithinChannelComplex</strong></a>(channelRadius, pointIndex, loopComplex)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;the&nbsp;point&nbsp;is&nbsp;within&nbsp;the&nbsp;channel&nbsp;between&nbsp;two&nbsp;adjacent&nbsp;points.</tt></dd></dl>
+ <dl><dt><a name="-isWiddershins"><strong>isWiddershins</strong></a>(polygonComplex)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;complex&nbsp;polygon&nbsp;goes&nbsp;round&nbsp;in&nbsp;the&nbsp;widdershins&nbsp;direction.</tt></dd></dl>
+ <dl><dt><a name="-isWithinChannel"><strong>isWithinChannel</strong></a>(channelRadius, pointIndex, loopComplex)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;the&nbsp;point&nbsp;is&nbsp;within&nbsp;the&nbsp;channel&nbsp;between&nbsp;two&nbsp;adjacent&nbsp;points.</tt></dd></dl>
<dl><dt><a name="-isXSegmentIntersectingPaths"><strong>isXSegmentIntersectingPaths</strong></a>(paths, segmentFirstX, segmentSecondX, segmentYMirror, y)</dt><dd><tt>Determine&nbsp;if&nbsp;a&nbsp;path&nbsp;list&nbsp;is&nbsp;crossing&nbsp;inside&nbsp;the&nbsp;x&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-removePixelTableFromPixelTable"><strong>removePixelTableFromPixelTable</strong></a>(pixelTableToBeRemoved, pixelTableToBeRemovedFrom)</dt><dd><tt>Remove&nbsp;pixel&nbsp;from&nbsp;the&nbsp;pixel&nbsp;table.</tt></dd></dl>
<dl><dt><a name="-toggleHashtable"><strong>toggleHashtable</strong></a>(hashtable, key, value)</dt><dd><tt>Toggle&nbsp;a&nbsp;hashtable&nbsp;between&nbsp;having&nbsp;and&nbsp;not&nbsp;having&nbsp;a&nbsp;key.</tt></dd></dl>
- <dl><dt><a name="-transferClosestFillLoop"><strong>transferClosestFillLoop</strong></a>(extrusionHalfWidthSquared, oldOrderedLocation, remainingFillLoops, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;fill&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-transferClosestFillLoop"><strong>transferClosestFillLoop</strong></a>(extrusionHalfWidth, oldOrderedLocation, remainingFillLoops, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;fill&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-transferClosestPath"><strong>transferClosestPath</strong></a>(oldOrderedLocation, remainingPaths, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-transferClosestPaths"><strong>transferClosestPaths</strong></a>(oldOrderedLocation, remainingPaths, skein)</dt><dd><tt>Transfer&nbsp;the&nbsp;closest&nbsp;remaining&nbsp;paths.</tt></dd></dl>
<dl><dt><a name="-transferPathsToSurroundingLoops"><strong>transferPathsToSurroundingLoops</strong></a>(paths, surroundingLoops)</dt><dd><tt>Transfer&nbsp;paths&nbsp;to&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.gcodec.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.gcodec.html
index cfc14024..7f4bfe3d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.gcodec.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.gcodec.html
@@ -15,10 +15,10 @@ To&nbsp;run&nbsp;gcodec,&nbsp;install&nbsp;python&nbsp;2.x&nbsp;on&nbsp;your&nbs
&nbsp;<br>
Then&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;gcodec&nbsp;is&nbsp;in,&nbsp;type&nbsp;'python'&nbsp;in&nbsp;a&nbsp;shell&nbsp;to&nbsp;run&nbsp;the&nbsp;python&nbsp;interpreter.&nbsp;&nbsp;Finally&nbsp;type&nbsp;'from&nbsp;gcodec&nbsp;import&nbsp;*'&nbsp;to&nbsp;import&nbsp;this&nbsp;program.<br>
&nbsp;<br>
-Below&nbsp;is&nbsp;an&nbsp;example&nbsp;of&nbsp;gcodec&nbsp;use.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode&nbsp;and&nbsp;gcodec.py.<br>
+Below&nbsp;is&nbsp;an&nbsp;example&nbsp;of&nbsp;gcodec&nbsp;use.&nbsp;&nbsp;This&nbsp;example&nbsp;is&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;and&nbsp;gcodec.py.<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;from&nbsp;gcodec&nbsp;import&nbsp;*<br>
-&gt;&gt;&gt;&nbsp;<a href="#-getFileText">getFileText</a>('Hollow&nbsp;Square.gcode')<br>
+&gt;&gt;&gt;&nbsp;<a href="#-getFileText">getFileText</a>('Screw&nbsp;Holder&nbsp;Bottom.gcode')<br>
'(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;April&nbsp;17,2007&nbsp;Skeinforge&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
M100&nbsp;P210<br>
@@ -31,7 +31,7 @@ G21<br>
G90<br>
G28<br>
(&nbsp;Extruder&nbsp;Movement&nbsp;)<br>
-(&nbsp;Extruder&nbsp;paths&nbsp;for&nbsp;layer&nbsp;0&nbsp;of&nbsp;Hollow&nbsp;Square&nbsp;)<br>
+(&nbsp;Extruder&nbsp;paths&nbsp;for&nbsp;layer&nbsp;0&nbsp;of&nbsp;Screw&nbsp;Holder&nbsp;Bottom&nbsp;)<br>
(&lt;extrusionStart&gt;<br>
G1&nbsp;X2.727&nbsp;Y-2.505&nbsp;Z0.33&nbsp;F600.0<br>
&nbsp;<br>
@@ -56,7 +56,7 @@ many&nbsp;lines&nbsp;of&nbsp;text<br>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-createInitFile"><strong>createInitFile</strong></a>()</dt><dd><tt>Create&nbsp;the&nbsp;__init__.py&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-findWords"><strong>findWords</strong></a>(filenames, search)</dt><dd><tt>Find&nbsp;in&nbsp;files&nbsp;the&nbsp;search.</tt></dd></dl>
+ <dl><dt><a name="-findWords"><strong>findWords</strong></a>(fileNames, search)</dt><dd><tt>Find&nbsp;in&nbsp;files&nbsp;the&nbsp;search.</tt></dd></dl>
<dl><dt><a name="-getDoubleAfterFirstLetter"><strong>getDoubleAfterFirstLetter</strong></a>(word)</dt><dd><tt>Get&nbsp;the&nbsp;double&nbsp;value&nbsp;of&nbsp;the&nbsp;word&nbsp;after&nbsp;the&nbsp;first&nbsp;letter.<br>
&nbsp;<br>
Keyword&nbsp;arguments:<br>
@@ -64,7 +64,8 @@ word&nbsp;--&nbsp;string&nbsp;with&nbsp;value&nbsp;starting&nbsp;after&nbsp;the&
<dl><dt><a name="-getDoubleForLetter"><strong>getDoubleForLetter</strong></a>(letter, splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;double&nbsp;value&nbsp;of&nbsp;the&nbsp;word&nbsp;after&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;letter&nbsp;in&nbsp;the&nbsp;split&nbsp;line.</tt></dd></dl>
<dl><dt><a name="-getDoubleFromCharacterSplitLineValue"><strong>getDoubleFromCharacterSplitLineValue</strong></a>(character, splitLine, value)</dt><dd><tt>Get&nbsp;the&nbsp;double&nbsp;value&nbsp;of&nbsp;the&nbsp;string&nbsp;after&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;character&nbsp;in&nbsp;the&nbsp;split&nbsp;line.</tt></dd></dl>
<dl><dt><a name="-getFeedrateMinute"><strong>getFeedrateMinute</strong></a>(feedrateMinute, splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;feedrate&nbsp;per&nbsp;minute&nbsp;if&nbsp;the&nbsp;split&nbsp;line&nbsp;has&nbsp;a&nbsp;feedrate.</tt></dd></dl>
- <dl><dt><a name="-getFileText"><strong>getFileText</strong></a>(filename, readMode<font color="#909090">='r'</font>)</dt><dd><tt>Get&nbsp;the&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getFileText"><strong>getFileText</strong></a>(fileName, readMode<font color="#909090">='r'</font>)</dt><dd><tt>Get&nbsp;the&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getFileTextInFileDirectory"><strong>getFileTextInFileDirectory</strong></a>(fileInDirectory, fileName, readMode<font color="#909090">='r'</font>)</dt><dd><tt>Get&nbsp;the&nbsp;entire&nbsp;text&nbsp;of&nbsp;a&nbsp;file&nbsp;in&nbsp;the&nbsp;directory&nbsp;of&nbsp;the&nbsp;file&nbsp;in&nbsp;directory.</tt></dd></dl>
<dl><dt><a name="-getFilesWithFileTypeWithoutWords"><strong>getFilesWithFileTypeWithoutWords</strong></a>(fileType, words<font color="#909090">=[]</font>, fileInDirectory<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;files&nbsp;which&nbsp;have&nbsp;a&nbsp;given&nbsp;file&nbsp;type,&nbsp;but&nbsp;with&nbsp;do&nbsp;not&nbsp;contain&nbsp;a&nbsp;word&nbsp;in&nbsp;a&nbsp;list.<br>
&nbsp;<br>
Keyword&nbsp;arguments:<br>
@@ -76,29 +77,30 @@ Keyword&nbsp;arguments:<br>
fileType&nbsp;--&nbsp;file&nbsp;types&nbsp;required<br>
words&nbsp;--&nbsp;list&nbsp;of&nbsp;words&nbsp;which&nbsp;the&nbsp;file&nbsp;must&nbsp;not&nbsp;have</tt></dd></dl>
<dl><dt><a name="-getFirstWord"><strong>getFirstWord</strong></a>(splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;first&nbsp;word&nbsp;of&nbsp;a&nbsp;split&nbsp;line.</tt></dd></dl>
- <dl><dt><a name="-getGcodeFileText"><strong>getGcodeFileText</strong></a>(filename, gcodeText)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;text&nbsp;from&nbsp;a&nbsp;file&nbsp;if&nbsp;it&nbsp;the&nbsp;gcode&nbsp;text&nbsp;is&nbsp;empty&nbsp;and&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getGcodeFileText"><strong>getGcodeFileText</strong></a>(fileName, gcodeText)</dt><dd><tt>Get&nbsp;the&nbsp;gcode&nbsp;text&nbsp;from&nbsp;a&nbsp;file&nbsp;if&nbsp;it&nbsp;the&nbsp;gcode&nbsp;text&nbsp;is&nbsp;empty&nbsp;and&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;a&nbsp;gcode&nbsp;file.</tt></dd></dl>
<dl><dt><a name="-getLocationFromSplitLine"><strong>getLocationFromSplitLine</strong></a>(oldLocation, splitLine)</dt><dd><tt>Get&nbsp;the&nbsp;location&nbsp;from&nbsp;the&nbsp;split&nbsp;line.</tt></dd></dl>
- <dl><dt><a name="-getModule"><strong>getModule</strong></a>(filename, folderName, moduleFilename)</dt><dd><tt>Get&nbsp;the&nbsp;module&nbsp;from&nbsp;the&nbsp;filename&nbsp;and&nbsp;folder&nbsp;name.</tt></dd></dl>
- <dl><dt><a name="-getPluginFilenames"><strong>getPluginFilenames</strong></a>(folderName, moduleFilename)</dt><dd><tt>Get&nbsp;the&nbsp;filenames&nbsp;of&nbsp;the&nbsp;python&nbsp;plugins&nbsp;in&nbsp;the&nbsp;export_plugins&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-getModule"><strong>getModule</strong></a>(fileName, folderName, moduleFilename)</dt><dd><tt>Get&nbsp;the&nbsp;module&nbsp;from&nbsp;the&nbsp;fileName&nbsp;and&nbsp;folder&nbsp;name.</tt></dd></dl>
+ <dl><dt><a name="-getPluginFilenames"><strong>getPluginFilenames</strong></a>(folderName, moduleFilename)</dt><dd><tt>Get&nbsp;the&nbsp;fileNames&nbsp;of&nbsp;the&nbsp;python&nbsp;plugins&nbsp;in&nbsp;the&nbsp;export_plugins&nbsp;folder.</tt></dd></dl>
<dl><dt><a name="-getPythonDirectoryNames"><strong>getPythonDirectoryNames</strong></a>(directoryName)</dt><dd><tt>Get&nbsp;the&nbsp;python&nbsp;directories.</tt></dd></dl>
<dl><dt><a name="-getPythonDirectoryNamesRecursively"><strong>getPythonDirectoryNamesRecursively</strong></a>(directoryName<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;python&nbsp;directories&nbsp;recursively.</tt></dd></dl>
- <dl><dt><a name="-getPythonFilenamesExceptInit"><strong>getPythonFilenamesExceptInit</strong></a>(fileInDirectory<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;python&nbsp;filenames&nbsp;of&nbsp;the&nbsp;directory&nbsp;which&nbsp;the&nbsp;fileInDirectory&nbsp;is&nbsp;in,&nbsp;except&nbsp;for&nbsp;the&nbsp;__init__.py&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-getPythonFilenamesExceptInitRecursively"><strong>getPythonFilenamesExceptInitRecursively</strong></a>(directoryName<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;python&nbsp;filenames&nbsp;of&nbsp;the&nbsp;directory&nbsp;recursively,&nbsp;except&nbsp;for&nbsp;the&nbsp;__init__.py&nbsp;files.</tt></dd></dl>
- <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(filename)</dt><dd><tt>Get&nbsp;the&nbsp;filename&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
+ <dl><dt><a name="-getPythonFilenamesExceptInit"><strong>getPythonFilenamesExceptInit</strong></a>(fileInDirectory<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;python&nbsp;fileNames&nbsp;of&nbsp;the&nbsp;directory&nbsp;which&nbsp;the&nbsp;fileInDirectory&nbsp;is&nbsp;in,&nbsp;except&nbsp;for&nbsp;the&nbsp;__init__.py&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-getPythonFilenamesExceptInitRecursively"><strong>getPythonFilenamesExceptInitRecursively</strong></a>(directoryName<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;the&nbsp;python&nbsp;fileNames&nbsp;of&nbsp;the&nbsp;directory&nbsp;recursively,&nbsp;except&nbsp;for&nbsp;the&nbsp;__init__.py&nbsp;files.</tt></dd></dl>
+ <dl><dt><a name="-getSummarizedFilename"><strong>getSummarizedFilename</strong></a>(fileName)</dt><dd><tt>Get&nbsp;the&nbsp;fileName&nbsp;basename&nbsp;if&nbsp;the&nbsp;file&nbsp;is&nbsp;in&nbsp;the&nbsp;current&nbsp;working&nbsp;directory,&nbsp;otherwise&nbsp;return&nbsp;the&nbsp;original&nbsp;full&nbsp;name.</tt></dd></dl>
<dl><dt><a name="-getTextLines"><strong>getTextLines</strong></a>(text)</dt><dd><tt>Get&nbsp;the&nbsp;all&nbsp;the&nbsp;lines&nbsp;of&nbsp;text&nbsp;of&nbsp;a&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-getUnmodifiedGCodeFiles"><strong>getUnmodifiedGCodeFiles</strong></a>(fileInDirectory<font color="#909090">=''</font>)</dt><dd><tt>Get&nbsp;gcode&nbsp;files&nbsp;which&nbsp;are&nbsp;not&nbsp;modified.</tt></dd></dl>
+ <dl><dt><a name="-getWithoutBracketsEqualTab"><strong>getWithoutBracketsEqualTab</strong></a>(line)</dt><dd><tt>Get&nbsp;a&nbsp;string&nbsp;without&nbsp;the&nbsp;greater&nbsp;than&nbsp;sign,&nbsp;the&nbsp;bracket&nbsp;and&nbsp;less&nbsp;than&nbsp;sign,&nbsp;the&nbsp;equal&nbsp;sign&nbsp;or&nbsp;the&nbsp;tab.</tt></dd></dl>
<dl><dt><a name="-indexOfStartingWithSecond"><strong>indexOfStartingWithSecond</strong></a>(letter, splitLine)</dt><dd><tt>Get&nbsp;index&nbsp;of&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;given&nbsp;letter&nbsp;in&nbsp;the&nbsp;split&nbsp;line,&nbsp;starting&nbsp;with&nbsp;the&nbsp;second&nbsp;word.&nbsp;&nbsp;Return&nbsp;-&nbsp;1&nbsp;if&nbsp;letter&nbsp;is&nbsp;not&nbsp;found</tt></dd></dl>
- <dl><dt><a name="-isFileWithFileTypeWithoutWords"><strong>isFileWithFileTypeWithoutWords</strong></a>(fileType, filename, words)</dt><dd><tt>Determine&nbsp;if&nbsp;file&nbsp;has&nbsp;a&nbsp;given&nbsp;file&nbsp;type,&nbsp;but&nbsp;with&nbsp;does&nbsp;not&nbsp;contain&nbsp;a&nbsp;word&nbsp;in&nbsp;a&nbsp;list.<br>
+ <dl><dt><a name="-isFileWithFileTypeWithoutWords"><strong>isFileWithFileTypeWithoutWords</strong></a>(fileType, fileName, words)</dt><dd><tt>Determine&nbsp;if&nbsp;file&nbsp;has&nbsp;a&nbsp;given&nbsp;file&nbsp;type,&nbsp;but&nbsp;with&nbsp;does&nbsp;not&nbsp;contain&nbsp;a&nbsp;word&nbsp;in&nbsp;a&nbsp;list.<br>
&nbsp;<br>
Keyword&nbsp;arguments:<br>
fileType&nbsp;--&nbsp;file&nbsp;type&nbsp;required<br>
-filename&nbsp;--&nbsp;name&nbsp;of&nbsp;the&nbsp;file<br>
-words&nbsp;--&nbsp;list&nbsp;of&nbsp;words&nbsp;which&nbsp;the&nbsp;filename&nbsp;must&nbsp;not&nbsp;have</tt></dd></dl>
+fileName&nbsp;--&nbsp;name&nbsp;of&nbsp;the&nbsp;file<br>
+words&nbsp;--&nbsp;list&nbsp;of&nbsp;words&nbsp;which&nbsp;the&nbsp;fileName&nbsp;must&nbsp;not&nbsp;have</tt></dd></dl>
<dl><dt><a name="-isProcedureDone"><strong>isProcedureDone</strong></a>(gcodeText, procedure)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;procedure&nbsp;has&nbsp;been&nbsp;done&nbsp;on&nbsp;the&nbsp;gcode&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-isThereAFirstWord"><strong>isThereAFirstWord</strong></a>(firstWord, lines, startIndex)</dt><dd><tt>Parse&nbsp;gcode&nbsp;until&nbsp;the&nbsp;first&nbsp;word&nbsp;if&nbsp;there&nbsp;is&nbsp;one.</tt></dd></dl>
- <dl><dt><a name="-replaceWords"><strong>replaceWords</strong></a>(filenames, original, replacement)</dt><dd><tt>Replace&nbsp;in&nbsp;files&nbsp;the&nbsp;original&nbsp;with&nbsp;the&nbsp;replacement.</tt></dd></dl>
- <dl><dt><a name="-writeFileMessageEnd"><strong>writeFileMessageEnd</strong></a>(end, filename, fileText, message)</dt><dd><tt>Write&nbsp;to&nbsp;a&nbsp;filename&nbsp;with&nbsp;a&nbsp;suffix&nbsp;and&nbsp;print&nbsp;a&nbsp;message.</tt></dd></dl>
- <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(filename, fileText, writeMode<font color="#909090">='w+'</font>)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
+ <dl><dt><a name="-replaceWords"><strong>replaceWords</strong></a>(fileNames, original, replacement)</dt><dd><tt>Replace&nbsp;in&nbsp;files&nbsp;the&nbsp;original&nbsp;with&nbsp;the&nbsp;replacement.</tt></dd></dl>
+ <dl><dt><a name="-writeFileMessageEnd"><strong>writeFileMessageEnd</strong></a>(end, fileName, fileText, message)</dt><dd><tt>Write&nbsp;to&nbsp;a&nbsp;fileName&nbsp;with&nbsp;a&nbsp;suffix&nbsp;and&nbsp;print&nbsp;a&nbsp;message.</tt></dd></dl>
+ <dl><dt><a name="-writeFileText"><strong>writeFileText</strong></a>(fileName, fileText, writeMode<font color="#909090">='w+'</font>)</dt><dd><tt>Write&nbsp;a&nbsp;text&nbsp;to&nbsp;a&nbsp;file.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.html
index ed7968ca..2aa01fc1 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.html
@@ -20,10 +20,12 @@
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">euclidean</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">gcodec</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.intercircle.html">intercircle</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.preferences.html">preferences</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html">triangle_mesh</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.vec3.html">vec3</a><br>
-</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">interpret</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">preferences</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html">triangle_mesh</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.vec3.html">vec3</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.vector3.html">vector3</a><br>
+</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom>&nbsp;<br>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.intercircle.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.intercircle.html
index bb60a606..4805fe49 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.intercircle.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.intercircle.html
@@ -30,9 +30,7 @@
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.intercircle.html#BoundingLoop">BoundingLoop</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.intercircle.html#CircleIntersection">CircleIntersection</a>
-</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.intercircle.html#CircleIntersectionComplex">CircleIntersectionComplex</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.intercircle.html#CircleNode">CircleNode</a>
-</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.intercircle.html#CircleNodeComplex">CircleNodeComplex</a>
</font></dt></dl>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
@@ -65,10 +63,10 @@
<font color="#000000" face="helvetica, arial"><a name="CircleIntersection">class <strong>CircleIntersection</strong></a></font></td></tr>
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>An&nbsp;intersection&nbsp;of&nbsp;two&nbsp;circles.<br>&nbsp;</tt></td></tr>
+<td colspan=2><tt>An&nbsp;intersection&nbsp;of&nbsp;two&nbsp;complex&nbsp;circles.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="CircleIntersection-__init__"><strong>__init__</strong></a>(self)</dt></dl>
+<dl><dt><a name="CircleIntersection-__init__"><strong>__init__</strong></a>(self, circleNodeAhead, index, circleNodeBehind)</dt></dl>
<dl><dt><a name="CircleIntersection-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#CircleIntersection">CircleIntersection</a>.</tt></dd></dl>
@@ -78,8 +76,6 @@
<dl><dt><a name="CircleIntersection-getCircleIntersectionAhead"><strong>getCircleIntersectionAhead</strong></a>(self)</dt></dl>
-<dl><dt><a name="CircleIntersection-getFromCircleNodes"><strong>getFromCircleNodes</strong></a>(self, circleNodeAhead, index, circleNodeBehind)</dt></dl>
-
<dl><dt><a name="CircleIntersection-getPositionRelativeToBehind"><strong>getPositionRelativeToBehind</strong></a>(self)</dt></dl>
<dl><dt><a name="CircleIntersection-isWithinCircles"><strong>isWithinCircles</strong></a>(self, pixelTable, width)</dt></dl>
@@ -88,60 +84,18 @@
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="CircleIntersectionComplex">class <strong>CircleIntersectionComplex</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>An&nbsp;intersection&nbsp;of&nbsp;two&nbsp;complex&nbsp;circles.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="CircleIntersectionComplex-__init__"><strong>__init__</strong></a>(self, circleNodeComplexAhead, index, circleNodeComplexBehind)</dt></dl>
-
-<dl><dt><a name="CircleIntersectionComplex-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#CircleIntersection">CircleIntersection</a>.</tt></dd></dl>
-
-<dl><dt><a name="CircleIntersectionComplex-addToList"><strong>addToList</strong></a>(self, circleIntersectionPath)</dt></dl>
-
-<dl><dt><a name="CircleIntersectionComplex-getAbsolutePosition"><strong>getAbsolutePosition</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="CircleIntersectionComplex-getCircleIntersectionAhead"><strong>getCircleIntersectionAhead</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="CircleIntersectionComplex-getPositionRelativeToBehind"><strong>getPositionRelativeToBehind</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="CircleIntersectionComplex-isWithinCircles"><strong>isWithinCircles</strong></a>(self, pixelTable, width)</dt></dl>
-
-</td></tr></table> <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="CircleNode">class <strong>CircleNode</strong></a></font></td></tr>
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;node&nbsp;of&nbsp;circle&nbsp;intersections.<br>&nbsp;</tt></td></tr>
+<td colspan=2><tt>A&nbsp;complex&nbsp;node&nbsp;of&nbsp;complex&nbsp;circle&nbsp;intersections.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="CircleNode-__init__"><strong>__init__</strong></a>(self)</dt></dl>
+<dl><dt><a name="CircleNode-__init__"><strong>__init__</strong></a>(self, circle, index, radius)</dt></dl>
<dl><dt><a name="CircleNode-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#CircleNode">CircleNode</a>.</tt></dd></dl>
-<dl><dt><a name="CircleNode-getFromCircleRadius"><strong>getFromCircleRadius</strong></a>(self, circle, index, radius)</dt></dl>
-
<dl><dt><a name="CircleNode-getWithinNodes"><strong>getWithinNodes</strong></a>(self, pixelTable, width)</dt></dl>
-</td></tr></table> <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="CircleNodeComplex">class <strong>CircleNodeComplex</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;complex&nbsp;node&nbsp;of&nbsp;complex&nbsp;circle&nbsp;intersections.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="CircleNodeComplex-__init__"><strong>__init__</strong></a>(self, circleComplex, index, radius)</dt></dl>
-
-<dl><dt><a name="CircleNodeComplex-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#CircleNodeComplex">CircleNodeComplex</a>.</tt></dd></dl>
-
-<dl><dt><a name="CircleNodeComplex-getWithinNodes"><strong>getWithinNodes</strong></a>(self, pixelTable, width)</dt></dl>
-
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#eeaa77">
@@ -149,46 +103,27 @@
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-addCircleIntersectionLoop"><strong>addCircleIntersectionLoop</strong></a>(circleIntersectionPath, circleIntersections)</dt><dd><tt>Add&nbsp;a&nbsp;circle&nbsp;intersection&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-addCircleIntersectionLoopComplex"><strong>addCircleIntersectionLoopComplex</strong></a>(circleIntersectionPathComplexes, circleIntersectionComplexes)</dt><dd><tt>Add&nbsp;a&nbsp;circle&nbsp;intersection&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-addOperatingOrbits"><strong>addOperatingOrbits</strong></a>(boundaryLoops, operatingJump, skein, temperatureChangeTime)</dt><dd><tt>Add&nbsp;the&nbsp;orbits&nbsp;before&nbsp;the&nbsp;operating&nbsp;layers.</tt></dd></dl>
- <dl><dt><a name="-addOrbits"><strong>addOrbits</strong></a>(loop, skein, temperatureChangeTime)</dt><dd><tt>Add&nbsp;orbits&nbsp;with&nbsp;the&nbsp;extruder&nbsp;off.</tt></dd></dl>
- <dl><dt><a name="-addPointComplexesFromSegment"><strong>addPointComplexesFromSegment</strong></a>(pointComplexes, radius, pointBeginComplex, pointEndComplex)</dt><dd><tt>Add&nbsp;point&nbsp;complexes&nbsp;between&nbsp;the&nbsp;endpoints&nbsp;of&nbsp;a&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-addPointsFromSegment"><strong>addPointsFromSegment</strong></a>(points, radius, pointBegin, pointEnd)</dt><dd><tt>Add&nbsp;points&nbsp;between&nbsp;the&nbsp;endpoints&nbsp;of&nbsp;a&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-getCenterComplexesFromCircleNodeComplexes"><strong>getCenterComplexesFromCircleNodeComplexes</strong></a>(circleNodeComplexes)</dt><dd><tt>Get&nbsp;the&nbsp;complex&nbsp;centers&nbsp;of&nbsp;the&nbsp;circle&nbsp;intersection&nbsp;loops&nbsp;from&nbsp;circle&nbsp;nodes.</tt></dd></dl>
- <dl><dt><a name="-getCenterComplexesFromIntersectionLoopComplex"><strong>getCenterComplexesFromIntersectionLoopComplex</strong></a>(circleIntersectionLoopComplex)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;from&nbsp;the&nbsp;intersection&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getCenterComplexesFromIntersectionLoopComplexes"><strong>getCenterComplexesFromIntersectionLoopComplexes</strong></a>(circleIntersectionLoopComplexes)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;from&nbsp;the&nbsp;intersection&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getCentersFromCircleNodes"><strong>getCentersFromCircleNodes</strong></a>(circleNodes)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;of&nbsp;the&nbsp;circle&nbsp;intersection&nbsp;loops&nbsp;from&nbsp;circle&nbsp;nodes.</tt></dd></dl>
- <dl><dt><a name="-getCentersFromIntersectionLoop"><strong>getCentersFromIntersectionLoop</strong></a>(circleIntersectionLoop)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;from&nbsp;the&nbsp;intersection&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getCentersFromIntersectionLoops"><strong>getCentersFromIntersectionLoops</strong></a>(circleIntersectionLoops)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;from&nbsp;the&nbsp;intersection&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getCentersFromLoopComplexDirection"><strong>getCentersFromLoopComplexDirection</strong></a>(isWiddershins, loop, radius)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;of&nbsp;the&nbsp;circle&nbsp;intersection&nbsp;loops&nbsp;which&nbsp;go&nbsp;around&nbsp;in&nbsp;the&nbsp;given&nbsp;direction.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-addCircleIntersectionLoop"><strong>addCircleIntersectionLoop</strong></a>(circleIntersectionPathComplexes, circleIntersections)</dt><dd><tt>Add&nbsp;a&nbsp;circle&nbsp;intersection&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-addOperatingOrbits"><strong>addOperatingOrbits</strong></a>(boundaryLoops, skein, temperatureChangeTime, z)</dt><dd><tt>Add&nbsp;the&nbsp;orbits&nbsp;before&nbsp;the&nbsp;operating&nbsp;layers.</tt></dd></dl>
+ <dl><dt><a name="-addOrbits"><strong>addOrbits</strong></a>(loop, skein, temperatureChangeTime, z)</dt><dd><tt>Add&nbsp;orbits&nbsp;with&nbsp;the&nbsp;extruder&nbsp;off.</tt></dd></dl>
+ <dl><dt><a name="-addPointsFromSegment"><strong>addPointsFromSegment</strong></a>(pointComplexes, radius, pointBeginComplex, pointEndComplex, thresholdRatio<font color="#909090">=0.90000000000000002</font>)</dt><dd><tt>Add&nbsp;point&nbsp;complexes&nbsp;between&nbsp;the&nbsp;endpoints&nbsp;of&nbsp;a&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-getCentersFromCircleNodes"><strong>getCentersFromCircleNodes</strong></a>(circleNodesComplex)</dt><dd><tt>Get&nbsp;the&nbsp;complex&nbsp;centers&nbsp;of&nbsp;the&nbsp;circle&nbsp;intersection&nbsp;loops&nbsp;from&nbsp;circle&nbsp;nodes.</tt></dd></dl>
+ <dl><dt><a name="-getCentersFromIntersectionLoop"><strong>getCentersFromIntersectionLoop</strong></a>(circleIntersectionLoopComplex)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;from&nbsp;the&nbsp;intersection&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getCentersFromIntersectionLoops"><strong>getCentersFromIntersectionLoops</strong></a>(circleIntersectionLoopComplexes)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;from&nbsp;the&nbsp;intersection&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-getCentersFromLoopDirection"><strong>getCentersFromLoopDirection</strong></a>(isWiddershins, loop, radius)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;of&nbsp;the&nbsp;circle&nbsp;intersection&nbsp;loops&nbsp;which&nbsp;go&nbsp;around&nbsp;in&nbsp;the&nbsp;given&nbsp;direction.</tt></dd></dl>
- <dl><dt><a name="-getCentersFromOutside"><strong>getCentersFromOutside</strong></a>(isOutside, loop, radius)</dt><dd><tt>Get&nbsp;the&nbsp;centers&nbsp;of&nbsp;the&nbsp;circle&nbsp;intersection&nbsp;loops&nbsp;which&nbsp;are&nbsp;outside&nbsp;if&nbsp;isOutside&nbsp;is&nbsp;true,&nbsp;otherwise&nbsp;get&nbsp;the&nbsp;ones&nbsp;inside.</tt></dd></dl>
- <dl><dt><a name="-getCircleIntersectionComplexesFromCircleNodeComplexes"><strong>getCircleIntersectionComplexesFromCircleNodeComplexes</strong></a>(circleNodeComplexes)</dt><dd><tt>Get&nbsp;all&nbsp;the&nbsp;circle&nbsp;intersections&nbsp;which&nbsp;exist&nbsp;between&nbsp;all&nbsp;the&nbsp;circle&nbsp;nodes.</tt></dd></dl>
- <dl><dt><a name="-getCircleIntersectionLoopComplexes"><strong>getCircleIntersectionLoopComplexes</strong></a>(circleIntersectionComplexes)</dt><dd><tt>Get&nbsp;all&nbsp;the&nbsp;loops&nbsp;going&nbsp;through&nbsp;the&nbsp;circle&nbsp;intersections.</tt></dd></dl>
<dl><dt><a name="-getCircleIntersectionLoops"><strong>getCircleIntersectionLoops</strong></a>(circleIntersections)</dt><dd><tt>Get&nbsp;all&nbsp;the&nbsp;loops&nbsp;going&nbsp;through&nbsp;the&nbsp;circle&nbsp;intersections.</tt></dd></dl>
- <dl><dt><a name="-getCircleIntersectionsFromCircleNodes"><strong>getCircleIntersectionsFromCircleNodes</strong></a>(circleNodes)</dt><dd><tt>Get&nbsp;all&nbsp;the&nbsp;circle&nbsp;intersections&nbsp;which&nbsp;exist&nbsp;between&nbsp;all&nbsp;the&nbsp;circle&nbsp;nodes.</tt></dd></dl>
- <dl><dt><a name="-getCircleNodeComplexesFromLoopComplex"><strong>getCircleNodeComplexesFromLoopComplex</strong></a>(loop, radius)</dt><dd><tt>Get&nbsp;the&nbsp;circle&nbsp;nodes&nbsp;from&nbsp;every&nbsp;point&nbsp;on&nbsp;a&nbsp;loop&nbsp;and&nbsp;between&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-getCircleNodeComplexesFromPointComplexes"><strong>getCircleNodeComplexesFromPointComplexes</strong></a>(pointComplexes, radius)</dt><dd><tt>Get&nbsp;the&nbsp;circle&nbsp;nodes&nbsp;from&nbsp;a&nbsp;path.</tt></dd></dl>
+ <dl><dt><a name="-getCircleIntersectionsFromCircleNodes"><strong>getCircleIntersectionsFromCircleNodes</strong></a>(circleNodesComplex)</dt><dd><tt>Get&nbsp;all&nbsp;the&nbsp;circle&nbsp;intersections&nbsp;which&nbsp;exist&nbsp;between&nbsp;all&nbsp;the&nbsp;circle&nbsp;nodes.</tt></dd></dl>
<dl><dt><a name="-getCircleNodesFromLoop"><strong>getCircleNodesFromLoop</strong></a>(loop, radius)</dt><dd><tt>Get&nbsp;the&nbsp;circle&nbsp;nodes&nbsp;from&nbsp;every&nbsp;point&nbsp;on&nbsp;a&nbsp;loop&nbsp;and&nbsp;between&nbsp;points.</tt></dd></dl>
- <dl><dt><a name="-getCircleNodesFromPath"><strong>getCircleNodesFromPath</strong></a>(path, radius)</dt><dd><tt>Get&nbsp;the&nbsp;circle&nbsp;nodes&nbsp;from&nbsp;a&nbsp;path.</tt></dd></dl>
- <dl><dt><a name="-getInsetComplexFromClockwiseTriple"><strong>getInsetComplexFromClockwiseTriple</strong></a>(aheadAbsoluteComplex, behindAbsoluteComplex, centerComplex, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;inset&nbsp;from&nbsp;clockwise&nbsp;triple,&nbsp;out&nbsp;from&nbsp;widdershins&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getCircleNodesFromPoints"><strong>getCircleNodesFromPoints</strong></a>(pointComplexes, radius)</dt><dd><tt>Get&nbsp;the&nbsp;circle&nbsp;nodes&nbsp;from&nbsp;a&nbsp;path.</tt></dd></dl>
<dl><dt><a name="-getInsetFromClockwiseLoop"><strong>getInsetFromClockwiseLoop</strong></a>(loop, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;inset&nbsp;from&nbsp;clockwise&nbsp;loop,&nbsp;out&nbsp;from&nbsp;widdershins&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getInsetFromClockwiseLoopComplex"><strong>getInsetFromClockwiseLoopComplex</strong></a>(loopComplex, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;inset&nbsp;from&nbsp;clockwise&nbsp;loop,&nbsp;out&nbsp;from&nbsp;widdershins&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getInsetFromClockwiseTriple"><strong>getInsetFromClockwiseTriple</strong></a>(aheadAbsolute, behindAbsolute, center, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;inset&nbsp;from&nbsp;clockwise&nbsp;triple,&nbsp;out&nbsp;from&nbsp;widdershins&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getInsetFromClockwiseTriple"><strong>getInsetFromClockwiseTriple</strong></a>(aheadAbsoluteComplex, behindAbsoluteComplex, centerComplex, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;inset&nbsp;from&nbsp;clockwise&nbsp;triple,&nbsp;out&nbsp;from&nbsp;widdershins&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-getInsetLoops"><strong>getInsetLoops</strong></a>(inset, loops)</dt><dd><tt>Get&nbsp;the&nbsp;inset&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-getIntersectionAtInset"><strong>getIntersectionAtInset</strong></a>(ahead, behind, inset)</dt><dd><tt>Get&nbsp;circle&nbsp;intersection&nbsp;loop&nbsp;at&nbsp;inset&nbsp;from&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-getIntersectionComplexAtInset"><strong>getIntersectionComplexAtInset</strong></a>(aheadComplex, behindComplex, inset)</dt><dd><tt>Get&nbsp;circle&nbsp;intersection&nbsp;loop&nbsp;at&nbsp;inset&nbsp;from&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-getLoopComplexesFromLoopComplexesDirection"><strong>getLoopComplexesFromLoopComplexesDirection</strong></a>(isWiddershins, loopComplexes)</dt><dd><tt>Get&nbsp;the&nbsp;loops&nbsp;going&nbsp;round&nbsp;in&nbsp;a&nbsp;given&nbsp;direction.</tt></dd></dl>
+ <dl><dt><a name="-getIntersectionAtInset"><strong>getIntersectionAtInset</strong></a>(aheadComplex, behindComplex, inset)</dt><dd><tt>Get&nbsp;circle&nbsp;intersection&nbsp;loop&nbsp;at&nbsp;inset&nbsp;from&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-getLoopsFromLoopsDirection"><strong>getLoopsFromLoopsDirection</strong></a>(isWiddershins, loops)</dt><dd><tt>Get&nbsp;the&nbsp;loops&nbsp;going&nbsp;round&nbsp;in&nbsp;a&nbsp;given&nbsp;direction.</tt></dd></dl>
<dl><dt><a name="-getSimplifiedInsetFromClockwiseLoop"><strong>getSimplifiedInsetFromClockwiseLoop</strong></a>(loop, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;inset&nbsp;from&nbsp;clockwise&nbsp;loop,&nbsp;out&nbsp;from&nbsp;widdershins&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getSimplifiedInsetFromClockwiseLoopComplex"><strong>getSimplifiedInsetFromClockwiseLoopComplex</strong></a>(loopComplex, radius)</dt><dd><tt>Get&nbsp;loop&nbsp;inset&nbsp;from&nbsp;clockwise&nbsp;loop,&nbsp;out&nbsp;from&nbsp;widdershins&nbsp;loop.</tt></dd></dl>
- <dl><dt><a name="-getWithoutIntersectionComplexes"><strong>getWithoutIntersectionComplexes</strong></a>(loopComplex)</dt><dd><tt>Get&nbsp;loop&nbsp;without&nbsp;intersections.</tt></dd></dl>
<dl><dt><a name="-getWithoutIntersections"><strong>getWithoutIntersections</strong></a>(loop)</dt><dd><tt>Get&nbsp;loop&nbsp;without&nbsp;intersections.</tt></dd></dl>
<dl><dt><a name="-isLoopIntersectingLoop"><strong>isLoopIntersectingLoop</strong></a>(anotherLoop, loop)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;a&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;another&nbsp;loop.</tt></dd></dl>
<dl><dt><a name="-removeIntersection"><strong>removeIntersection</strong></a>(loop)</dt><dd><tt>Get&nbsp;loop&nbsp;without&nbsp;the&nbsp;first&nbsp;intersection.</tt></dd></dl>
- <dl><dt><a name="-removeIntersectionComplex"><strong>removeIntersectionComplex</strong></a>(loopComplex)</dt><dd><tt>Get&nbsp;loop&nbsp;without&nbsp;the&nbsp;first&nbsp;intersection.</tt></dd></dl>
- <dl><dt><a name="-setZAccordingToOperatingJump"><strong>setZAccordingToOperatingJump</strong></a>(loop, operatingJump)</dt><dd><tt>Set&nbsp;of&nbsp;the&nbsp;loop&nbsp;to&nbsp;the&nbsp;first&nbsp;point,&nbsp;increasing&nbsp;by&nbsp;the&nbsp;operating&nbsp;jump&nbsp;if&nbsp;it&nbsp;exists.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.interpret.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.interpret.html
new file mode 100644
index 00000000..7ae12379
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.interpret.html
@@ -0,0 +1,68 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.skeinforge_utilities.interpret</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.skeinforge_utilities.html"><font color="#ffffff">skeinforge_utilities</font></a>.interpret</strong></big></big> ($Date: 2008/21/04 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/interpret.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/interpret.py</a></font></td></tr></table>
+ <p><tt>Interpret&nbsp;is&nbsp;a&nbsp;collection&nbsp;of&nbsp;utilities&nbsp;to&nbsp;list&nbsp;the&nbsp;import&nbsp;plugins.<br>
+&nbsp;<br>
+An&nbsp;import&nbsp;plugin&nbsp;is&nbsp;a&nbsp;script&nbsp;in&nbsp;the&nbsp;import_plugins&nbsp;folder&nbsp;which&nbsp;has&nbsp;the&nbsp;function&nbsp;getTriangleMesh.<br>
+&nbsp;<br>
+The&nbsp;following&nbsp;examples&nbsp;shows&nbsp;functions&nbsp;of&nbsp;interpret.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains&nbsp;interpret.py.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python<br>
+Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
+[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
+Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;interpret<br>
+&gt;&gt;&gt;&nbsp;interpret.<a href="#-getGNUTranslatorGcodeFileTypeTuples">getGNUTranslatorGcodeFileTypeTuples</a>()<br>
+[('GTS&nbsp;files',&nbsp;'*.gts'),&nbsp;('Gcode&nbsp;text&nbsp;files',&nbsp;'*.gcode'),&nbsp;('STL&nbsp;files',&nbsp;'*.stl'),&nbsp;('SVG&nbsp;files',&nbsp;'*.svg')]<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;interpret.<a href="#-getImportPluginFilenames">getImportPluginFilenames</a>()<br>
+['gts',&nbsp;'stl',&nbsp;'svg']</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
+</td><td width="25%" valign=top><a href="os.html">os</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl><dt><a name="-getGNUTranslatorFilesUnmodified"><strong>getGNUTranslatorFilesUnmodified</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;types&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-getGNUTranslatorGcodeFileTypeTuples"><strong>getGNUTranslatorGcodeFileTypeTuples</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;type&nbsp;tuples&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder&nbsp;plus&nbsp;gcode.</tt></dd></dl>
+ <dl><dt><a name="-getImportPluginFilenames"><strong>getImportPluginFilenames</strong></a>()</dt><dd><tt>Get&nbsp;analyze&nbsp;plugin&nbsp;fileNames.</tt></dd></dl>
+ <dl><dt><a name="-getTranslatorFileTypeTuples"><strong>getTranslatorFileTypeTuples</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;types&nbsp;from&nbsp;the&nbsp;translators&nbsp;in&nbsp;the&nbsp;import&nbsp;plugins&nbsp;folder.</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.preferences.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.preferences.html
index d7f40b41..e682e5c4 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.preferences.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.preferences.html
@@ -209,13 +209,13 @@ Methods inherited from <a href="skeinforge_tools.skeinforge_utilities.preference
<dl><dt><a name="Filename-execute"><strong>execute</strong></a>(self)</dt></dl>
-<dl><dt><a name="Filename-getFilenameFirstTypes"><strong>getFilenameFirstTypes</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;types&nbsp;with&nbsp;the&nbsp;file&nbsp;type&nbsp;of&nbsp;the&nbsp;filename&nbsp;moved&nbsp;to&nbsp;the&nbsp;front&nbsp;of&nbsp;the&nbsp;list.</tt></dd></dl>
+<dl><dt><a name="Filename-getFilenameFirstTypes"><strong>getFilenameFirstTypes</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;file&nbsp;types&nbsp;with&nbsp;the&nbsp;file&nbsp;type&nbsp;of&nbsp;the&nbsp;fileName&nbsp;moved&nbsp;to&nbsp;the&nbsp;front&nbsp;of&nbsp;the&nbsp;list.</tt></dd></dl>
<dl><dt><a name="Filename-getFromFilename"><strong>getFromFilename</strong></a>(self, fileTypes, name, value)</dt><dd><tt>Initialize.</tt></dd></dl>
<dl><dt><a name="Filename-setToDisplay"><strong>setToDisplay</strong></a>(self)</dt><dd><tt>Pass.</tt></dd></dl>
-<dl><dt><a name="Filename-setValueToString"><strong>setValueToString</strong></a>(self, valueString)</dt><dd><tt>Set&nbsp;the&nbsp;filename&nbsp;to&nbsp;the&nbsp;string.</tt></dd></dl>
+<dl><dt><a name="Filename-setValueToString"><strong>setValueToString</strong></a>(self, valueString)</dt><dd><tt>Set&nbsp;the&nbsp;fileName&nbsp;to&nbsp;the&nbsp;string.</tt></dd></dl>
<hr>
Methods inherited from <a href="skeinforge_tools.skeinforge_utilities.preferences.html#BooleanPreference">BooleanPreference</a>:<br>
@@ -525,7 +525,7 @@ Methods inherited from <a href="skeinforge_tools.skeinforge_utilities.preference
<td width="100%"><dl><dt><a name="-displayDialog"><strong>displayDialog</strong></a>(displayPreferences)</dt><dd><tt>Display&nbsp;the&nbsp;preferences&nbsp;dialog.</tt></dd></dl>
<dl><dt><a name="-getArchiveText"><strong>getArchiveText</strong></a>(preferences)</dt><dd><tt>Get&nbsp;the&nbsp;text&nbsp;representation&nbsp;of&nbsp;the&nbsp;archive.</tt></dd></dl>
<dl><dt><a name="-getPreferencesDirectoryPath"><strong>getPreferencesDirectoryPath</strong></a>()</dt><dd><tt>Get&nbsp;the&nbsp;preferences&nbsp;directory&nbsp;path,&nbsp;which&nbsp;is&nbsp;the&nbsp;home&nbsp;directory&nbsp;joined&nbsp;with&nbsp;.skeinforge.</tt></dd></dl>
- <dl><dt><a name="-getPreferencesFilePath"><strong>getPreferencesFilePath</strong></a>(filename)</dt><dd><tt>Get&nbsp;the&nbsp;preferences&nbsp;file&nbsp;path,&nbsp;which&nbsp;is&nbsp;the&nbsp;home&nbsp;directory&nbsp;joined&nbsp;with&nbsp;.skeinforge&nbsp;and&nbsp;filename.</tt></dd></dl>
+ <dl><dt><a name="-getPreferencesFilePath"><strong>getPreferencesFilePath</strong></a>(fileName)</dt><dd><tt>Get&nbsp;the&nbsp;preferences&nbsp;file&nbsp;path,&nbsp;which&nbsp;is&nbsp;the&nbsp;home&nbsp;directory&nbsp;joined&nbsp;with&nbsp;.skeinforge&nbsp;and&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="-readPreferences"><strong>readPreferences</strong></a>(preferences)</dt><dd><tt>Set&nbsp;an&nbsp;archive&nbsp;to&nbsp;the&nbsp;preferences&nbsp;read&nbsp;from&nbsp;a&nbsp;file.</tt></dd></dl>
<dl><dt><a name="-readPreferencesFromText"><strong>readPreferencesFromText</strong></a>(preferences, text)</dt><dd><tt>Set&nbsp;an&nbsp;archive&nbsp;to&nbsp;the&nbsp;preferences&nbsp;read&nbsp;from&nbsp;a&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-setArchiveToLine"><strong>setArchiveToLine</strong></a>(lineIndex, lines, preferenceTable)</dt><dd><tt>Set&nbsp;an&nbsp;archive&nbsp;to&nbsp;a&nbsp;preference&nbsp;line.</tt></dd></dl>
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.triangle_mesh.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.triangle_mesh.html
index 0b277099..f756710d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.triangle_mesh.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.triangle_mesh.html
@@ -13,28 +13,28 @@
&nbsp;<br>
It&nbsp;can&nbsp;read&nbsp;from&nbsp;and&nbsp;write&nbsp;to&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;(.gts)&nbsp;file.<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;slice&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
-contains&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;triangle_mesh.py.<br>
+The&nbsp;following&nbsp;examples&nbsp;carve&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
+contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;triangle_mesh.py.<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
-&gt;&gt;&gt;&nbsp;import&nbsp;slice<br>
-&gt;&gt;&gt;&nbsp;slice.main()<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;sliced.<br>
-The&nbsp;sliced&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_slice.gcode<br>
-It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;slice&nbsp;the&nbsp;file.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;carve<br>
+&gt;&gt;&gt;&nbsp;carve.main()<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;carved.<br>
+The&nbsp;carved&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_carve.gcode<br>
+It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;carve&nbsp;the&nbsp;file.<br>
&nbsp;<br>
&nbsp;<br>
-&gt;&gt;&gt;&nbsp;slice.writeOutput()<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;sliced.<br>
-The&nbsp;sliced&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_slice.gcode<br>
-It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;slice&nbsp;the&nbsp;file.<br>
+&gt;&gt;&gt;&nbsp;carve.writeOutput()<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;is&nbsp;being&nbsp;carved.<br>
+The&nbsp;carved&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_carve.gcode<br>
+It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;carve&nbsp;the&nbsp;file.<br>
&nbsp;<br>
&nbsp;<br>
-&gt;&gt;&gt;&nbsp;slice.getSliceGcode("<br>
+&gt;&gt;&gt;&nbsp;carve.getCarveGcode("<br>
54&nbsp;162&nbsp;108&nbsp;Number&nbsp;of&nbsp;Vertices,Number&nbsp;of&nbsp;Edges,Number&nbsp;of&nbsp;Faces<br>
-5.800000000000001&nbsp;5.341893939393939&nbsp;4.017841892579603&nbsp;Vertex&nbsp;Coordinates&nbsp;XYZ<br>
5.800000000000001&nbsp;5.341893939393939&nbsp;4.017841892579603<br>
@@ -50,9 +50,13 @@ many&nbsp;lines&nbsp;of&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;vertices,&n
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
-</td><td width="25%" valign=top><a href="cStringIO.html">cStringIO</a><br>
+<a href="cStringIO.html">cStringIO</a><br>
+</td><td width="25%" valign=top><a href="cmath.html">cmath</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+</td><td width="25%" valign=top><a href="math.html">math</a><br>
+</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
@@ -63,6 +67,7 @@ many&nbsp;lines&nbsp;of&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;vertices,&n
<dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html#Edge">Edge</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html#EdgePair">EdgePair</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html#Face">Face</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html#LoopArea">LoopArea</a>
</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html#TriangleMesh">TriangleMesh</a>
</font></dt></dl>
<p>
@@ -123,6 +128,20 @@ many&nbsp;lines&nbsp;of&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;vertices,&n
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="LoopArea">class <strong>LoopArea</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>Complex&nbsp;loop&nbsp;with&nbsp;an&nbsp;area.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="LoopArea-__init__"><strong>__init__</strong></a>(self, loop)</dt></dl>
+
+<dl><dt><a name="LoopArea-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;flat&nbsp;path.</tt></dd></dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="TriangleMesh">class <strong>TriangleMesh</strong></a></font></td></tr>
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
@@ -133,10 +152,36 @@ many&nbsp;lines&nbsp;of&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;vertices,&n
<dl><dt><a name="TriangleMesh-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#TriangleMesh">TriangleMesh</a>.</tt></dd></dl>
-<dl><dt><a name="TriangleMesh-getFromGNUTriangulatedSurfaceText"><strong>getFromGNUTriangulatedSurfaceText</strong></a>(self, gnuTriangulatedSurfaceText)</dt><dd><tt>Initialize&nbsp;from&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;Text.</tt></dd></dl>
+<dl><dt><a name="TriangleMesh-addToZoneArray"><strong>addToZoneArray</strong></a>(self, point, zoneArray, z)</dt><dd><tt>Add&nbsp;a&nbsp;height&nbsp;to&nbsp;the&nbsp;zone&nbsp;array.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-getBridgeDirection"><strong>getBridgeDirection</strong></a>(self, layerLoops)</dt><dd><tt>Get&nbsp;span&nbsp;direction&nbsp;for&nbsp;the&nbsp;majority&nbsp;of&nbsp;the&nbsp;overhanging&nbsp;extrusion&nbsp;perimeter,&nbsp;if&nbsp;any.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-getBridgeLoops"><strong>getBridgeLoops</strong></a>(self, loop)</dt><dd><tt>Get&nbsp;the&nbsp;inset&nbsp;bridge&nbsp;loops&nbsp;from&nbsp;the&nbsp;loop.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-getCarveCornerMaximum"><strong>getCarveCornerMaximum</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;corner&nbsp;maximum&nbsp;of&nbsp;the&nbsp;vertices.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-getCarveCornerMinimum"><strong>getCarveCornerMinimum</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;corner&nbsp;minimum&nbsp;of&nbsp;the&nbsp;vertices.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-getCarveLayerThickness"><strong>getCarveLayerThickness</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;layer&nbsp;thickness.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-getCarveRotatedBoundaryLayers"><strong>getCarveRotatedBoundaryLayers</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;rotated&nbsp;boundary&nbsp;layers.</tt></dd></dl>
<dl><dt><a name="TriangleMesh-getGNUTriangulatedSurfaceText"><strong>getGNUTriangulatedSurfaceText</strong></a>(self)</dt><dd><tt>Get&nbsp;this&nbsp;mesh&nbsp;in&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;(.gts)&nbsp;format.</tt></dd></dl>
+<dl><dt><a name="TriangleMesh-getLoopsFromMesh"><strong>getLoopsFromMesh</strong></a>(self, z)</dt><dd><tt>Get&nbsp;loops&nbsp;from&nbsp;a&nbsp;carve&nbsp;of&nbsp;a&nbsp;mesh.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-getZAddExtruderPaths"><strong>getZAddExtruderPaths</strong></a>(self, z)</dt><dd><tt>Get&nbsp;next&nbsp;z&nbsp;and&nbsp;add&nbsp;extruder&nbsp;loops.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-setCarveBridgeLayerThickness"><strong>setCarveBridgeLayerThickness</strong></a>(self, bridgeLayerThickness)</dt><dd><tt>Set&nbsp;the&nbsp;bridge&nbsp;layer&nbsp;thickness.&nbsp;&nbsp;If&nbsp;the&nbsp;infill&nbsp;is&nbsp;not&nbsp;in&nbsp;the&nbsp;direction&nbsp;of&nbsp;the&nbsp;bridge,&nbsp;the&nbsp;bridge&nbsp;layer&nbsp;thickness&nbsp;should&nbsp;be&nbsp;given&nbsp;as&nbsp;None&nbsp;or&nbsp;not&nbsp;set&nbsp;at&nbsp;all.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-setCarveExtrusionWidth"><strong>setCarveExtrusionWidth</strong></a>(self, extrusionWidth)</dt><dd><tt>Set&nbsp;the&nbsp;extrusion&nbsp;width.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-setCarveImportCoarseness"><strong>setCarveImportCoarseness</strong></a>(self, importCoarseness)</dt><dd><tt>Set&nbsp;the&nbsp;import&nbsp;coarseness.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-setCarveIsCorrectMesh"><strong>setCarveIsCorrectMesh</strong></a>(self, isCorrectMesh)</dt><dd><tt>Set&nbsp;the&nbsp;is&nbsp;correct&nbsp;mesh&nbsp;flag.</tt></dd></dl>
+
+<dl><dt><a name="TriangleMesh-setCarveLayerThickness"><strong>setCarveLayerThickness</strong></a>(self, layerThickness)</dt><dd><tt>Set&nbsp;the&nbsp;layer&nbsp;thickness.</tt></dd></dl>
+
<dl><dt><a name="TriangleMesh-setEdgesForAllFaces"><strong>setEdgesForAllFaces</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;face&nbsp;edges&nbsp;of&nbsp;all&nbsp;the&nbsp;faces.</tt></dd></dl>
</td></tr></table></td></tr></table><p>
@@ -146,8 +191,29 @@ many&nbsp;lines&nbsp;of&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;vertices,&n
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getCommonVertexIndex"><strong>getCommonVertexIndex</strong></a>(edgeFirst, edgeSecond)</dt><dd><tt>Get&nbsp;the&nbsp;vertex&nbsp;index&nbsp;that&nbsp;both&nbsp;edges&nbsp;have&nbsp;in&nbsp;common.</tt></dd></dl>
- <dl><dt><a name="-getTriangleMesh"><strong>getTriangleMesh</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Slice&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;slice&nbsp;the&nbsp;first&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-addEdgePair"><strong>addEdgePair</strong></a>(edgePairTable, edges, faceEdgeIndex, remainingEdgeIndex, remainingEdgeTable)</dt><dd><tt>Add&nbsp;edge&nbsp;pair&nbsp;to&nbsp;the&nbsp;edge&nbsp;pair&nbsp;table.</tt></dd></dl>
+ <dl><dt><a name="-addLoopToPointTable"><strong>addLoopToPointTable</strong></a>(loop, pointTable)</dt><dd><tt>Add&nbsp;the&nbsp;points&nbsp;in&nbsp;the&nbsp;loop&nbsp;to&nbsp;the&nbsp;point&nbsp;table.</tt></dd></dl>
+ <dl><dt><a name="-addPointsAtZ"><strong>addPointsAtZ</strong></a>(edgePair, points, radius, vertices, z)</dt><dd><tt>Add&nbsp;point&nbsp;complexes&nbsp;on&nbsp;the&nbsp;segment&nbsp;between&nbsp;the&nbsp;edge&nbsp;intersections&nbsp;with&nbsp;z.</tt></dd></dl>
+ <dl><dt><a name="-addWithLeastLength"><strong>addWithLeastLength</strong></a>(loops, point, shortestAdditionalLength)</dt><dd><tt>Insert&nbsp;a&nbsp;point&nbsp;into&nbsp;a&nbsp;loop,&nbsp;at&nbsp;the&nbsp;index&nbsp;at&nbsp;which&nbsp;the&nbsp;loop&nbsp;would&nbsp;be&nbsp;shortest.</tt></dd></dl>
+ <dl><dt><a name="-compareArea"><strong>compareArea</strong></a>(loopArea, otherLoopArea)</dt><dd><tt>Get&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;sort&nbsp;loop&nbsp;areas&nbsp;in&nbsp;descending&nbsp;order&nbsp;of&nbsp;area.</tt></dd></dl>
+ <dl><dt><a name="-getAdditionalLoopLength"><strong>getAdditionalLoopLength</strong></a>(loop, point, pointIndex)</dt><dd><tt>Get&nbsp;the&nbsp;additional&nbsp;length&nbsp;added&nbsp;by&nbsp;inserting&nbsp;a&nbsp;point&nbsp;into&nbsp;a&nbsp;loop.</tt></dd></dl>
+ <dl><dt><a name="-getCarveIntersectionFromEdge"><strong>getCarveIntersectionFromEdge</strong></a>(edge, vertices, z)</dt><dd><tt>Get&nbsp;the&nbsp;complex&nbsp;where&nbsp;the&nbsp;carve&nbsp;intersects&nbsp;the&nbsp;edge.</tt></dd></dl>
+ <dl><dt><a name="-getCommonVertexIndex"><strong>getCommonVertexIndex</strong></a>(edgeFirst, edgeSecond)</dt><dd><tt>Get&nbsp;the&nbsp;vertex&nbsp;index&nbsp;that&nbsp;both&nbsp;edges&nbsp;have&nbsp;in&nbsp;common.</tt></dd></dl>
+ <dl><dt><a name="-getDoubledRoundZ"><strong>getDoubledRoundZ</strong></a>(overhangingSegment, segmentRoundZ)</dt><dd><tt>Get&nbsp;doubled&nbsp;plane&nbsp;angle&nbsp;around&nbsp;z&nbsp;of&nbsp;the&nbsp;overhanging&nbsp;segment.</tt></dd></dl>
+ <dl><dt><a name="-getLoopsFromCorrectMesh"><strong>getLoopsFromCorrectMesh</strong></a>(edges, faces, vertices, z)</dt><dd><tt>Get&nbsp;loops&nbsp;from&nbsp;a&nbsp;carve&nbsp;of&nbsp;a&nbsp;correct&nbsp;mesh.</tt></dd></dl>
+ <dl><dt><a name="-getLoopsFromUnprovenMesh"><strong>getLoopsFromUnprovenMesh</strong></a>(edges, extrusionWidth, faces, importCoarseness, vertices, z)</dt><dd><tt>Get&nbsp;loops&nbsp;from&nbsp;a&nbsp;carve&nbsp;of&nbsp;an&nbsp;unproven&nbsp;mesh.</tt></dd></dl>
+ <dl><dt><a name="-getLoopsInDescendingOrderOfArea"><strong>getLoopsInDescendingOrderOfArea</strong></a>(loops)</dt><dd><tt>Get&nbsp;the&nbsp;lowest&nbsp;zone&nbsp;index.</tt></dd></dl>
+ <dl><dt><a name="-getLowestZoneIndex"><strong>getLowestZoneIndex</strong></a>(zoneArray, z)</dt><dd><tt>Get&nbsp;the&nbsp;lowest&nbsp;zone&nbsp;index.</tt></dd></dl>
+ <dl><dt><a name="-getNextEdgeIndexAroundZ"><strong>getNextEdgeIndexAroundZ</strong></a>(edge, faces, remainingEdgeTable)</dt><dd><tt>Get&nbsp;the&nbsp;next&nbsp;edge&nbsp;index&nbsp;in&nbsp;the&nbsp;mesh&nbsp;carve.</tt></dd></dl>
+ <dl><dt><a name="-getOverhangDirection"><strong>getOverhangDirection</strong></a>(belowOutsetLoops, segmentBegin, segmentEnd)</dt><dd><tt>Add&nbsp;to&nbsp;span&nbsp;direction&nbsp;from&nbsp;the&nbsp;endpoint&nbsp;segments&nbsp;which&nbsp;overhang&nbsp;the&nbsp;layer&nbsp;below.</tt></dd></dl>
+ <dl><dt><a name="-getOverlapRatio"><strong>getOverlapRatio</strong></a>(loop, pointTable)</dt><dd><tt>Get&nbsp;the&nbsp;overlap&nbsp;ratio&nbsp;between&nbsp;the&nbsp;loop&nbsp;and&nbsp;the&nbsp;point&nbsp;table.</tt></dd></dl>
+ <dl><dt><a name="-getPath"><strong>getPath</strong></a>(edges, pathIndexes, loop, z)</dt><dd><tt>Get&nbsp;the&nbsp;path&nbsp;from&nbsp;the&nbsp;edge&nbsp;intersections.</tt></dd></dl>
+ <dl><dt><a name="-getRemainingEdgeTable"><strong>getRemainingEdgeTable</strong></a>(edges, vertices, z)</dt><dd><tt>Get&nbsp;the&nbsp;remaining&nbsp;edge&nbsp;hashtable.</tt></dd></dl>
+ <dl><dt><a name="-getSharedFace"><strong>getSharedFace</strong></a>(firstEdge, faces, secondEdge)</dt><dd><tt>Get&nbsp;the&nbsp;face&nbsp;which&nbsp;is&nbsp;shared&nbsp;by&nbsp;two&nbsp;edges.</tt></dd></dl>
+ <dl><dt><a name="-getTriangleMesh"><strong>getTriangleMesh</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Carve&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;carve&nbsp;the&nbsp;first&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-isInline"><strong>isInline</strong></a>(beginComplex, centerComplex, endComplex)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;three&nbsp;complex&nbsp;points&nbsp;form&nbsp;a&nbsp;line.</tt></dd></dl>
+ <dl><dt><a name="-isPathAdded"><strong>isPathAdded</strong></a>(edges, faces, loops, remainingEdgeTable, vertices, z)</dt><dd><tt>Get&nbsp;the&nbsp;path&nbsp;indexes&nbsp;around&nbsp;a&nbsp;triangle&nbsp;mesh&nbsp;carve&nbsp;and&nbsp;add&nbsp;the&nbsp;path&nbsp;to&nbsp;the&nbsp;flat&nbsp;loops.</tt></dd></dl>
+ <dl><dt><a name="-isZInEdge"><strong>isZInEdge</strong></a>(edge, vertices, z)</dt><dd><tt>Determine&nbsp;if&nbsp;z&nbsp;is&nbsp;inside&nbsp;the&nbsp;edge.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vec3.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vec3.html
index ccf9ddf9..e692a441 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vec3.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vec3.html
@@ -8,7 +8,7 @@
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.skeinforge_utilities.html"><font color="#ffffff">skeinforge_utilities</font></a>.vec3</strong></big></big> ($Date: 2008/21/04 $)</font></td
><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/vec3.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/vec3.py</a></font></td></tr></table>
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/vec3.pyc">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/vec3.pyc</a></font></td></tr></table>
<p><tt><a href="#Vec3">Vec3</a>&nbsp;is&nbsp;a&nbsp;three&nbsp;dimensional&nbsp;vector&nbsp;class.<br>
&nbsp;<br>
#Class&nbsp;vec3&nbsp;is&nbsp;deprecated,&nbsp;please&nbsp;use&nbsp;<a href="#Vec3">Vec3</a>&nbsp;instead.<br>
@@ -22,11 +22,11 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;<a href="#Vec3">Vec3</a>&nbsp;use.<br>
&gt;&gt;&gt;&nbsp;pythagoras&nbsp;=&nbsp;<a href="#Vec3">Vec3</a>(&nbsp;3,&nbsp;4,&nbsp;0&nbsp;)<br>
&gt;&gt;&gt;&nbsp;pythagoras<br>
3.0,&nbsp;4.0,&nbsp;0.0<br>
-&gt;&gt;&gt;&nbsp;pythagoras.length()<br>
+&gt;&gt;&gt;&nbsp;pythagoras.magnitude()<br>
5.0<br>
-&gt;&gt;&gt;&nbsp;pythagoras.length2()<br>
+&gt;&gt;&gt;&nbsp;pythagoras.magnitudeSquared()<br>
25<br>
-&gt;&gt;&gt;&nbsp;triplePythagoras&nbsp;=&nbsp;pythagoras.times(&nbsp;3.0&nbsp;)<br>
+&gt;&gt;&gt;&nbsp;triplePythagoras&nbsp;=&nbsp;pythagoras&nbsp;*&nbsp;3.0<br>
&gt;&gt;&gt;&nbsp;triplePythagoras<br>
9.0,&nbsp;12.0,&nbsp;0.0<br>
&gt;&gt;&gt;&nbsp;plane&nbsp;=&nbsp;pythagoras.dropAxis(&nbsp;2&nbsp;)<br>
@@ -41,7 +41,8 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;<a href="#Vec3">Vec3</a>&nbsp;use.<br>
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
-</td><td width="25%" valign=top></td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+</td><td width="25%" valign=top><a href="operator.html">operator</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
@@ -61,70 +62,86 @@ Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;<a href="#Vec3">Vec3</a>&nbsp;use.<br>
<td colspan=2><tt>A&nbsp;three&nbsp;dimensional&nbsp;vector&nbsp;class.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="Vec3-__eq__"><strong>__eq__</strong></a>(self, another)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;identical&nbsp;to&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__abs__"><strong>__abs__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;magnitude&nbsp;of&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
-<dl><dt><a name="Vec3-__hash__"><strong>__hash__</strong></a>(self)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;identical&nbsp;to&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__add__"><strong>__add__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;sum&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__copy__"><strong>__copy__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;copy&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__div__"><strong>__div__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__eq__"><strong>__eq__</strong></a>(self, other)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__floordiv__"><strong>__floordiv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;floor&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__hash__"><strong>__hash__</strong></a>(self)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__iadd__"><strong>__iadd__</strong></a>(self, other)</dt><dd><tt>Add&nbsp;other&nbsp;<a href="#Vec3">Vec3</a>&nbsp;to&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__idiv__"><strong>__idiv__</strong></a>(self, other)</dt><dd><tt>Divide&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__ifloordiv__"><strong>__ifloordiv__</strong></a>(self, other)</dt><dd><tt>Floor&nbsp;divide&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-__imul__"><strong>__imul__</strong></a>(self, other)</dt><dd><tt>Multiply&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
<dl><dt><a name="Vec3-__init__"><strong>__init__</strong></a>(self, x<font color="#909090">=0.0</font>, y<font color="#909090">=0.0</font>, z<font color="#909090">=0.0</font>)</dt></dl>
-<dl><dt><a name="Vec3-__ne__"><strong>__ne__</strong></a>(self, another)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;not&nbsp;identical&nbsp;to&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__isub__"><strong>__isub__</strong></a>(self, other)</dt><dd><tt>Subtract&nbsp;other&nbsp;<a href="#Vec3">Vec3</a>&nbsp;from&nbsp;this&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+<dl><dt><a name="Vec3-__itruediv__"><strong>__itruediv__</strong></a>(self, other)</dt><dd><tt>True&nbsp;divide&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
-<dl><dt><a name="Vec3-add"><strong>add</strong></a>(self, another)</dt><dd><tt>Add&nbsp;another&nbsp;<a href="#Vec3">Vec3</a>&nbsp;to&nbsp;this&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__mul__"><strong>__mul__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;multiplying&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-distance"><strong>distance</strong></a>(self, another)</dt><dd><tt>Get&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__ne__"><strong>__ne__</strong></a>(self, other)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;not&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-distance2"><strong>distance2</strong></a>(self, another)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__neg__"><strong>__neg__</strong></a>(self)</dt></dl>
-<dl><dt><a name="Vec3-distance2XYPlane"><strong>distance2XYPlane</strong></a>(self, another)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;another&nbsp;one&nbsp;in&nbsp;the&nbsp;xy&nbsp;plane.</tt></dd></dl>
+<dl><dt><a name="Vec3-__nonzero__"><strong>__nonzero__</strong></a>(self)</dt></dl>
-<dl><dt><a name="Vec3-distanceXYPlane"><strong>distanceXYPlane</strong></a>(self, another)</dt><dd><tt>Get&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;another&nbsp;one&nbsp;in&nbsp;the&nbsp;xy&nbsp;plane.</tt></dd></dl>
+<dl><dt><a name="Vec3-__pos__"><strong>__pos__</strong></a> = <a href="#Vec3-__copy__">__copy__</a>(self)</dt></dl>
-<dl><dt><a name="Vec3-dot"><strong>dot</strong></a>(self, another)</dt><dd><tt>Calculate&nbsp;the&nbsp;dot&nbsp;product&nbsp;of&nbsp;this&nbsp;vector&nbsp;with&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__rdiv__"><strong>__rdiv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-dropAxis"><strong>dropAxis</strong></a>(self, which)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;by&nbsp;removing&nbsp;one&nbsp;axis&nbsp;of&nbsp;this&nbsp;one.<br>
-&nbsp;<br>
-Keyword&nbsp;arguments:<br>
-which&nbsp;--&nbsp;the&nbsp;axis&nbsp;to&nbsp;drop&nbsp;(0=X,&nbsp;1=Y,&nbsp;2=Z)</tt></dd></dl>
+<dl><dt><a name="Vec3-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
-<dl><dt><a name="Vec3-equals"><strong>equals</strong></a>(self, another)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;identical&nbsp;to&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__rfloordiv__"><strong>__rfloordiv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;floor&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-getFromVec3"><strong>getFromVec3</strong></a>(self, another)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;identical&nbsp;to&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-__rmul__"><strong>__rmul__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;multiplying&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-getFromXYZ"><strong>getFromXYZ</strong></a>(self, x, y, z)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;with&nbsp;the&nbsp;specified&nbsp;x,&nbsp;y,&nbsp;and&nbsp;z&nbsp;components.</tt></dd></dl>
+<dl><dt><a name="Vec3-__rtruediv__"><strong>__rtruediv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;true&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-length"><strong>length</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;length&nbsp;of&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+<dl><dt><a name="Vec3-__sub__"><strong>__sub__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;difference&nbsp;between&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-length2"><strong>length2</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;length&nbsp;of&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+<dl><dt><a name="Vec3-__truediv__"><strong>__truediv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;true&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-length2XYPlane"><strong>length2XYPlane</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;length&nbsp;of&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>&nbsp;in&nbsp;the&nbsp;xy&nbsp;plane.</tt></dd></dl>
+<dl><dt><a name="Vec3-copy"><strong>copy</strong></a> = <a href="#Vec3-__copy__">__copy__</a>(self)</dt></dl>
-<dl><dt><a name="Vec3-lengthXYPlane"><strong>lengthXYPlane</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;length&nbsp;of&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+<dl><dt><a name="Vec3-cross"><strong>cross</strong></a>(self, other)</dt><dd><tt>Calculate&nbsp;the&nbsp;cross&nbsp;product&nbsp;of&nbsp;this&nbsp;vector&nbsp;with&nbsp;other&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-minus"><strong>minus</strong></a>(self, subtractVec3)</dt><dd><tt>Get&nbsp;the&nbsp;difference&nbsp;between&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>&nbsp;and&nbsp;another&nbsp;one.<br>
-&nbsp;<br>
-Keyword&nbsp;arguments:<br>
-subtractVec3&nbsp;--&nbsp;<a href="#Vec3">Vec3</a>&nbsp;which&nbsp;will&nbsp;be&nbsp;subtracted&nbsp;from&nbsp;the&nbsp;original</tt></dd></dl>
+<dl><dt><a name="Vec3-distance"><strong>distance</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-multiply"><strong>multiply</strong></a>(self, another)</dt><dd><tt>Multiply&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;vector&nbsp;by&nbsp;the&nbsp;corresponding&nbsp;component&nbsp;of&nbsp;another&nbsp;vector.</tt></dd></dl>
+<dl><dt><a name="Vec3-distanceSquared"><strong>distanceSquared</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-normalize"><strong>normalize</strong></a>(self)</dt><dd><tt>Scale&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;so&nbsp;that&nbsp;it&nbsp;has&nbsp;a&nbsp;length&nbsp;of&nbsp;1.&nbsp;If&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;has&nbsp;a&nbsp;length&nbsp;of&nbsp;0,&nbsp;this&nbsp;method&nbsp;has&nbsp;no&nbsp;effect.</tt></dd></dl>
+<dl><dt><a name="Vec3-dot"><strong>dot</strong></a>(self, other)</dt><dd><tt>Calculate&nbsp;the&nbsp;dot&nbsp;product&nbsp;of&nbsp;this&nbsp;vector&nbsp;with&nbsp;other&nbsp;one.</tt></dd></dl>
-<dl><dt><a name="Vec3-plus"><strong>plus</strong></a>(self, plusVec3)</dt><dd><tt>Get&nbsp;the&nbsp;sum&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;and&nbsp;another&nbsp;one.<br>
+<dl><dt><a name="Vec3-dropAxis"><strong>dropAxis</strong></a>(self, which)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;by&nbsp;removing&nbsp;one&nbsp;axis&nbsp;of&nbsp;this&nbsp;one.<br>
&nbsp;<br>
Keyword&nbsp;arguments:<br>
-plusVec3&nbsp;--&nbsp;<a href="#Vec3">Vec3</a>&nbsp;which&nbsp;will&nbsp;be&nbsp;added&nbsp;to&nbsp;the&nbsp;original</tt></dd></dl>
+which&nbsp;--&nbsp;the&nbsp;axis&nbsp;to&nbsp;drop&nbsp;(0=X,&nbsp;1=Y,&nbsp;2=Z)</tt></dd></dl>
-<dl><dt><a name="Vec3-scale"><strong>scale</strong></a>(self, multiplier)</dt><dd><tt>Scale&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;a&nbsp;multiplier.</tt></dd></dl>
+<dl><dt><a name="Vec3-getNormalized"><strong>getNormalized</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;normalized&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
-<dl><dt><a name="Vec3-setToVec3"><strong>setToVec3</strong></a>(self, another)</dt><dd><tt>Set&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;to&nbsp;be&nbsp;identical&nbsp;to&nbsp;another&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-magnitude"><strong>magnitude</strong></a> = <a href="#Vec3-__abs__">__abs__</a>(self)</dt></dl>
-<dl><dt><a name="Vec3-setToXYZ"><strong>setToXYZ</strong></a>(self, x, y, z)</dt><dd><tt>Set&nbsp;the&nbsp;x,&nbsp;y,&nbsp;and&nbsp;z&nbsp;components&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+<dl><dt><a name="Vec3-magnitudeSquared"><strong>magnitudeSquared</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;magnitude&nbsp;of&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-normalize"><strong>normalize</strong></a>(self)</dt><dd><tt>Scale&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;so&nbsp;that&nbsp;it&nbsp;has&nbsp;a&nbsp;magnitude&nbsp;of&nbsp;1.&nbsp;If&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;has&nbsp;a&nbsp;magnitude&nbsp;of&nbsp;0,&nbsp;this&nbsp;method&nbsp;has&nbsp;no&nbsp;effect.</tt></dd></dl>
-<dl><dt><a name="Vec3-subtract"><strong>subtract</strong></a>(self, another)</dt><dd><tt>Subtract&nbsp;another&nbsp;<a href="#Vec3">Vec3</a>&nbsp;from&nbsp;this&nbsp;one.</tt></dd></dl>
+<dl><dt><a name="Vec3-reflect"><strong>reflect</strong></a>(self, normal)</dt><dd><tt>Reflect&nbsp;the&nbsp;<a href="#Vec3">Vec3</a>&nbsp;across&nbsp;the&nbsp;normal,&nbsp;which&nbsp;is&nbsp;assumed&nbsp;to&nbsp;be&nbsp;normalized.</tt></dd></dl>
-<dl><dt><a name="Vec3-times"><strong>times</strong></a>(self, multiplier)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vec3">Vec3</a>&nbsp;by&nbsp;multiplying&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one&nbsp;by&nbsp;a&nbsp;multiplier.</tt></dd></dl>
+<dl><dt><a name="Vec3-setToVec3"><strong>setToVec3</strong></a>(self, other)</dt><dd><tt>Set&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>&nbsp;to&nbsp;be&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vec3-setToXYZ"><strong>setToXYZ</strong></a>(self, x, y, z)</dt><dd><tt>Set&nbsp;the&nbsp;x,&nbsp;y,&nbsp;and&nbsp;z&nbsp;components&nbsp;of&nbsp;this&nbsp;<a href="#Vec3">Vec3</a>.</tt></dd></dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vector3.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vector3.html
new file mode 100644
index 00000000..2f3be7b5
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.skeinforge_utilities.vector3.html
@@ -0,0 +1,171 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.skeinforge_utilities.vector3</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.<a href="skeinforge_tools.skeinforge_utilities.html"><font color="#ffffff">skeinforge_utilities</font></a>.vector3</strong></big></big> ($Date: 2008/21/04 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/vector3.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/skeinforge_utilities/vector3.py</a></font></td></tr></table>
+ <p><tt>Vec3&nbsp;is&nbsp;a&nbsp;three&nbsp;dimensional&nbsp;vector&nbsp;class.<br>
+&nbsp;<br>
+Below&nbsp;are&nbsp;examples&nbsp;of&nbsp;<a href="#Vector3">Vector3</a>&nbsp;use.<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;from&nbsp;vector3&nbsp;import&nbsp;<a href="#Vector3">Vector3</a><br>
+&gt;&gt;&gt;&nbsp;origin&nbsp;=&nbsp;<a href="#Vector3">Vector3</a>()<br>
+&gt;&gt;&gt;&nbsp;origin<br>
+0.0,&nbsp;0.0,&nbsp;0.0<br>
+&gt;&gt;&gt;&nbsp;pythagoras&nbsp;=&nbsp;<a href="#Vector3">Vector3</a>(&nbsp;3,&nbsp;4,&nbsp;0&nbsp;)<br>
+&gt;&gt;&gt;&nbsp;pythagoras<br>
+3.0,&nbsp;4.0,&nbsp;0.0<br>
+&gt;&gt;&gt;&nbsp;pythagoras.magnitude()<br>
+5.0<br>
+&gt;&gt;&gt;&nbsp;pythagoras.magnitudeSquared()<br>
+25<br>
+&gt;&gt;&gt;&nbsp;triplePythagoras&nbsp;=&nbsp;pythagoras&nbsp;*&nbsp;3.0<br>
+&gt;&gt;&gt;&nbsp;triplePythagoras<br>
+9.0,&nbsp;12.0,&nbsp;0.0<br>
+&gt;&gt;&gt;&nbsp;plane&nbsp;=&nbsp;pythagoras.dropAxis(&nbsp;2&nbsp;)<br>
+&gt;&gt;&gt;&nbsp;plane<br>
+(3+4j)</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+</td><td width="25%" valign=top><a href="math.html">math</a><br>
+</td><td width="25%" valign=top><a href="operator.html">operator</a><br>
+</td><td width="25%" valign=top></td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="skeinforge_tools.skeinforge_utilities.vector3.html#Vector3">Vector3</a>
+</font></dt></dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="Vector3">class <strong>Vector3</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;three&nbsp;dimensional&nbsp;vector&nbsp;class.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="Vector3-__abs__"><strong>__abs__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;magnitude&nbsp;of&nbsp;the&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__add__"><strong>__add__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;sum&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__copy__"><strong>__copy__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;copy&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__div__"><strong>__div__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__eq__"><strong>__eq__</strong></a>(self, other)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__floordiv__"><strong>__floordiv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;floor&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__hash__"><strong>__hash__</strong></a>(self)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__iadd__"><strong>__iadd__</strong></a>(self, other)</dt><dd><tt>Add&nbsp;other&nbsp;<a href="#Vector3">Vector3</a>&nbsp;to&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__idiv__"><strong>__idiv__</strong></a>(self, other)</dt><dd><tt>Divide&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__ifloordiv__"><strong>__ifloordiv__</strong></a>(self, other)</dt><dd><tt>Floor&nbsp;divide&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__imul__"><strong>__imul__</strong></a>(self, other)</dt><dd><tt>Multiply&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__init__"><strong>__init__</strong></a>(self, x<font color="#909090">=0.0</font>, y<font color="#909090">=0.0</font>, z<font color="#909090">=0.0</font>)</dt></dl>
+
+<dl><dt><a name="Vector3-__isub__"><strong>__isub__</strong></a>(self, other)</dt><dd><tt>Subtract&nbsp;other&nbsp;<a href="#Vector3">Vector3</a>&nbsp;from&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__itruediv__"><strong>__itruediv__</strong></a>(self, other)</dt><dd><tt>True&nbsp;divide&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__mul__"><strong>__mul__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;multiplying&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__ne__"><strong>__ne__</strong></a>(self, other)</dt><dd><tt>Determine&nbsp;whether&nbsp;this&nbsp;vector&nbsp;is&nbsp;not&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__neg__"><strong>__neg__</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="Vector3-__nonzero__"><strong>__nonzero__</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="Vector3-__pos__"><strong>__pos__</strong></a> = <a href="#Vector3-__copy__">__copy__</a>(self)</dt></dl>
+
+<dl><dt><a name="Vector3-__rdiv__"><strong>__rdiv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__rfloordiv__"><strong>__rfloordiv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;floor&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__rmul__"><strong>__rmul__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;multiplying&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__rtruediv__"><strong>__rtruediv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;true&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__sub__"><strong>__sub__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;difference&nbsp;between&nbsp;the&nbsp;<a href="#Vector3">Vector3</a>&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-__truediv__"><strong>__truediv__</strong></a>(self, other)</dt><dd><tt>Get&nbsp;a&nbsp;new&nbsp;<a href="#Vector3">Vector3</a>&nbsp;by&nbsp;true&nbsp;dividing&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-copy"><strong>copy</strong></a> = <a href="#Vector3-__copy__">__copy__</a>(self)</dt></dl>
+
+<dl><dt><a name="Vector3-cross"><strong>cross</strong></a>(self, other)</dt><dd><tt>Calculate&nbsp;the&nbsp;cross&nbsp;product&nbsp;of&nbsp;this&nbsp;vector&nbsp;with&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-distance"><strong>distance</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-distanceSquared"><strong>distanceSquared</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;Euclidean&nbsp;distance&nbsp;between&nbsp;this&nbsp;vector&nbsp;and&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-dot"><strong>dot</strong></a>(self, other)</dt><dd><tt>Calculate&nbsp;the&nbsp;dot&nbsp;product&nbsp;of&nbsp;this&nbsp;vector&nbsp;with&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-dropAxis"><strong>dropAxis</strong></a>(self, which)</dt><dd><tt>Get&nbsp;a&nbsp;complex&nbsp;by&nbsp;removing&nbsp;one&nbsp;axis&nbsp;of&nbsp;this&nbsp;one.<br>
+&nbsp;<br>
+Keyword&nbsp;arguments:<br>
+which&nbsp;--&nbsp;the&nbsp;axis&nbsp;to&nbsp;drop&nbsp;(0=X,&nbsp;1=Y,&nbsp;2=Z)</tt></dd></dl>
+
+<dl><dt><a name="Vector3-getNormalized"><strong>getNormalized</strong></a>(self, other)</dt><dd><tt>Get&nbsp;the&nbsp;normalized&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-magnitude"><strong>magnitude</strong></a> = <a href="#Vector3-__abs__">__abs__</a>(self)</dt></dl>
+
+<dl><dt><a name="Vector3-magnitudeSquared"><strong>magnitudeSquared</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;square&nbsp;of&nbsp;the&nbsp;magnitude&nbsp;of&nbsp;the&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-normalize"><strong>normalize</strong></a>(self)</dt><dd><tt>Scale&nbsp;each&nbsp;component&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>&nbsp;so&nbsp;that&nbsp;it&nbsp;has&nbsp;a&nbsp;magnitude&nbsp;of&nbsp;1.&nbsp;If&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>&nbsp;has&nbsp;a&nbsp;magnitude&nbsp;of&nbsp;0,&nbsp;this&nbsp;method&nbsp;has&nbsp;no&nbsp;effect.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-reflect"><strong>reflect</strong></a>(self, normal)</dt><dd><tt>Reflect&nbsp;the&nbsp;<a href="#Vector3">Vector3</a>&nbsp;across&nbsp;the&nbsp;normal,&nbsp;which&nbsp;is&nbsp;assumed&nbsp;to&nbsp;be&nbsp;normalized.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-setToVec3"><strong>setToVec3</strong></a>(self, other)</dt><dd><tt>Set&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>&nbsp;to&nbsp;be&nbsp;identical&nbsp;to&nbsp;other&nbsp;one.</tt></dd></dl>
+
+<dl><dt><a name="Vector3-setToXYZ"><strong>setToXYZ</strong></a>(self, x, y, z)</dt><dd><tt>Set&nbsp;the&nbsp;x,&nbsp;y,&nbsp;and&nbsp;z&nbsp;components&nbsp;of&nbsp;this&nbsp;<a href="#Vector3">Vector3</a>.</tt></dd></dl>
+
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__credits__</strong> = 'Nophead &lt;http://forums.reprap.org/profile.php?12,28&gt;<font color="#c040c0">\n</font>Art of Illusion &lt;http://www.artofillusion.org/&gt;'<br>
+<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Credits</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Nophead&nbsp;&lt;<a href="http://forums.reprap.org/profile.php?12,28">http://forums.reprap.org/profile.php?12,28</a>&gt;<br>
+Art&nbsp;of&nbsp;Illusion&nbsp;&lt;<a href="http://www.artofillusion.org/">http://www.artofillusion.org/</a>&gt;</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.slice_shape.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.slice_shape.html
deleted file mode 100644
index d945e601..00000000
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.slice_shape.html
+++ /dev/null
@@ -1,237 +0,0 @@
-
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html><head><title>Python: module skeinforge_tools.slice_shape</title>
-</head><body bgcolor="#f0f0f8">
-
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
-<tr bgcolor="#7799ee">
-<td valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.slice_shape</strong></big></big> ($Date: 2008/02/05 $)</font></td
-><td align=right valign=bottom
-><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/slice_shape.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/slice_shape.py</a></font></td></tr></table>
- <p><tt>Slice&nbsp;shape&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;slice&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file.<br>
-&nbsp;<br>
-Slice&nbsp;slices&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;into&nbsp;gcode&nbsp;extrusion&nbsp;layers.&nbsp;&nbsp;The&nbsp;'Extrusion&nbsp;Diameter'&nbsp;is&nbsp;the&nbsp;diameter&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;at&nbsp;the<br>
-default&nbsp;extruder&nbsp;speed,&nbsp;this&nbsp;is&nbsp;the&nbsp;most&nbsp;important&nbsp;slice&nbsp;preference.&nbsp;&nbsp;The&nbsp;'Extrusion&nbsp;Height&nbsp;over&nbsp;Diameter'&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;extrusion<br>
-height&nbsp;over&nbsp;the&nbsp;extrusion&nbsp;diameter.&nbsp;&nbsp;The&nbsp;'Extrusion&nbsp;Width&nbsp;over&nbsp;Diameter'&nbsp;ratio&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;width&nbsp;over&nbsp;the&nbsp;extrusion<br>
-diameter.&nbsp;&nbsp;A&nbsp;ratio&nbsp;of&nbsp;one&nbsp;means&nbsp;the&nbsp;extrusion&nbsp;is&nbsp;a&nbsp;circle,&nbsp;a&nbsp;typical&nbsp;ratio&nbsp;of&nbsp;1.5&nbsp;means&nbsp;the&nbsp;extrusion&nbsp;is&nbsp;a&nbsp;wide&nbsp;oval.&nbsp;&nbsp;These&nbsp;values&nbsp;should<br>
-be&nbsp;measured&nbsp;from&nbsp;a&nbsp;test&nbsp;extrusion&nbsp;line.<br>
-&nbsp;<br>
-The&nbsp;extrusion&nbsp;fill&nbsp;density&nbsp;ratio&nbsp;that&nbsp;is&nbsp;printed&nbsp;to&nbsp;the&nbsp;console,&nbsp;(&nbsp;it&nbsp;is&nbsp;not&nbsp;a&nbsp;parameter&nbsp;)&nbsp;is&nbsp;the&nbsp;area&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;diameter&nbsp;over&nbsp;the<br>
-extrusion&nbsp;width&nbsp;over&nbsp;the&nbsp;extrusion&nbsp;height.&nbsp;&nbsp;Assuming&nbsp;the&nbsp;extrusion&nbsp;diameter&nbsp;is&nbsp;correct,&nbsp;a&nbsp;high&nbsp;value&nbsp;means&nbsp;the&nbsp;filament&nbsp;will&nbsp;be&nbsp;packed<br>
-tightly,&nbsp;and&nbsp;the&nbsp;object&nbsp;will&nbsp;be&nbsp;almost&nbsp;as&nbsp;dense&nbsp;as&nbsp;the&nbsp;filament.&nbsp;&nbsp;If&nbsp;the&nbsp;value&nbsp;is&nbsp;too&nbsp;high,&nbsp;there&nbsp;could&nbsp;be&nbsp;too&nbsp;little&nbsp;room&nbsp;for&nbsp;the&nbsp;filament,<br>
-and&nbsp;the&nbsp;extruder&nbsp;will&nbsp;end&nbsp;up&nbsp;plowing&nbsp;through&nbsp;the&nbsp;extra&nbsp;filament.&nbsp;&nbsp;A&nbsp;low&nbsp;value&nbsp;means&nbsp;the&nbsp;filaments&nbsp;will&nbsp;be&nbsp;far&nbsp;away&nbsp;from&nbsp;each&nbsp;other,&nbsp;the<br>
-object&nbsp;will&nbsp;be&nbsp;leaky&nbsp;and&nbsp;light.&nbsp;&nbsp;The&nbsp;value&nbsp;with&nbsp;the&nbsp;default&nbsp;extrusion&nbsp;preferences&nbsp;is&nbsp;around&nbsp;0.82.<br>
-&nbsp;<br>
-Rarely&nbsp;changed&nbsp;preferences&nbsp;are&nbsp;Import&nbsp;Coarseness,&nbsp;Mesh&nbsp;Type,&nbsp;Infill&nbsp;Bridge&nbsp;Width&nbsp;Over&nbsp;Thickness&nbsp;&amp;&nbsp;Infill&nbsp;in&nbsp;Direction<br>
-of&nbsp;Bridges.&nbsp;&nbsp;When&nbsp;the&nbsp;triangle&nbsp;mesh&nbsp;has&nbsp;holes&nbsp;in&nbsp;it,&nbsp;slice&nbsp;switches&nbsp;over&nbsp;to&nbsp;a&nbsp;slow&nbsp;algorithm&nbsp;that&nbsp;spans&nbsp;gaps&nbsp;in&nbsp;the&nbsp;mesh.&nbsp;&nbsp;The&nbsp;higher&nbsp;the<br>
-import&nbsp;coarseness,&nbsp;the&nbsp;wider&nbsp;the&nbsp;gaps&nbsp;in&nbsp;the&nbsp;mesh&nbsp;it&nbsp;will&nbsp;span.&nbsp;&nbsp;An&nbsp;import&nbsp;coarseness&nbsp;of&nbsp;one&nbsp;means&nbsp;it&nbsp;will&nbsp;span&nbsp;gaps&nbsp;the&nbsp;width&nbsp;of&nbsp;the<br>
-extrusion.&nbsp;&nbsp;When&nbsp;the&nbsp;Mesh&nbsp;Type&nbsp;preference&nbsp;is&nbsp;correct,&nbsp;the&nbsp;mesh&nbsp;will&nbsp;be&nbsp;accurately&nbsp;sliced,&nbsp;and&nbsp;if&nbsp;a&nbsp;hole&nbsp;is&nbsp;found,&nbsp;slice&nbsp;will&nbsp;switch&nbsp;over&nbsp;to<br>
-the&nbsp;algorithm&nbsp;that&nbsp;spans&nbsp;gaps.&nbsp;&nbsp;If&nbsp;the&nbsp;Mesh&nbsp;Type&nbsp;preference&nbsp;is&nbsp;Unproven,&nbsp;slice&nbsp;will&nbsp;use&nbsp;the&nbsp;gap&nbsp;spanning&nbsp;algorithm&nbsp;from&nbsp;the&nbsp;start.&nbsp;&nbsp;The<br>
-problem&nbsp;with&nbsp;the&nbsp;gap&nbsp;spanning&nbsp;algothm&nbsp;is&nbsp;that&nbsp;it&nbsp;will&nbsp;span&nbsp;gaps,&nbsp;even&nbsp;if&nbsp;there&nbsp;actually&nbsp;is&nbsp;a&nbsp;gap&nbsp;in&nbsp;the&nbsp;model.&nbsp;&nbsp;Infill&nbsp;bridge&nbsp;width<br>
-over&nbsp;thickness&nbsp;ratio&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;extrusion&nbsp;width&nbsp;over&nbsp;the&nbsp;layer&nbsp;thickness&nbsp;on&nbsp;a&nbsp;bridge&nbsp;layer.&nbsp;&nbsp;If&nbsp;the&nbsp;infill&nbsp;in&nbsp;direction&nbsp;of&nbsp;bridges<br>
-preference&nbsp;is&nbsp;chosen,&nbsp;the&nbsp;infill&nbsp;will&nbsp;be&nbsp;in&nbsp;the&nbsp;direction&nbsp;of&nbsp;bridges&nbsp;across&nbsp;gaps,&nbsp;so&nbsp;that&nbsp;the&nbsp;fill&nbsp;will&nbsp;be&nbsp;able&nbsp;to&nbsp;span&nbsp;a&nbsp;bridge&nbsp;easier.<br>
-&nbsp;<br>
-If&nbsp;the&nbsp;"Start&nbsp;at&nbsp;Home"&nbsp;preference&nbsp;is&nbsp;selected,&nbsp;the&nbsp;G28&nbsp;gcode&nbsp;will&nbsp;be&nbsp;added&nbsp;at&nbsp;the&nbsp;beginning&nbsp;of&nbsp;the&nbsp;file.<br>
-&nbsp;<br>
-When&nbsp;slice&nbsp;is&nbsp;generating&nbsp;the&nbsp;code,&nbsp;if&nbsp;there&nbsp;is&nbsp;a&nbsp;file&nbsp;start.txt,&nbsp;it&nbsp;will&nbsp;add&nbsp;that&nbsp;to&nbsp;the&nbsp;very&nbsp;beginning&nbsp;of&nbsp;the&nbsp;gcode.&nbsp;After&nbsp;it&nbsp;has&nbsp;added&nbsp;some<br>
-initialization&nbsp;code&nbsp;and&nbsp;just&nbsp;before&nbsp;it&nbsp;adds&nbsp;the&nbsp;extrusion&nbsp;gcode,&nbsp;it&nbsp;will&nbsp;add&nbsp;the&nbsp;file&nbsp;endofthebeginning.txt&nbsp;if&nbsp;it&nbsp;exists.&nbsp;At&nbsp;the&nbsp;very&nbsp;end,&nbsp;it&nbsp;will<br>
-add&nbsp;the&nbsp;file&nbsp;end.txt&nbsp;if&nbsp;it&nbsp;exists.&nbsp;Slice&nbsp;does&nbsp;not&nbsp;care&nbsp;if&nbsp;the&nbsp;text&nbsp;file&nbsp;names&nbsp;are&nbsp;capitalized,&nbsp;but&nbsp;some&nbsp;file&nbsp;systems&nbsp;do&nbsp;not&nbsp;handle&nbsp;file&nbsp;name<br>
-cases&nbsp;properly,&nbsp;so&nbsp;to&nbsp;be&nbsp;on&nbsp;the&nbsp;safe&nbsp;side&nbsp;you&nbsp;should&nbsp;give&nbsp;them&nbsp;lower&nbsp;case&nbsp;names.&nbsp;&nbsp;It&nbsp;will&nbsp;first&nbsp;look&nbsp;for&nbsp;the&nbsp;file&nbsp;in&nbsp;the&nbsp;same&nbsp;directory&nbsp;as<br>
-slice,&nbsp;if&nbsp;it&nbsp;does&nbsp;not&nbsp;find&nbsp;it&nbsp;it&nbsp;will&nbsp;look&nbsp;in&nbsp;~/.skeinforge/gcode_scripts.&nbsp;&nbsp;To&nbsp;run&nbsp;slice,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
-&gt;&nbsp;python&nbsp;slice.py<br>
-&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;slice&nbsp;the&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which<br>
-contains&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;slice.py.&nbsp;&nbsp;The&nbsp;preferences&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'slice.csv'&nbsp;with&nbsp;a&nbsp;text&nbsp;editor<br>
-or&nbsp;a&nbsp;spreadsheet&nbsp;program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&nbsp;python&nbsp;slice.py<br>
-This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Slice',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;sliced.<br>
-The&nbsp;sliced&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_slice.gcode<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;python<br>
-Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
-[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
-Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
-&gt;&gt;&gt;&nbsp;import&nbsp;slice<br>
-&gt;&gt;&gt;&nbsp;slice.<a href="#-main">main</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;sliced.<br>
-The&nbsp;sliced&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_slice.gcode<br>
-It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;slice&nbsp;the&nbsp;file.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&gt;&gt;&nbsp;slice.<a href="#-writeOutput">writeOutput</a>()<br>
-File&nbsp;Hollow&nbsp;Square.gcode&nbsp;is&nbsp;being&nbsp;sliced.<br>
-The&nbsp;sliced&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_slice.gcode<br>
-It&nbsp;took&nbsp;3&nbsp;seconds&nbsp;to&nbsp;slice&nbsp;the&nbsp;file.<br>
-&nbsp;<br>
-&nbsp;<br>
-&gt;&gt;&gt;&nbsp;slice.<a href="#-getSliceGcode">getSliceGcode</a>("<br>
-54&nbsp;162&nbsp;108&nbsp;Number&nbsp;of&nbsp;Vertices,Number&nbsp;of&nbsp;Edges,Number&nbsp;of&nbsp;Faces<br>
--5.800000000000001&nbsp;5.341893939393939&nbsp;4.017841892579603&nbsp;Vertex&nbsp;Coordinates&nbsp;XYZ<br>
-5.800000000000001&nbsp;5.341893939393939&nbsp;4.017841892579603<br>
-..<br>
-many&nbsp;lines&nbsp;of&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;vertices,&nbsp;edges&nbsp;and&nbsp;faces<br>
-..<br>
-")</tt></p>
-<p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#aa55cc">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
-
-<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
-<a href="skeinforge_tools.analyze.html">skeinforge_tools.analyze</a><br>
-<a href="cStringIO.html">cStringIO</a><br>
-<a href="cmath.html">cmath</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
-</td><td width="25%" valign=top><a href="math.html">math</a><br>
-<a href="os.html">os</a><br>
-<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
-</td><td width="25%" valign=top><a href="sys.html">sys</a><br>
-<a href="time.html">time</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.triangle_mesh.html">skeinforge_tools.skeinforge_utilities.triangle_mesh</a><br>
-</td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ee77aa">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
-
-<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl>
-<dt><font face="helvetica, arial"><a href="skeinforge_tools.slice_shape.html#LoopArea">LoopArea</a>
-</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.slice_shape.html#SlicePreferences">SlicePreferences</a>
-</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.slice_shape.html#SliceSkein">SliceSkein</a>
-</font></dt></dl>
- <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="LoopArea">class <strong>LoopArea</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>Complex&nbsp;loop&nbsp;with&nbsp;an&nbsp;area.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="LoopArea-__init__"><strong>__init__</strong></a>(self, loop)</dt></dl>
-
-<dl><dt><a name="LoopArea-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;string&nbsp;representation&nbsp;of&nbsp;this&nbsp;flat&nbsp;path.</tt></dd></dl>
-
-</td></tr></table> <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="SlicePreferences">class <strong>SlicePreferences</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;slice&nbsp;preferences.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="SlicePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
-
-<dl><dt><a name="SlicePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Slice&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
-
-</td></tr></table> <p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#ffc8d8">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#000000" face="helvetica, arial"><a name="SliceSkein">class <strong>SliceSkein</strong></a></font></td></tr>
-
-<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
-<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;slice&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface.<br>&nbsp;</tt></td></tr>
-<tr><td>&nbsp;</td>
-<td width="100%">Methods defined here:<br>
-<dl><dt><a name="SliceSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-
-<dl><dt><a name="SliceSkein-addFromFile"><strong>addFromFile</strong></a>(self, filename)</dt><dd><tt>Add&nbsp;lines&nbsp;of&nbsp;text&nbsp;from&nbsp;the&nbsp;filename.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addFromUpperLowerFile"><strong>addFromUpperLowerFile</strong></a>(self, filename)</dt><dd><tt>Add&nbsp;lines&nbsp;of&nbsp;text&nbsp;from&nbsp;the&nbsp;filename&nbsp;or&nbsp;the&nbsp;lowercase&nbsp;filename,&nbsp;if&nbsp;there&nbsp;is&nbsp;no&nbsp;file&nbsp;by&nbsp;the&nbsp;original&nbsp;filename&nbsp;in&nbsp;the&nbsp;directory.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addGcodeFromPerimeterPaths"><strong>addGcodeFromPerimeterPaths</strong></a>(self, isIntersectingSelf, loop, loopLists, radius, z)</dt><dd><tt>Add&nbsp;the&nbsp;perimeter&nbsp;paths&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addGcodeFromRemainingLoop"><strong>addGcodeFromRemainingLoop</strong></a>(self, loop, loopLists, radius, z)</dt><dd><tt>Add&nbsp;the&nbsp;remainder&nbsp;of&nbsp;the&nbsp;loop&nbsp;which&nbsp;does&nbsp;not&nbsp;overlap&nbsp;the&nbsp;alreadyFilledArounds&nbsp;loops.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addGcodeFromThreadZ"><strong>addGcodeFromThreadZ</strong></a>(self, thread, z)</dt><dd><tt>Add&nbsp;a&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addGcodeMovementZ"><strong>addGcodeMovementZ</strong></a>(self, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addInitializationToOutput"><strong>addInitializationToOutput</strong></a>(self)</dt><dd><tt>Add&nbsp;initialization&nbsp;gcode&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addShutdownToOutput"><strong>addShutdownToOutput</strong></a>(self)</dt><dd><tt>Add&nbsp;shutdown&nbsp;gcode&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-addToZoneArray"><strong>addToZoneArray</strong></a>(self, point, zoneArray, z)</dt><dd><tt>Add&nbsp;a&nbsp;height&nbsp;to&nbsp;the&nbsp;zone&nbsp;array.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-getBridgeDirection"><strong>getBridgeDirection</strong></a>(self, layerLoops)</dt><dd><tt>Get&nbsp;span&nbsp;direction&nbsp;for&nbsp;the&nbsp;majority&nbsp;of&nbsp;the&nbsp;overhanging&nbsp;extrusion&nbsp;perimeter,&nbsp;if&nbsp;any.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-getExtrudateLoopComplexes"><strong>getExtrudateLoopComplexes</strong></a>(self, halfWidth, loop)</dt><dd><tt>Get&nbsp;the&nbsp;inset&nbsp;extrudate&nbsp;loops&nbsp;from&nbsp;the&nbsp;loop.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-getLoopsFromMesh"><strong>getLoopsFromMesh</strong></a>(self, z)</dt><dd><tt>Get&nbsp;loops&nbsp;from&nbsp;a&nbsp;slice&nbsp;of&nbsp;a&nbsp;mesh.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-getZAddExtruderPaths"><strong>getZAddExtruderPaths</strong></a>(self, z)</dt><dd><tt>Get&nbsp;next&nbsp;z&nbsp;and&nbsp;add&nbsp;extruder&nbsp;loops.</tt></dd></dl>
-
-<dl><dt><a name="SliceSkein-parseTriangleMesh"><strong>parseTriangleMesh</strong></a>(self, slicePreferences, triangleMesh)</dt><dd><tt>Parse&nbsp;gnu&nbsp;triangulated&nbsp;surface&nbsp;text&nbsp;and&nbsp;store&nbsp;the&nbsp;sliced&nbsp;gcode.</tt></dd></dl>
-
-</td></tr></table></td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#eeaa77">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
-
-<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-addAlreadyFilledArounds"><strong>addAlreadyFilledArounds</strong></a>(alreadyFilledArounds, loop, radius)</dt><dd><tt>Add&nbsp;already&nbsp;filled&nbsp;loops&nbsp;around&nbsp;loop&nbsp;to&nbsp;alreadyFilledArounds.</tt></dd></dl>
- <dl><dt><a name="-addEdgePair"><strong>addEdgePair</strong></a>(edgePairTable, edges, faceEdgeIndex, remainingEdgeIndex, remainingEdgeTable)</dt><dd><tt>Add&nbsp;edge&nbsp;pair&nbsp;to&nbsp;the&nbsp;edge&nbsp;pair&nbsp;table.</tt></dd></dl>
- <dl><dt><a name="-addPointComplexesAtZ"><strong>addPointComplexesAtZ</strong></a>(edgePair, pointComplexes, radius, vertices, z)</dt><dd><tt>Add&nbsp;point&nbsp;complexes&nbsp;on&nbsp;the&nbsp;segment&nbsp;between&nbsp;the&nbsp;edge&nbsp;intersections&nbsp;with&nbsp;z.</tt></dd></dl>
- <dl><dt><a name="-addSegmentOutlineComplex"><strong>addSegmentOutlineComplex</strong></a>(isThick, outlines, pointBegin, pointEnd, width)</dt><dd><tt>Add&nbsp;a&nbsp;diamond&nbsp;or&nbsp;hexagonal&nbsp;outline&nbsp;for&nbsp;a&nbsp;line&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-compareArea"><strong>compareArea</strong></a>(loopArea, otherLoopArea)</dt><dd><tt>Get&nbsp;comparison&nbsp;in&nbsp;order&nbsp;to&nbsp;sort&nbsp;loop&nbsp;areas&nbsp;in&nbsp;descending&nbsp;order&nbsp;of&nbsp;area.</tt></dd></dl>
- <dl><dt><a name="-getCommonVertexIndex"><strong>getCommonVertexIndex</strong></a>(edgeFirst, edgeSecond)</dt><dd><tt>Get&nbsp;the&nbsp;vertex&nbsp;index&nbsp;that&nbsp;both&nbsp;edges&nbsp;have&nbsp;in&nbsp;common.</tt></dd></dl>
- <dl><dt><a name="-getDoubledRoundZ"><strong>getDoubledRoundZ</strong></a>(overhangingSegment, segmentRoundZ)</dt><dd><tt>Get&nbsp;doubled&nbsp;plane&nbsp;angle&nbsp;around&nbsp;z&nbsp;of&nbsp;the&nbsp;overhanging&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-getLoopsFromCorrectMesh"><strong>getLoopsFromCorrectMesh</strong></a>(edges, faces, vertices, z)</dt><dd><tt>Get&nbsp;loops&nbsp;from&nbsp;a&nbsp;slice&nbsp;of&nbsp;a&nbsp;correct&nbsp;mesh.</tt></dd></dl>
- <dl><dt><a name="-getLoopsFromUnprovenMesh"><strong>getLoopsFromUnprovenMesh</strong></a>(edges, extrusionWidth, faces, vertices, slicePreferences, z)</dt><dd><tt>Get&nbsp;loops&nbsp;from&nbsp;a&nbsp;slice&nbsp;of&nbsp;an&nbsp;unproven&nbsp;mesh.</tt></dd></dl>
- <dl><dt><a name="-getLowestZoneIndex"><strong>getLowestZoneIndex</strong></a>(zoneArray, z)</dt><dd><tt>Get&nbsp;the&nbsp;lowest&nbsp;zone&nbsp;index.</tt></dd></dl>
- <dl><dt><a name="-getNextEdgeIndexAroundZ"><strong>getNextEdgeIndexAroundZ</strong></a>(edge, faces, remainingEdgeTable)</dt><dd><tt>Get&nbsp;the&nbsp;next&nbsp;edge&nbsp;index&nbsp;in&nbsp;the&nbsp;mesh&nbsp;slice.</tt></dd></dl>
- <dl><dt><a name="-getOverhangDirection"><strong>getOverhangDirection</strong></a>(belowOutsetLoops, segmentBegin, segmentEnd)</dt><dd><tt>Add&nbsp;to&nbsp;span&nbsp;direction&nbsp;from&nbsp;the&nbsp;endpoint&nbsp;segments&nbsp;which&nbsp;overhang&nbsp;the&nbsp;layer&nbsp;below.</tt></dd></dl>
- <dl><dt><a name="-getPathComplex"><strong>getPathComplex</strong></a>(edges, pathIndexes, loop, z)</dt><dd><tt>Get&nbsp;the&nbsp;path&nbsp;from&nbsp;the&nbsp;edge&nbsp;intersections.</tt></dd></dl>
- <dl><dt><a name="-getRemainingEdgeTable"><strong>getRemainingEdgeTable</strong></a>(edges, vertices, z)</dt><dd><tt>Get&nbsp;the&nbsp;remaining&nbsp;edge&nbsp;hashtable.</tt></dd></dl>
- <dl><dt><a name="-getSegmentsFromPoints"><strong>getSegmentsFromPoints</strong></a>(loopLists, pointBegin, pointEnd)</dt><dd><tt>Get&nbsp;endpoint&nbsp;segments&nbsp;from&nbsp;the&nbsp;beginning&nbsp;and&nbsp;end&nbsp;of&nbsp;a&nbsp;line&nbsp;segment.</tt></dd></dl>
- <dl><dt><a name="-getSharedFace"><strong>getSharedFace</strong></a>(firstEdge, faces, secondEdge)</dt><dd><tt>Get&nbsp;the&nbsp;face&nbsp;which&nbsp;is&nbsp;shared&nbsp;by&nbsp;two&nbsp;edges.</tt></dd></dl>
- <dl><dt><a name="-getSliceGcode"><strong>getSliceGcode</strong></a>(filename, slicePreferences<font color="#909090">=None</font>)</dt><dd><tt>Slice&nbsp;a&nbsp;shape&nbsp;file.</tt></dd></dl>
- <dl><dt><a name="-getSliceIntersectionComplexFromEdge"><strong>getSliceIntersectionComplexFromEdge</strong></a>(edge, vertices, z)</dt><dd><tt>Get&nbsp;the&nbsp;complex&nbsp;where&nbsp;the&nbsp;slice&nbsp;intersects&nbsp;the&nbsp;edge.</tt></dd></dl>
- <dl><dt><a name="-isCloseToLast"><strong>isCloseToLast</strong></a>(paths, point, radius)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;point&nbsp;is&nbsp;close&nbsp;to&nbsp;the&nbsp;last&nbsp;point&nbsp;of&nbsp;the&nbsp;last&nbsp;path.</tt></dd></dl>
- <dl><dt><a name="-isIntersectingItself"><strong>isIntersectingItself</strong></a>(loop, width)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;itself.</tt></dd></dl>
- <dl><dt><a name="-isIntersectingWithinList"><strong>isIntersectingWithinList</strong></a>(loop, loopList)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;or&nbsp;is&nbsp;within&nbsp;the&nbsp;loop&nbsp;list.</tt></dd></dl>
- <dl><dt><a name="-isIntersectingWithinLists"><strong>isIntersectingWithinLists</strong></a>(loop, loopLists)</dt><dd><tt>Determine&nbsp;if&nbsp;the&nbsp;loop&nbsp;is&nbsp;intersecting&nbsp;or&nbsp;is&nbsp;within&nbsp;the&nbsp;loop&nbsp;lists.</tt></dd></dl>
- <dl><dt><a name="-isPathAdded"><strong>isPathAdded</strong></a>(edges, faces, loopComplexes, remainingEdgeTable, vertices, z)</dt><dd><tt>Get&nbsp;the&nbsp;path&nbsp;indexes&nbsp;around&nbsp;a&nbsp;triangle&nbsp;mesh&nbsp;slice&nbsp;and&nbsp;add&nbsp;the&nbsp;path&nbsp;to&nbsp;the&nbsp;flat&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-isZInEdge"><strong>isZInEdge</strong></a>(edge, vertices, z)</dt><dd><tt>Determine&nbsp;if&nbsp;z&nbsp;is&nbsp;inside&nbsp;the&nbsp;edge.</tt></dd></dl>
- <dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;slice&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Slice&nbsp;a&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;slice&nbsp;the&nbsp;first&nbsp;GNU&nbsp;Triangulated&nbsp;Surface&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
-</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#55aa55">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
-
-<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
-<strong>__date__</strong> = '$Date: 2008/02/05 $'<br>
-<strong>__license__</strong> = 'GPL 3.0'<br>
-<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
-<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
-<tr bgcolor="#7799ee">
-<td colspan=3 valign=bottom>&nbsp;<br>
-<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
-
-<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
-</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.speed.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.speed.html
index a8146361..379bc138 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.speed.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.speed.html
@@ -23,8 +23,20 @@ In&nbsp;the&nbsp;"Flowrate&nbsp;Choice"&nbsp;radio&nbsp;button&nbsp;group,&nbsp;
output.&nbsp;&nbsp;If&nbsp;"Metric"&nbsp;is&nbsp;selected,&nbsp;the&nbsp;flowrate&nbsp;in&nbsp;cubic&nbsp;millimeters&nbsp;per&nbsp;second&nbsp;will&nbsp;be&nbsp;added&nbsp;to&nbsp;the&nbsp;output.&nbsp;&nbsp;If&nbsp;"PWM&nbsp;Setting"&nbsp;is<br>
selected,&nbsp;the&nbsp;value&nbsp;in&nbsp;the&nbsp;"Flowrate&nbsp;PWM&nbsp;Setting"&nbsp;field&nbsp;will&nbsp;be&nbsp;added&nbsp;to&nbsp;the&nbsp;output.<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;speed&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;speed.py.&nbsp;&nbsp;The&nbsp;speed&nbsp;function&nbsp;will&nbsp;speed&nbsp;if&nbsp;"Activate<br>
+The&nbsp;'Perimeter&nbsp;Feedrate&nbsp;over&nbsp;Operating&nbsp;Feedrate'&nbsp;is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;feedrate&nbsp;of&nbsp;the&nbsp;perimeter&nbsp;over&nbsp;the&nbsp;feedrate&nbsp;of&nbsp;the&nbsp;infill.&nbsp;&nbsp;With<br>
+the&nbsp;default&nbsp;of&nbsp;1.0,&nbsp;the&nbsp;perimeter&nbsp;feedrate&nbsp;will&nbsp;be&nbsp;the&nbsp;same&nbsp;as&nbsp;the&nbsp;infill&nbsp;feedrate.&nbsp;&nbsp;The&nbsp;'Perimeter&nbsp;Flowrate&nbsp;over&nbsp;Operating&nbsp;Flowrate'<br>
+is&nbsp;the&nbsp;ratio&nbsp;of&nbsp;the&nbsp;flowrate&nbsp;of&nbsp;the&nbsp;perimeter&nbsp;over&nbsp;the&nbsp;flowrate&nbsp;of&nbsp;the&nbsp;infill.&nbsp;&nbsp;With&nbsp;the&nbsp;default&nbsp;of&nbsp;1.0,&nbsp;the&nbsp;perimeter&nbsp;flow&nbsp;rate&nbsp;will&nbsp;be<br>
+the&nbsp;same&nbsp;as&nbsp;the&nbsp;infill&nbsp;flow&nbsp;rate.&nbsp;&nbsp;To&nbsp;have&nbsp;higher&nbsp;build&nbsp;quality&nbsp;on&nbsp;the&nbsp;outside&nbsp;at&nbsp;the&nbsp;expense&nbsp;of&nbsp;slower&nbsp;build&nbsp;speed,&nbsp;a&nbsp;typical<br>
+setting&nbsp;for&nbsp;the&nbsp;'Perimeter&nbsp;Feedrate&nbsp;over&nbsp;Operating&nbsp;Feedrate'&nbsp;would&nbsp;be&nbsp;0.5.&nbsp;&nbsp;To&nbsp;go&nbsp;along&nbsp;with&nbsp;that,&nbsp;if&nbsp;you&nbsp;are&nbsp;using&nbsp;a&nbsp;speed<br>
+controlled&nbsp;extruder,&nbsp;the&nbsp;'Perimeter&nbsp;Flowrate&nbsp;over&nbsp;Operating&nbsp;Flowrate'&nbsp;should&nbsp;also&nbsp;be&nbsp;0.5.&nbsp;&nbsp;If&nbsp;you&nbsp;are&nbsp;using&nbsp;Pulse&nbsp;Width&nbsp;Modulation<br>
+to&nbsp;control&nbsp;the&nbsp;speed,&nbsp;then&nbsp;you'll&nbsp;probably&nbsp;need&nbsp;a&nbsp;slightly&nbsp;higher&nbsp;ratio&nbsp;because&nbsp;there&nbsp;is&nbsp;a&nbsp;minimum&nbsp;voltage&nbsp;'Flowrate&nbsp;PWM&nbsp;Setting'<br>
+required&nbsp;for&nbsp;the&nbsp;extruder&nbsp;motor&nbsp;to&nbsp;turn.&nbsp;&nbsp;The&nbsp;flow&nbsp;rate&nbsp;PWM&nbsp;ratio&nbsp;would&nbsp;be&nbsp;determined&nbsp;by&nbsp;trial&nbsp;and&nbsp;error,&nbsp;with&nbsp;the&nbsp;first&nbsp;trial&nbsp;being:<br>
+Perimeter&nbsp;Flowrate&nbsp;over&nbsp;Operating&nbsp;Flowrate&nbsp;~<br>
+Perimeter&nbsp;Feedrate&nbsp;over&nbsp;Operating&nbsp;Feedrate&nbsp;*&nbsp;(&nbsp;Flowrate&nbsp;PWM&nbsp;Setting&nbsp;-&nbsp;Minimum&nbsp;Flowrate&nbsp;PWM&nbsp;Setting&nbsp;)<br>
++&nbsp;Minimum&nbsp;Flowrate&nbsp;PWM&nbsp;Setting<br>
+&nbsp;<br>
+The&nbsp;following&nbsp;examples&nbsp;speed&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;speed.py.&nbsp;&nbsp;The&nbsp;speed&nbsp;function&nbsp;will&nbsp;speed&nbsp;if&nbsp;"Activate<br>
Speed"&nbsp;is&nbsp;true,&nbsp;which&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'speed.csv'&nbsp;with&nbsp;a&nbsp;text&nbsp;editor&nbsp;or&nbsp;a&nbsp;spreadsheet<br>
program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getSpeedChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;speeded,<br>
if&nbsp;not&nbsp;they&nbsp;call&nbsp;getMultiplyChainGcode&nbsp;in&nbsp;multiply.py&nbsp;to&nbsp;get&nbsp;multiplied&nbsp;gcode;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;multiplied&nbsp;text,&nbsp;then&nbsp;they<br>
@@ -33,8 +45,8 @@ speed.<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;speed.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Speed',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;speeded.<br>
-The&nbsp;speeded&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_speed.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;speeded.<br>
+The&nbsp;speeded&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_speed.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -47,13 +59,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;speed&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;speed.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;speeded.<br>
-The&nbsp;speeded&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_speed.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;speeded.<br>
+The&nbsp;speeded&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_speed.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;speed.<a href="#-getSpeedGcode">getSpeedGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -62,7 +74,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;speed.<a href="#-getSpeedChainGcode">getSpeedChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -80,8 +92,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="cStringIO.html">cStringIO</a><br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
<a href="skeinforge_tools.material.html">skeinforge_tools.material</a><br>
</td><td width="25%" valign=top><a href="math.html">math</a><br>
<a href="skeinforge_tools.multiply.html">skeinforge_tools.multiply</a><br>
@@ -110,7 +122,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;speed&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="SpeedPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="SpeedPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="SpeedPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Speed&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -126,10 +138,12 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="SpeedSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-<dl><dt><a name="SpeedSkein-addFlowrate"><strong>addFlowrate</strong></a>(self)</dt><dd><tt>Add&nbsp;flowrate&nbsp;line.</tt></dd></dl>
+<dl><dt><a name="SpeedSkein-addFlowrateLine"><strong>addFlowrateLine</strong></a>(self, flowrateString)</dt><dd><tt>Add&nbsp;flowrate&nbsp;line.</tt></dd></dl>
<dl><dt><a name="SpeedSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="SpeedSkein-getFlowrateString"><strong>getFlowrateString</strong></a>(self)</dt><dd><tt>Get&nbsp;the&nbsp;flowrate&nbsp;string.</tt></dd></dl>
+
<dl><dt><a name="SpeedSkein-getGcodeFromFeedrateMovement"><strong>getGcodeFromFeedrateMovement</strong></a>(self, feedrateMinute, point)</dt><dd><tt>Get&nbsp;a&nbsp;gcode&nbsp;movement.</tt></dd></dl>
<dl><dt><a name="SpeedSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
@@ -149,11 +163,11 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getSpeedChainGcode"><strong>getSpeedChainGcode</strong></a>(filename, gcodeText, speedPreferences<font color="#909090">=None</font>)</dt><dd><tt>Speed&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;speed&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;speeded.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getSpeedChainGcode"><strong>getSpeedChainGcode</strong></a>(fileName, gcodeText, speedPreferences<font color="#909090">=None</font>)</dt><dd><tt>Speed&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;speed&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;speeded.</tt></dd></dl>
<dl><dt><a name="-getSpeedGcode"><strong>getSpeedGcode</strong></a>(gcodeText, speedPreferences<font color="#909090">=None</font>)</dt><dd><tt>Speed&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>()</dt><dd><tt>Display&nbsp;the&nbsp;speed&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Speed&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;speed&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;speeded.<br>
-If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;speed&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Speed&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;speed&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;speeded.<br>
+If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;speed&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.stretch.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.stretch.html
index dacb7ea9..d98ce281 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.stretch.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.stretch.html
@@ -30,21 +30,21 @@ similar&nbsp;but&nbsp;different&nbsp;from&nbsp;the&nbsp;algorithm,&nbsp;so&nbsp;
to&nbsp;eliminate&nbsp;the&nbsp;inaccuracies&nbsp;caused&nbsp;by&nbsp;contraction,&nbsp;but&nbsp;it&nbsp;should&nbsp;reduce&nbsp;them.&nbsp;&nbsp;To&nbsp;run&nbsp;stretch,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
&gt;&nbsp;python&nbsp;stretch.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;stretch&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
-folder&nbsp;which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;stretch.py.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and<br>
+The&nbsp;following&nbsp;examples&nbsp;stretch&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the<br>
+folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;stretch.py.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and<br>
getStretchChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;stretched,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;the&nbsp;getCoolChainGcode&nbsp;in&nbsp;cool.py&nbsp;to&nbsp;cool&nbsp;the<br>
text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;cooled&nbsp;text,&nbsp;then&nbsp;they&nbsp;stretch.<br>
&nbsp;<br>
&nbsp;<br>
-&gt;&nbsp;python&nbsp;stretch.py&nbsp;Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;stretched.<br>
-The&nbsp;stretched&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_stretch.gcode<br>
+&gt;&nbsp;python&nbsp;stretch.py&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;stretched.<br>
+The&nbsp;stretched&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_stretch.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;stretch.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Stretch',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;stretched.<br>
-The&nbsp;stretched&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_stretch.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;stretched.<br>
+The&nbsp;stretched&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_stretch.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python<br>
@@ -57,13 +57,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;stretch&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;stretch.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;stretched.<br>
-The&nbsp;stretched&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_stretch.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;stretched.<br>
+The&nbsp;stretched&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_stretch.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;stretch.<a href="#-getStretchGcode">getStretchGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -72,7 +72,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;stretch.<a href="#-getStretchChainGcode">getStretchChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -91,8 +91,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
</td><td width="25%" valign=top><a href="skeinforge_tools.cool.html">skeinforge_tools.cool</a><br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-</td><td width="25%" valign=top><a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
-<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
<a href="sys.html">sys</a><br>
@@ -154,7 +154,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;stretch&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="StretchPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="StretchPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="StretchPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Stretch&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -170,7 +170,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="StretchSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
-<dl><dt><a name="StretchSkein-addAlongWayLine"><strong>addAlongWayLine</strong></a>(self, alongRatio, location)</dt><dd><tt>Add&nbsp;stretched&nbsp;gcode&nbsp;line,&nbsp;along&nbsp;the&nbsp;way&nbsp;from&nbsp;the&nbsp;old&nbsp;location&nbsp;to&nbsp;the&nbsp;location.</tt></dd></dl>
+<dl><dt><a name="StretchSkein-addAlongWayLine"><strong>addAlongWayLine</strong></a>(self, alongWay, location)</dt><dd><tt>Add&nbsp;stretched&nbsp;gcode&nbsp;line,&nbsp;along&nbsp;the&nbsp;way&nbsp;from&nbsp;the&nbsp;location&nbsp;to&nbsp;the&nbsp;old&nbsp;location.</tt></dd></dl>
<dl><dt><a name="StretchSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
@@ -199,10 +199,10 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getStretchChainGcode"><strong>getStretchChainGcode</strong></a>(filename, gcodeText, stretchPreferences<font color="#909090">=None</font>)</dt><dd><tt>Stretch&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;stretch&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;stretched.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getStretchChainGcode"><strong>getStretchChainGcode</strong></a>(fileName, gcodeText, stretchPreferences<font color="#909090">=None</font>)</dt><dd><tt>Stretch&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;stretch&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;stretched.</tt></dd></dl>
<dl><dt><a name="-getStretchGcode"><strong>getStretchGcode</strong></a>(gcodeText, stretchPreferences<font color="#909090">=None</font>)</dt><dd><tt>Stretch&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;stretch&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Stretch&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;stretch&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;stretched.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;stretch&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Stretch&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;stretch&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;stretched.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;stretch&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.tower.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.tower.html
index f54b1c0e..0ccd6753 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.tower.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.tower.html
@@ -32,8 +32,8 @@ support&nbsp;material.&nbsp;&nbsp;It&nbsp;is&nbsp;best&nbsp;to&nbsp;not&nbsp;tow
different&nbsp;than&nbsp;that&nbsp;of&nbsp;the&nbsp;other&nbsp;layers.&nbsp;&nbsp;The&nbsp;default&nbsp;preference&nbsp;is&nbsp;one.&nbsp;&nbsp;To&nbsp;run&nbsp;tower,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
&gt;&nbsp;python&nbsp;tower.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;tower&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gcode&nbsp;&amp;&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
-which&nbsp;contains&nbsp;Hollow&nbsp;Square.gcode,&nbsp;Hollow&nbsp;Square.gts&nbsp;and&nbsp;tower.py.&nbsp;&nbsp;The&nbsp;tower&nbsp;function&nbsp;will&nbsp;tower&nbsp;if&nbsp;'Maximum&nbsp;Tower&nbsp;Layers'&nbsp;is<br>
+The&nbsp;following&nbsp;examples&nbsp;tower&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder<br>
+which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;tower.py.&nbsp;&nbsp;The&nbsp;tower&nbsp;function&nbsp;will&nbsp;tower&nbsp;if&nbsp;'Maximum&nbsp;Tower&nbsp;Layers'&nbsp;is<br>
greater&nbsp;than&nbsp;zero,&nbsp;which&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;the&nbsp;dialog&nbsp;or&nbsp;by&nbsp;changing&nbsp;the&nbsp;preferences&nbsp;file&nbsp;'tower.csv'&nbsp;with&nbsp;a&nbsp;text&nbsp;editor&nbsp;or&nbsp;a&nbsp;spreadsheet<br>
program&nbsp;set&nbsp;to&nbsp;separate&nbsp;tabs.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getTowerChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;towered,<br>
if&nbsp;not&nbsp;they&nbsp;call&nbsp;the&nbsp;getRaftChainGcode&nbsp;in&nbsp;raft.py&nbsp;to&nbsp;raft&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;rafted&nbsp;text,&nbsp;then&nbsp;they&nbsp;tower.&nbsp;&nbsp;Pictures&nbsp;of<br>
@@ -43,8 +43,8 @@ towering&nbsp;in&nbsp;action&nbsp;are&nbsp;available&nbsp;from&nbsp;the&nbsp;Met
&nbsp;<br>
&gt;&nbsp;python&nbsp;tower.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Tower',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;towered.<br>
-The&nbsp;towered&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_tower.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;towered.<br>
+The&nbsp;towered&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_tower.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -57,13 +57,13 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;tower&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;tower.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;towered.<br>
-The&nbsp;towered&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_tower.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;towered.<br>
+The&nbsp;towered&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_tower.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;tower.<a href="#-getTowerGcode">getTowerGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -72,7 +72,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;tower.<a href="#-getTowerChainGcode">getTowerChainGcode</a>("<br>
-(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;slice.py&nbsp;)<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
..<br>
many&nbsp;lines&nbsp;of&nbsp;gcode<br>
@@ -90,8 +90,8 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<a href="cStringIO.html">cStringIO</a><br>
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
<a href="math.html">math</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -134,7 +134,7 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;tower&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="TowerPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="TowerPreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="TowerPreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Tower&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -152,9 +152,9 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<dl><dt><a name="TowerSkein-addEntireLayer"><strong>addEntireLayer</strong></a>(self, layerIndex)</dt><dd><tt>Add&nbsp;entire&nbsp;thread&nbsp;layer.</tt></dd></dl>
-<dl><dt><a name="TowerSkein-addGcodeFromThread"><strong>addGcodeFromThread</strong></a>(self, thread)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="TowerSkein-addGcodeFromThreadZ"><strong>addGcodeFromThreadZ</strong></a>(self, thread, z)</dt><dd><tt>Add&nbsp;a&nbsp;gcode&nbsp;thread&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
-<dl><dt><a name="TowerSkein-addGcodeMovement"><strong>addGcodeMovement</strong></a>(self, point)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+<dl><dt><a name="TowerSkein-addGcodeMovementZ"><strong>addGcodeMovementZ</strong></a>(self, point, z)</dt><dd><tt>Add&nbsp;a&nbsp;movement&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
<dl><dt><a name="TowerSkein-addIfTravel"><strong>addIfTravel</strong></a>(self, splitLine)</dt><dd><tt>Add&nbsp;travel&nbsp;move&nbsp;around&nbsp;loops&nbsp;if&nbsp;this&nbsp;the&nbsp;extruder&nbsp;is&nbsp;off.</tt></dd></dl>
@@ -195,13 +195,13 @@ many&nbsp;lines&nbsp;of&nbsp;gcode<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
-<td width="100%"><dl><dt><a name="-getTowerChainGcode"><strong>getTowerChainGcode</strong></a>(filename, gcodeText, towerPreferences<font color="#909090">=None</font>)</dt><dd><tt>Tower&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;tower&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;towered.</tt></dd></dl>
+<td width="100%"><dl><dt><a name="-getTowerChainGcode"><strong>getTowerChainGcode</strong></a>(fileName, gcodeText, towerPreferences<font color="#909090">=None</font>)</dt><dd><tt>Tower&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;tower&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;towered.</tt></dd></dl>
<dl><dt><a name="-getTowerGcode"><strong>getTowerGcode</strong></a>(gcodeText, towerPreferences<font color="#909090">=None</font>)</dt><dd><tt>Tower&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;tower&nbsp;dialog.</tt></dd></dl>
<dl><dt><a name="-transferFillLoops"><strong>transferFillLoops</strong></a>(fillLoops, surroundingLoop)</dt><dd><tt>Transfer&nbsp;fill&nbsp;loops.</tt></dd></dl>
<dl><dt><a name="-transferFillLoopsToSurroundingLoops"><strong>transferFillLoopsToSurroundingLoops</strong></a>(fillLoops, surroundingLoops)</dt><dd><tt>Transfer&nbsp;fill&nbsp;loops&nbsp;to&nbsp;surrounding&nbsp;loops.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Tower&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;tower&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;towered.<br>
-If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;tower&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Tower&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;tower&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;towered.<br>
+If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;tower&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.unpause.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.unpause.html
index 0c4dfe24..fc2d9442 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.unpause.html
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.unpause.html
@@ -25,15 +25,15 @@ feedrate&nbsp;will&nbsp;be&nbsp;sped&nbsp;up&nbsp;to,&nbsp;compared&nbsp;to&nbsp
To&nbsp;run&nbsp;unpause,&nbsp;in&nbsp;a&nbsp;shell&nbsp;type:<br>
&gt;&nbsp;python&nbsp;unpause.py<br>
&nbsp;<br>
-The&nbsp;following&nbsp;examples&nbsp;unpause&nbsp;the&nbsp;files&nbsp;Hollow&nbsp;Square.gts.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains<br>
-Hollow&nbsp;Square.gts&nbsp;&amp;&nbsp;unpause.py.&nbsp;&nbsp;The&nbsp;function&nbsp;writeOutput&nbsp;checks&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;unpaused,&nbsp;if&nbsp;not&nbsp;they&nbsp;call<br>
+The&nbsp;following&nbsp;examples&nbsp;unpause&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a&nbsp;terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;&amp;&nbsp;unpause.py.&nbsp;&nbsp;The&nbsp;function&nbsp;writeOutput&nbsp;checks&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text&nbsp;has&nbsp;been&nbsp;unpaused,&nbsp;if&nbsp;not&nbsp;they&nbsp;call<br>
getFilletChainGcode&nbsp;in&nbsp;fillet.py&nbsp;to&nbsp;fillet&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;filleted&nbsp;text,&nbsp;then&nbsp;it&nbsp;unpauses.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&nbsp;python&nbsp;unpause.py<br>
This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Unpause',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;unpaused.<br>
-The&nbsp;unpaused&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_unpause.gcode<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;unpaused.<br>
+The&nbsp;unpaused&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_unpause.gcode<br>
&nbsp;<br>
&nbsp;<br>
&gt;python<br>
@@ -46,9 +46,9 @@ This&nbsp;brings&nbsp;up&nbsp;the&nbsp;unpause&nbsp;dialog.<br>
&nbsp;<br>
&nbsp;<br>
&gt;&gt;&gt;&nbsp;unpause.<a href="#-writeOutput">writeOutput</a>()<br>
-Hollow&nbsp;Square.gts<br>
-File&nbsp;Hollow&nbsp;Square.gts&nbsp;is&nbsp;being&nbsp;chain&nbsp;unpaused.<br>
-The&nbsp;unpaused&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Hollow&nbsp;Square_unpause.gcode<br>
+Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;unpaused.<br>
+The&nbsp;unpaused&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_unpause.gcode<br>
&nbsp;<br>
The&nbsp;equation&nbsp;to&nbsp;set&nbsp;the&nbsp;feedrate&nbsp;is&nbsp;from&nbsp;Shane&nbsp;Hathaway's&nbsp;description&nbsp;at:<br>
<a href="http://shane.willowrise.com/archives/delay-compensation-in-firmware/">http://shane.willowrise.com/archives/delay-compensation-in-firmware/</a></tt></p>
@@ -65,8 +65,8 @@ The&nbsp;equation&nbsp;to&nbsp;set&nbsp;the&nbsp;feedrate&nbsp;is&nbsp;from&nbsp
<a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
</td><td width="25%" valign=top><a href="skeinforge_tools.fillet.html">skeinforge_tools.fillet</a><br>
<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
-<a href="skeinforge_tools.import_translator.html">skeinforge_tools.import_translator</a><br>
<a href="skeinforge_tools.skeinforge_utilities.intercircle.html">skeinforge_tools.skeinforge_utilities.intercircle</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
</td><td width="25%" valign=top><a href="os.html">os</a><br>
<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
<a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
@@ -93,7 +93,7 @@ The&nbsp;equation&nbsp;to&nbsp;set&nbsp;the&nbsp;feedrate&nbsp;is&nbsp;from&nbsp
<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;unpause&nbsp;preferences.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
-<dl><dt><a name="UnpausePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;filename.</tt></dd></dl>
+<dl><dt><a name="UnpausePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
<dl><dt><a name="UnpausePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Unpause&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
@@ -133,10 +133,10 @@ The&nbsp;equation&nbsp;to&nbsp;set&nbsp;the&nbsp;feedrate&nbsp;is&nbsp;from&nbsp
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-getSelectedPlugin"><strong>getSelectedPlugin</strong></a>(unpausePreferences)</dt><dd><tt>Get&nbsp;the&nbsp;selected&nbsp;plugin.</tt></dd></dl>
- <dl><dt><a name="-getUnpauseChainGcode"><strong>getUnpauseChainGcode</strong></a>(filename, gcodeText, unpausePreferences<font color="#909090">=None</font>)</dt><dd><tt>Unpause&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;unpause&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;unpaused.</tt></dd></dl>
+ <dl><dt><a name="-getUnpauseChainGcode"><strong>getUnpauseChainGcode</strong></a>(fileName, gcodeText, unpausePreferences<font color="#909090">=None</font>)</dt><dd><tt>Unpause&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;unpause&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;unpaused.</tt></dd></dl>
<dl><dt><a name="-getUnpauseGcode"><strong>getUnpauseGcode</strong></a>(gcodeText, unpausePreferences<font color="#909090">=None</font>)</dt><dd><tt>Unpause&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
<dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;unpause&nbsp;dialog.</tt></dd></dl>
- <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(filename<font color="#909090">=''</font>)</dt><dd><tt>Unpause&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;unpause&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;unpaused.&nbsp;&nbsp;If&nbsp;no&nbsp;filename&nbsp;is&nbsp;specified,&nbsp;unpause&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Unpause&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;unpause&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;unpaused.&nbsp;&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;unpause&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.wipe.html b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.wipe.html
new file mode 100644
index 00000000..3dadab10
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/documentation/skeinforge_tools.wipe.html
@@ -0,0 +1,181 @@
+
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head><title>Python: module skeinforge_tools.wipe</title>
+</head><body bgcolor="#f0f0f8">
+
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
+<tr bgcolor="#7799ee">
+<td valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="skeinforge_tools.html"><font color="#ffffff">skeinforge_tools</font></a>.wipe</strong></big></big> ($Date: 2008/21/04 $)</font></td
+><td align=right valign=bottom
+><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/wipe.py">/home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/wipe.py</a></font></td></tr></table>
+ <p><tt>Wipe&nbsp;is&nbsp;a&nbsp;script&nbsp;to&nbsp;wipe&nbsp;the&nbsp;nozzle.<br>
+&nbsp;<br>
+At&nbsp;the&nbsp;beginning&nbsp;of&nbsp;a&nbsp;layer,&nbsp;depending&nbsp;on&nbsp;the&nbsp;preferences,&nbsp;wipe&nbsp;will&nbsp;move&nbsp;the&nbsp;nozzle&nbsp;with&nbsp;the&nbsp;extruder&nbsp;off&nbsp;to&nbsp;the&nbsp;arrival&nbsp;point,<br>
+then&nbsp;to&nbsp;the&nbsp;wipe&nbsp;point,&nbsp;then&nbsp;to&nbsp;the&nbsp;departure&nbsp;point,&nbsp;then&nbsp;back&nbsp;to&nbsp;the&nbsp;layer.<br>
+&nbsp;<br>
+The&nbsp;default&nbsp;'Activate&nbsp;Wipe'&nbsp;checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;When&nbsp;it&nbsp;is&nbsp;on,&nbsp;the&nbsp;functions&nbsp;described&nbsp;below&nbsp;will&nbsp;work,&nbsp;when&nbsp;it&nbsp;is&nbsp;off,&nbsp;the&nbsp;functions<br>
+will&nbsp;not&nbsp;be&nbsp;called.<br>
+&nbsp;<br>
+The&nbsp;"Location&nbsp;Arrival&nbsp;X"&nbsp;preference,&nbsp;is&nbsp;the&nbsp;x&nbsp;coordinate&nbsp;of&nbsp;the&nbsp;arrival&nbsp;location.&nbsp;&nbsp;The&nbsp;"Location&nbsp;Arrival&nbsp;Y"&nbsp;and&nbsp;"Location&nbsp;Arrival&nbsp;Z"<br>
+preferences&nbsp;are&nbsp;the&nbsp;y&nbsp;&amp;&nbsp;z&nbsp;coordinates&nbsp;of&nbsp;the&nbsp;location.&nbsp;&nbsp;The&nbsp;equivalent&nbsp;"Location&nbsp;Wipe.."&nbsp;and&nbsp;"Location&nbsp;Departure.."&nbsp;preferences<br>
+are&nbsp;for&nbsp;the&nbsp;wipe&nbsp;and&nbsp;departure&nbsp;locations.<br>
+&nbsp;<br>
+The&nbsp;"Wipe&nbsp;Period&nbsp;(layers)"&nbsp;preference&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;layers&nbsp;between&nbsp;wipes.&nbsp;&nbsp;Wipe&nbsp;will&nbsp;always&nbsp;wipe&nbsp;just&nbsp;before&nbsp;the&nbsp;first&nbsp;layer,<br>
+afterwards&nbsp;it&nbsp;will&nbsp;wipe&nbsp;every&nbsp;"Wipe&nbsp;Period"&nbsp;layers.&nbsp;&nbsp;With&nbsp;the&nbsp;default&nbsp;of&nbsp;three,&nbsp;wipe&nbsp;will&nbsp;wipe&nbsp;just&nbsp;before&nbsp;the&nbsp;zeroth&nbsp;layer,&nbsp;the<br>
+third&nbsp;layer,&nbsp;sixth&nbsp;layer&nbsp;and&nbsp;so&nbsp;on.<br>
+&nbsp;<br>
+To&nbsp;run&nbsp;wipe,&nbsp;in&nbsp;a&nbsp;shell&nbsp;which&nbsp;wipe&nbsp;is&nbsp;in&nbsp;type:<br>
+&gt;&nbsp;python&nbsp;wipe.py<br>
+&nbsp;<br>
+The&nbsp;following&nbsp;examples&nbsp;wipes&nbsp;the&nbsp;files&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode&nbsp;&amp;&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl.&nbsp;&nbsp;The&nbsp;examples&nbsp;are&nbsp;run&nbsp;in&nbsp;a<br>
+terminal&nbsp;in&nbsp;the&nbsp;folder&nbsp;which&nbsp;contains&nbsp;Screw&nbsp;Holder&nbsp;Bottom.gcode,&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;and&nbsp;wipe.py.&nbsp;&nbsp;The&nbsp;wipe&nbsp;function<br>
+will&nbsp;wipe&nbsp;if&nbsp;the&nbsp;'Activate&nbsp;Wipe'&nbsp;checkbox&nbsp;is&nbsp;on.&nbsp;&nbsp;The&nbsp;functions&nbsp;writeOutput&nbsp;and&nbsp;getWipeChainGcode&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;text<br>
+has&nbsp;been&nbsp;wiped,&nbsp;if&nbsp;not&nbsp;they&nbsp;call&nbsp;the&nbsp;getHopChainGcode&nbsp;in&nbsp;hop.py&nbsp;to&nbsp;hop&nbsp;the&nbsp;text;&nbsp;once&nbsp;they&nbsp;have&nbsp;the&nbsp;hopped&nbsp;text,&nbsp;then&nbsp;they<br>
+wipe.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python&nbsp;wipe.py<br>
+This&nbsp;brings&nbsp;up&nbsp;the&nbsp;dialog,&nbsp;after&nbsp;clicking&nbsp;'Wipe',&nbsp;the&nbsp;following&nbsp;is&nbsp;printed:<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;wiped.<br>
+The&nbsp;wiped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_wipe.gcode<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python&nbsp;wipe.py&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;wiped.<br>
+The&nbsp;wiped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_wipe.gcode<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&nbsp;python<br>
+Python&nbsp;2.5.1&nbsp;(r251:54863,&nbsp;Sep&nbsp;22&nbsp;2007,&nbsp;01:43:31)<br>
+[GCC&nbsp;4.2.1&nbsp;(SUSE&nbsp;Linux)]&nbsp;on&nbsp;linux2<br>
+Type&nbsp;"help",&nbsp;"copyright",&nbsp;"credits"&nbsp;or&nbsp;"license"&nbsp;for&nbsp;more&nbsp;information.<br>
+&gt;&gt;&gt;&nbsp;import&nbsp;wipe<br>
+&gt;&gt;&gt;&nbsp;wipe.<a href="#-main">main</a>()<br>
+This&nbsp;brings&nbsp;up&nbsp;the&nbsp;wipe&nbsp;dialog.<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;wipe.<a href="#-writeOutput">writeOutput</a>()<br>
+File&nbsp;Screw&nbsp;Holder&nbsp;Bottom.stl&nbsp;is&nbsp;being&nbsp;chain&nbsp;wiped.<br>
+The&nbsp;wiped&nbsp;file&nbsp;is&nbsp;saved&nbsp;as&nbsp;Screw&nbsp;Holder&nbsp;Bottom_wipe.gcode<br>
+&nbsp;<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;wipe.<a href="#-getWipeGcode">getWipeGcode</a>("<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
+(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
+..<br>
+many&nbsp;lines&nbsp;of&nbsp;gcode<br>
+..<br>
+")<br>
+Many&nbsp;line&nbsp;of&nbsp;wiped&nbsp;gcode.<br>
+&nbsp;<br>
+&gt;&gt;&gt;&nbsp;wipe.<a href="#-getWipeChainGcode">getWipeChainGcode</a>("<br>
+(&nbsp;GCode&nbsp;generated&nbsp;by&nbsp;May&nbsp;8,&nbsp;2008&nbsp;carve.py&nbsp;)<br>
+(&nbsp;Extruder&nbsp;Initialization&nbsp;)<br>
+..<br>
+many&nbsp;lines&nbsp;of&nbsp;gcode<br>
+..<br>
+")<br>
+Many&nbsp;line&nbsp;of&nbsp;wiped&nbsp;gcode.</tt></p>
+<p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#aa55cc">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#fffff" face="helvetica, arial"><big><strong>Modules</strong></big></font></td></tr>
+
+<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="__init__.html">__init__</a><br>
+<a href="skeinforge_tools.analyze.html">skeinforge_tools.analyze</a><br>
+<a href="cStringIO.html">cStringIO</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.euclidean.html">skeinforge_tools.skeinforge_utilities.euclidean</a><br>
+<a href="skeinforge_tools.skeinforge_utilities.gcodec.html">skeinforge_tools.skeinforge_utilities.gcodec</a><br>
+<a href="skeinforge_tools.hop.html">skeinforge_tools.hop</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.interpret.html">skeinforge_tools.skeinforge_utilities.interpret</a><br>
+<a href="math.html">math</a><br>
+<a href="skeinforge_tools.polyfile.html">skeinforge_tools.polyfile</a><br>
+</td><td width="25%" valign=top><a href="skeinforge_tools.skeinforge_utilities.preferences.html">skeinforge_tools.skeinforge_utilities.preferences</a><br>
+<a href="sys.html">sys</a><br>
+<a href="time.html">time</a><br>
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ee77aa">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
+
+<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl>
+<dt><font face="helvetica, arial"><a href="skeinforge_tools.wipe.html#WipePreferences">WipePreferences</a>
+</font></dt><dt><font face="helvetica, arial"><a href="skeinforge_tools.wipe.html#WipeSkein">WipeSkein</a>
+</font></dt></dl>
+ <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="WipePreferences">class <strong>WipePreferences</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;handle&nbsp;the&nbsp;wipe&nbsp;preferences.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="WipePreferences-__init__"><strong>__init__</strong></a>(self)</dt><dd><tt>Set&nbsp;the&nbsp;default&nbsp;preferences,&nbsp;execute&nbsp;title&nbsp;&amp;&nbsp;preferences&nbsp;fileName.</tt></dd></dl>
+
+<dl><dt><a name="WipePreferences-execute"><strong>execute</strong></a>(self)</dt><dd><tt>Wipe&nbsp;button&nbsp;has&nbsp;been&nbsp;clicked.</tt></dd></dl>
+
+</td></tr></table> <p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#ffc8d8">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#000000" face="helvetica, arial"><a name="WipeSkein">class <strong>WipeSkein</strong></a></font></td></tr>
+
+<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
+<td colspan=2><tt>A&nbsp;class&nbsp;to&nbsp;wipe&nbsp;a&nbsp;skein&nbsp;of&nbsp;extrusions.<br>&nbsp;</tt></td></tr>
+<tr><td>&nbsp;</td>
+<td width="100%">Methods defined here:<br>
+<dl><dt><a name="WipeSkein-__init__"><strong>__init__</strong></a>(self)</dt></dl>
+
+<dl><dt><a name="WipeSkein-addHop"><strong>addHop</strong></a>(self, begin, end)</dt><dd><tt>Add&nbsp;hop&nbsp;to&nbsp;highest&nbsp;point.</tt></dd></dl>
+
+<dl><dt><a name="WipeSkein-addLine"><strong>addLine</strong></a>(self, line)</dt><dd><tt>Add&nbsp;a&nbsp;line&nbsp;of&nbsp;text&nbsp;and&nbsp;a&nbsp;newline&nbsp;to&nbsp;the&nbsp;output.</tt></dd></dl>
+
+<dl><dt><a name="WipeSkein-addWipeTravel"><strong>addWipeTravel</strong></a>(self, splitLine)</dt><dd><tt>Add&nbsp;the&nbsp;wipe&nbsp;travel&nbsp;gcode.</tt></dd></dl>
+
+<dl><dt><a name="WipeSkein-getLinearMoveWithFeedrate"><strong>getLinearMoveWithFeedrate</strong></a>(self, feedrate, location)</dt><dd><tt>Get&nbsp;a&nbsp;linear&nbsp;move&nbsp;line&nbsp;with&nbsp;the&nbsp;feedrate.</tt></dd></dl>
+
+<dl><dt><a name="WipeSkein-getRounded"><strong>getRounded</strong></a>(self, number)</dt><dd><tt>Get&nbsp;number&nbsp;rounded&nbsp;to&nbsp;the&nbsp;number&nbsp;of&nbsp;carried&nbsp;decimal&nbsp;places&nbsp;as&nbsp;a&nbsp;string.</tt></dd></dl>
+
+<dl><dt><a name="WipeSkein-parseGcode"><strong>parseGcode</strong></a>(self, gcodeText, wipePreferences)</dt><dd><tt>Parse&nbsp;gcode&nbsp;text&nbsp;and&nbsp;store&nbsp;the&nbsp;wipe&nbsp;gcode.</tt></dd></dl>
+
+<dl><dt><a name="WipeSkein-parseInitialization"><strong>parseInitialization</strong></a>(self, wipePreferences)</dt><dd><tt>Parse&nbsp;gcode&nbsp;initialization&nbsp;and&nbsp;store&nbsp;the&nbsp;parameters.</tt></dd></dl>
+
+<dl><dt><a name="WipeSkein-parseLine"><strong>parseLine</strong></a>(self, line)</dt><dd><tt>Parse&nbsp;a&nbsp;gcode&nbsp;line&nbsp;and&nbsp;add&nbsp;it&nbsp;to&nbsp;the&nbsp;bevel&nbsp;gcode.</tt></dd></dl>
+
+</td></tr></table></td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#eeaa77">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
+
+<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><dl><dt><a name="-getWipeChainGcode"><strong>getWipeChainGcode</strong></a>(fileName, gcodeText, wipePreferences<font color="#909090">=None</font>)</dt><dd><tt>Wipe&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.&nbsp;&nbsp;Chain&nbsp;wipe&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;wiped.</tt></dd></dl>
+ <dl><dt><a name="-getWipeGcode"><strong>getWipeGcode</strong></a>(gcodeText, wipePreferences<font color="#909090">=None</font>)</dt><dd><tt>Wipe&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;text.</tt></dd></dl>
+ <dl><dt><a name="-main"><strong>main</strong></a>(hashtable<font color="#909090">=None</font>)</dt><dd><tt>Display&nbsp;the&nbsp;wipe&nbsp;dialog.</tt></dd></dl>
+ <dl><dt><a name="-writeOutput"><strong>writeOutput</strong></a>(fileName<font color="#909090">=''</font>)</dt><dd><tt>Wipe&nbsp;a&nbsp;gcode&nbsp;linear&nbsp;move&nbsp;file.&nbsp;&nbsp;Chain&nbsp;wipe&nbsp;the&nbsp;gcode&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;already&nbsp;wiped.&nbsp;If&nbsp;no&nbsp;fileName&nbsp;is&nbsp;specified,&nbsp;wipe&nbsp;the&nbsp;first&nbsp;unmodified&nbsp;gcode&nbsp;file&nbsp;in&nbsp;this&nbsp;folder.</tt></dd></dl>
+</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#55aa55">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
+
+<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%"><strong>__author__</strong> = 'Enrique Perez (perez_enrique@yahoo.com)'<br>
+<strong>__date__</strong> = '$Date: 2008/21/04 $'<br>
+<strong>__license__</strong> = 'GPL 3.0'<br>
+<strong>absolute_import</strong> = _Feature((2, 5, 0, 'alpha', 1), (2, 7, 0, 'alpha', 0), 16384)</td></tr></table><p>
+<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
+<tr bgcolor="#7799ee">
+<td colspan=3 valign=bottom>&nbsp;<br>
+<font color="#ffffff" face="helvetica, arial"><big><strong>Author</strong></big></font></td></tr>
+
+<tr><td bgcolor="#7799ee"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
+<td width="100%">Enrique&nbsp;Perez&nbsp;(perez_enrique@yahoo.com)</td></tr></table>
+</body></html> \ No newline at end of file
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge.py
index f55ae53b..b050731e 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge.py
@@ -3,11 +3,11 @@
"""
Introduction
-Skeinforge is a tool chain to forge a gcode skein for a model.
+Skeinforge is a GPL tool chain to forge a gcode skein for a model.
-The tool chain starts with slice_shape, which slices the model into layers, then the layers are modified by other tools in turn like
-fill, comb, tower, raft, stretch, hop, nozzle_wipe, oozebane, fillet & export. Each tool automatically gets the gcode from the
-previous tool. So if you want a sliced & filled gcode, call the fill tool and it will call slice_shape, then it will fill and output the
+The tool chain starts with carve, which carves the model into layers, then the layers are modified by other tools in turn like
+fill, comb, tower, raft, stretch, hop, wipe, oozebane, fillet & export. Each tool automatically gets the gcode from the
+previous tool. So if you want a carved & filled gcode, call the fill tool and it will call carve, then it will fill and output the
gcode. If you want to use all the tools, call export and it will call in turn all the other tools down the chain to produce the gcode file.
The skeinforge module provides a single place to call up all the preference dialogs. When the 'Skeinforge' button is clicked,
@@ -27,10 +27,10 @@ There are also tools which handle preferences for the chain, like material & pol
The analyze tool calls plugins in the analyze_plugins folder, which will analyze the gcode in some way when it is generated if
their Activate checkbox is selected.
-The import_translator tool accesses and displays the import plugins.
+The interpret tool accesses and displays the import plugins.
The default preferences are similar to those on Nophead's machine. A preference which is often different is the
-'Extrusion Diameter' in slice_shape.
+'Extrusion Diameter' in carve.
@@ -71,11 +71,11 @@ Or you can turn files into gcode by adding the file name, for example:
End of the Beginning
-When slice is generating the code, if there is a file start.txt, it will add that to the very beginning of the gcode. After it has
+When carve is generating the code, if there is a file start.txt, it will add that to the very beginning of the gcode. After it has
added some initialization code and just before it adds the extrusion gcode, it will add the file endofthebeginning.txt if it exists.
-At the very end, it will add the file end.txt if it exists. Slice does not care if the text file names are capitalized, but some file
+At the very end, it will add the file end.txt if it exists. Carve does not care if the text file names are capitalized, but some file
systems do not handle file name cases properly, so to be on the safe side you should give them lower case names. It will
-first look for the file in the same directory as slice, if it does not find it it will look in ~/.skeinforge/gcode_scripts.
+first look for the file in the same directory as carve, if it does not find it it will look in ~/.skeinforge/gcode_scripts.
The computation intensive python modules will use psyco if it is available and run about twice as fast. Psyco is described at:
http://psyco.sourceforge.net/index.html
@@ -151,8 +151,8 @@ folder.
STL is an inferior triangle surface format, described at:
http://en.wikipedia.org/wiki/STL_(file_format)
-If you're using an STL file and you can't even slice it, try converting it to a GNU Triangulated Surface file in Art of Illusion. If
-it still doesn't slice, then follow the advice in the troubleshooting section.
+If you're using an STL file and you can't even carve it, try converting it to a GNU Triangulated Surface file in Art of Illusion. If
+it still doesn't carve, then follow the advice in the troubleshooting section.
@@ -182,8 +182,8 @@ If there's a bug, try downloading the very latest version because sometimes I up
Then you can ask for skeinforge help by sending a private message through the forum software by going to my page at:
http://forums.reprap.org/profile.php?12,488
-or posting in the "How to Print Gcode from Host" thread at:
-http://forums.reprap.org/read.php?12,10772
+or posting in the "Skeinforge Powwow" thread at:
+http://forums.reprap.org/read.php?12,20013
When asking for help please include your object and your zipped skeinforge preferences. The skeinforge preferences are in
the .skeinforge folder in your home directory.
@@ -191,7 +191,7 @@ the .skeinforge folder in your home directory.
Examples
-The following examples slice and dice the STL file Screw Holder.stl. The examples are run in a terminal in the folder which
+The following examples carve and dice the STL file Screw Holder.stl. The examples are run in a terminal in the folder which
contains Screw Holder.gts and skeinforge.py.
> python skeinforge.py
@@ -221,7 +221,7 @@ from __future__ import absolute_import
from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import preferences
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
import cStringIO
import sys
@@ -233,11 +233,15 @@ Adrian Bowyer <http://forums.reprap.org/profile.php?12,13>
Brendan Erwin <http://forums.reprap.org/profile.php?12,217>
Greenarrow <http://forums.reprap.org/profile.php?12,81>
Ian England <http://forums.reprap.org/profile.php?12,192>
+John Gilmore <http://forums.reprap.org/profile.php?12,364>
+Jonwise <http://forums.reprap.org/profile.php?12,716>
Kyle Corbitt <http://forums.reprap.org/profile.php?12,90>
Marius Kintel <http://reprap.soup.io/>
Nophead <http://www.blogger.com/profile/12801535866788103677>
+PJR <http://forums.reprap.org/profile.php?12,757>
Reece.Arnott <http://forums.reprap.org/profile.php?12,152>
Wade <http://forums.reprap.org/profile.php?12,489>
+Zach Hoeken <http://blog.zachhoeken.com/>
Organizations:
Art of Illusion <http://www.artofillusion.org/>"""
@@ -246,26 +250,26 @@ __license__ = "GPL 3.0"
def getSkeinforgeToolFilenames():
- "Get skeinforge plugin filenames."
+ "Get skeinforge plugin fileNames."
return gcodec.getPluginFilenames( 'skeinforge_tools', __file__ )
-def writeOutput( filename = '' ):
- "Skeinforge a gcode file. If no filename is specified, skeinforge the first gcode file in this folder that is not modified."
+def writeOutput( fileName = '' ):
+ "Skeinforge a gcode file. If no fileName is specified, skeinforge the first gcode file in this folder that is not modified."
skeinforgePluginFilenames = getSkeinforgeToolFilenames()
- toolNames = 'export fillet oozebane nozzle_wipe hop stretch clip comb tower raft speed multiply fill slice_shape'.split()
+ toolNames = 'export unpause fillet oozebane wipe hop stretch clip comb tower raft speed multiply fill inset carve'.split()
for toolName in toolNames:
for skeinforgePluginFilename in skeinforgePluginFilenames:
if skeinforgePluginFilename == toolName:
pluginModule = gcodec.getModule( skeinforgePluginFilename, 'skeinforge_tools', __file__ )
if pluginModule != None:
- pluginModule.writeOutput( filename )
+ pluginModule.writeOutput( fileName )
return
class SkeinforgePreferences:
"A class to handle the skeinforge preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.skeinforgeLabel = preferences.LabelDisplay().getFromName( 'Open Preferences: ' )
@@ -276,20 +280,20 @@ class SkeinforgePreferences:
skeinforgeDisplayToolButton = preferences.DisplayToolButton().getFromFolderName( 'skeinforge_tools', __file__, skeinforgePluginFilename )
self.skeinforgeDisplayToolButtons.append( skeinforgeDisplayToolButton )
self.archive += self.skeinforgeDisplayToolButtons
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Skeinforged', '' )
- self.archive.append( self.filenameInput )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Skeinforged', '' )
+ self.archive.append( self.fileNameInput )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Skeinforge'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'skeinforge.csv' )
- self.filenameHelp = 'skeinforge.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'skeinforge.csv' )
+ self.fileNameHelp = 'skeinforge.html'
self.saveTitle = None
self.title = 'Skeinforge Preferences'
def execute( self ):
"Skeinforge button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
def main():
"Display the skeinforge dialog."
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze.py
index e9414894..b16201f7 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze.py
@@ -27,30 +27,30 @@ __license__ = "GPL 3.0"
def getAnalyzePluginFilenames():
- "Get analyze plugin filenames."
+ "Get analyze plugin fileNames."
return gcodec.getPluginFilenames( 'analyze_plugins', __file__ )
-def writeOutput( filename = '', gcodeText = '' ):
- "Analyze a gcode file. If no filename is specified, comment the first gcode file in this folder that is not modified."
- if filename == '':
+def writeOutput( fileName = '', gcodeText = '' ):
+ "Analyze a gcode file. If no fileName is specified, comment the first gcode file in this folder that is not modified."
+ if fileName == '':
unmodified = gcodec.getUncommentedGcodeFiles()
if len( unmodified ) == 0:
print( "There is no gcode file in this folder that is not a comment file." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
if gcodeText == '':
- gcodeText = gcodec.getFileText( filename )
+ gcodeText = gcodec.getFileText( fileName )
analyzePluginFilenames = getAnalyzePluginFilenames()
for analyzePluginFilename in analyzePluginFilenames:
pluginModule = gcodec.getModule( analyzePluginFilename, 'analyze_plugins', __file__ )
if pluginModule != None:
- pluginModule.writeOutput( filename, gcodeText )
+ pluginModule.writeOutput( fileName, gcodeText )
class AnalyzePreferences:
"A class to handle the analyze preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.analyzeLabel = preferences.LabelDisplay().getFromName( 'Open Preferences: ' )
@@ -62,20 +62,20 @@ class AnalyzePreferences:
self.analyzePlugins.append( analyzePlugin )
# self.analyzePlugins.sort( key = preferences.RadioCapitalized.getLowerName )
self.archive += self.analyzePlugins
- self.filenameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to be Analyzed', '' )
- self.archive.append( self.filenameInput )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ self.fileNameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to be Analyzed', '' )
+ self.archive.append( self.fileNameInput )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Analyze'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'analyze.csv' )
- self.filenameHelp = 'skeinforge_tools.analyze.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'analyze.csv' )
+ self.fileNameHelp = 'skeinforge_tools.analyze.html'
self.saveTitle = None
self.title = 'Analyze Preferences'
def execute( self ):
"Analyze button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, [], self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, [], self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
def main( hashtable = None ):
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/enrique.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/enrique.py
index e45c4822..39875054 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/enrique.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/enrique.py
@@ -4,10 +4,10 @@ from GifImagePlugin import getheader, getdata
from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
# Get the entire text of a file.
-# @param filename name of the file
+# @param fileName name of the file
# @return entire text of a file.
-def getFileText( filename ):
- file = open( filename, 'r' )
+def getFileText( fileName ):
+ file = open( fileName, 'r' )
fileText = file.read()
file.close()
return fileText
@@ -61,11 +61,11 @@ def makedelta(fp, sequence):
class g2gif:
- def __init__(self,filename, outfile):
+ def __init__(self,fileName, outfile):
self.last_pos = Vector3()
self.last_pos.z = 999
self.do_move = 1
- fileText = getFileText( filename )
+ fileText = getFileText( fileName )
textLines = getTextLines( fileText )
self.images = []
self.image = None
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/gRead.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/gRead.py
index aaee5656..7b1421d0 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/gRead.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/gRead.py
@@ -5,10 +5,10 @@ import __init__
from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
# Get the entire text of a file.
-# @param filename name of the file
+# @param fileName name of the file
# @return entire text of a file.
-def getFileText( filename ):
- file = open( filename, 'r' )
+def getFileText( fileName ):
+ file = open( fileName, 'r' )
fileText = file.read()
file.close()
return fileText
@@ -36,9 +36,9 @@ def indexOfStartingWithSecond( letter, splitLine ):
class gRead:
- def __init__(self,filename, layers,gcodeText = ''):
+ def __init__(self,fileName, layers,gcodeText = ''):
if gcodeText == '':
- gcodeText = getFileText( filename )
+ gcodeText = getFileText( fileName )
textLines = getTextLines( gcodeText )
self.last_pos = Vector3()
self.layers = layers
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/preview.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/preview.py
index b406d06f..d65ea648 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/preview.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/analyze_utilities/preview.py
@@ -57,10 +57,10 @@ class Preview:
self.update()
-def viewGif( filename, gcodeText = '' ):
+def viewGif( fileName, gcodeText = '' ):
layers = []
try:
- gRead(filename, layers, gcodeText)
+ gRead(fileName, layers, gcodeText)
Preview(layers)
except Exception, why:
print( 'Preview failed: ' + str( why ) )
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/comment.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/comment.py
index e3f5b524..ef7eadd1 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/comment.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/comment.py
@@ -51,15 +51,15 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def commentFile( filename = '' ):
- "Comment a gcode file. If no filename is specified, comment the first gcode file in this folder that is not modified."
- if filename == '':
+def commentFile( fileName = '' ):
+ "Comment a gcode file. If no fileName is specified, comment the first gcode file in this folder that is not modified."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
- writeCommentFileGivenText( filename, gcodec.getFileText( filename ) )
+ fileName = unmodified[ 0 ]
+ writeCommentFileGivenText( fileName, gcodec.getFileText( fileName ) )
def getCommentGcode( gcodeText ):
"Get gcode text with added comments."
@@ -67,18 +67,18 @@ def getCommentGcode( gcodeText ):
skein.parseGcode( gcodeText )
return skein.output.getvalue()
-def writeCommentFileGivenText( filename, gcodeText ):
+def writeCommentFileGivenText( fileName, gcodeText ):
"Write a commented gcode file for a gcode file."
- gcodec.writeFileMessageEnd( '_comment.gcode', filename, getCommentGcode( gcodeText ), 'The commented file is saved as ' )
+ gcodec.writeFileMessageEnd( '_comment.gcode', fileName, getCommentGcode( gcodeText ), 'The commented file is saved as ' )
-def writeOutput( filename, gcodeText = '' ):
+def writeOutput( fileName, gcodeText = '' ):
"Write a commented gcode file for a skeinforge gcode file, if 'Write Commented File for Skeinforge Chain' is selected."
commentPreferences = CommentPreferences()
preferences.readPreferences( commentPreferences )
if gcodeText == '':
- gcodeText = gcodec.getFileText( filename )
+ gcodeText = gcodec.getFileText( fileName )
if commentPreferences.activateComment.value:
- writeCommentFileGivenText( filename, gcodeText )
+ writeCommentFileGivenText( fileName, gcodeText )
class CommentSkein:
@@ -154,25 +154,25 @@ class CommentSkein:
class CommentPreferences:
"A class to handle the comment preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateComment = preferences.BooleanPreference().getFromValue( 'Activate Comment', False )
self.archive.append( self.activateComment )
- self.filenameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Write Comments for', '' )
- self.archive.append( self.filenameInput )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ self.fileNameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Write Comments for', '' )
+ self.archive.append( self.fileNameInput )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Write Comments'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'comment.csv' )
- self.filenameHelp = 'skeinforge_tools.analyze_plugins.comment.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'comment.csv' )
+ self.fileNameHelp = 'skeinforge_tools.analyze_plugins.comment.html'
self.saveTitle = 'Save Preferences'
self.title = 'Comment Preferences'
def execute( self ):
"Write button has been clicked."
- filenames = polyfile.getFileOrGcodeDirectory( self.filenameInput.value, self.filenameInput.wasCancelled, [ '_comment' ] )
- for filename in filenames:
- commentFile( filename )
+ fileNames = polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled, [ '_comment' ] )
+ for fileName in fileNames:
+ commentFile( fileName )
def main():
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/skeinview.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/skeinview.py
index 8254cdae..d23d2996 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/skeinview.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/skeinview.py
@@ -85,24 +85,24 @@ def displaySkeinviewFileGivenText( gcodeText, skeinviewPreferences = None ):
skein.parseGcode( gcodeText, skeinviewPreferences )
SkeinWindow( skein.arrowType, skeinviewPreferences.screenHorizontalInset.value, skeinviewPreferences.screenVerticalInset.value, skein.scaleSize, skein.skeinPanes )
-def skeinviewFile( filename = '' ):
- "Skeinview a gcode file. If no filename is specified, skeinview the first gcode file in this folder that is not modified."
- if filename == '':
+def skeinviewFile( fileName = '' ):
+ "Skeinview a gcode file. If no fileName is specified, skeinview the first gcode file in this folder that is not modified."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
- gcodeText = gcodec.getFileText( filename )
+ fileName = unmodified[ 0 ]
+ gcodeText = gcodec.getFileText( fileName )
displaySkeinviewFileGivenText( gcodeText )
-def writeOutput( filename, gcodeText = '' ):
+def writeOutput( fileName, gcodeText = '' ):
"Write a skeinviewed gcode file for a skeinforge gcode file, if 'Activate Skeinview' is selected."
skeinviewPreferences = SkeinviewPreferences()
preferences.readPreferences( skeinviewPreferences )
if skeinviewPreferences.activateSkeinview.value:
if gcodeText == '':
- gcodeText = gcodec.getFileText( filename )
+ gcodeText = gcodec.getFileText( fileName )
displaySkeinviewFileGivenText( gcodeText, skeinviewPreferences )
@@ -125,15 +125,15 @@ class ColoredLine:
class SkeinviewPreferences:
"A class to handle the skeinview preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateSkeinview = preferences.BooleanPreference().getFromValue( 'Activate Skeinview', True )
self.archive.append( self.activateSkeinview )
self.drawArrows = preferences.BooleanPreference().getFromValue( 'Draw Arrows', True )
self.archive.append( self.drawArrows )
- self.filenameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Skeinview', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Skeinview', '' )
+ self.archive.append( self.fileNameInput )
self.goAroundExtruderOffTravel = preferences.BooleanPreference().getFromValue( 'Go Around Extruder Off Travel', False )
self.archive.append( self.goAroundExtruderOffTravel )
self.pixelsWidthExtrusion = preferences.FloatPreference().getFromValue( 'Pixels over Extrusion Width (ratio):', 10.0 )
@@ -142,18 +142,18 @@ class SkeinviewPreferences:
self.archive.append( self.screenHorizontalInset )
self.screenVerticalInset = preferences.IntPreference().getFromValue( 'Screen Vertical Inset (pixels):', 50 )
self.archive.append( self.screenVerticalInset )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Skeinview'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'skeinview.csv' )
- self.filenameHelp = 'skeinforge_tools.analyze_plugins.skeinview.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'skeinview.csv' )
+ self.fileNameHelp = 'skeinforge_tools.analyze_plugins.skeinview.html'
self.saveTitle = 'Save Preferences'
self.title = 'Skeinview Preferences'
def execute( self ):
"Write button has been clicked."
- filenames = polyfile.getFileOrGcodeDirectory( self.filenameInput.value, self.filenameInput.wasCancelled )
- for filename in filenames:
- skeinviewFile( filename )
+ fileNames = polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ skeinviewFile( fileName )
class SkeinviewSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/statistic.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/statistic.py
index 1eb7d325..0e7ddd7e 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/statistic.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/statistic.py
@@ -5,6 +5,9 @@ The default 'Activate Statistic' checkbox is on. When it is on, the functions d
skeinforge toolchain, when it is off, the functions will not be called from the toolchain. The functions will still be called, whether
or not the 'Activate Statistic' checkbox is on, when statistic is run directly.
+When the 'Print Statistics' checkbox is on, the statistics will be printed to the console, the default is on. When the 'Save
+Statistics' checkbox is on, the statistics will be save as a .txt file, the default is off.
+
To run statistic, in a shell in the folder which statistic is in type:
> python statistic.py
@@ -60,60 +63,63 @@ def getStatisticGcode( gcodeText ):
skein.parseGcode( gcodeText )
return skein.output.getvalue()
-def statisticFile( filename = '' ):
- "Write statistics for a gcode file. If no filename is specified, write statistics for the first gcode file in this folder that is not modified."
- if filename == '':
+def statisticFile( fileName = '' ):
+ "Write statistics for a gcode file. If no fileName is specified, write statistics for the first gcode file in this folder that is not modified."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
statisticPreferences = StatisticPreferences()
preferences.readPreferences( statisticPreferences )
- writeStatisticFileGivenText( filename, gcodec.getFileText( filename ), statisticPreferences )
+ writeStatisticFileGivenText( fileName, gcodec.getFileText( fileName ), statisticPreferences )
-def writeOutput( filename, gcodeText = '' ):
+def writeOutput( fileName, gcodeText = '' ):
"Write statistics for a skeinforge gcode file, if 'Write Statistics File for Skeinforge Chain' is selected."
statisticPreferences = StatisticPreferences()
preferences.readPreferences( statisticPreferences )
if gcodeText == '':
- gcodeText = gcodec.getFileText( filename )
+ gcodeText = gcodec.getFileText( fileName )
if statisticPreferences.activateStatistic.value:
- writeStatisticFileGivenText( filename, gcodeText, statisticPreferences )
+ writeStatisticFileGivenText( fileName, gcodeText, statisticPreferences )
-def writeStatisticFileGivenText( filename, gcodeText, statisticPreferences ):
+def writeStatisticFileGivenText( fileName, gcodeText, statisticPreferences ):
"Write statistics for a gcode file."
- print( 'Statistics are being generated for the file ' + gcodec.getSummarizedFilename( filename ) )
+ print( 'Statistics are being generated for the file ' + gcodec.getSummarizedFilename( fileName ) )
statisticGcode = getStatisticGcode( gcodeText )
- gcodec.writeFileMessageEnd( '.txt', filename, statisticGcode, 'The statistics file is saved as ' )
- if statisticPreferences.printStatisticFileSkeinforge.value:
+ if statisticPreferences.printStatistics.value:
print( statisticGcode )
+ if statisticPreferences.saveStatistics.value:
+ gcodec.writeFileMessageEnd( '.txt', fileName, statisticGcode, 'The statistics file is saved as ' )
class StatisticPreferences:
"A class to handle the statistics preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateStatistic = preferences.BooleanPreference().getFromValue( 'Activate Statistic', True )
self.archive.append( self.activateStatistic )
- self.filenameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Generate Statistics for', '' )
- self.archive.append( self.filenameInput )
- self.printStatisticFileSkeinforge = preferences.BooleanPreference().getFromValue( 'Print Statistics', False )
- self.archive.append( self.printStatisticFileSkeinforge )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ self.fileNameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Generate Statistics for', '' )
+ self.archive.append( self.fileNameInput )
+ self.printStatistics = preferences.BooleanPreference().getFromValue( 'Print Statistics', True )
+ self.archive.append( self.printStatistics )
+ self.saveStatistics = preferences.BooleanPreference().getFromValue( 'Save Statistics', False )
+ self.archive.append( self.saveStatistics )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Generate Statistics'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'statistic.csv' )
- self.filenameHelp = 'skeinforge_tools.analyze_plugins.statistic.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'statistic.csv' )
+ self.fileNameHelp = 'skeinforge_tools.analyze_plugins.statistic.html'
self.saveTitle = 'Save Preferences'
self.title = 'Statistic Preferences'
def execute( self ):
"Write button has been clicked."
- filenames = polyfile.getFileOrGcodeDirectory( self.filenameInput.value, self.filenameInput.wasCancelled, [ '_comment' ] )
- for filename in filenames:
- statisticFile( filename )
+ fileNames = polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled, [ '_comment' ] )
+ for fileName in fileNames:
+ statisticFile( fileName )
class StatisticSkein:
@@ -208,7 +214,7 @@ class StatisticSkein:
self.extrusionDiameter = 0.5
self.extrusionWidth = 0.4
self.feedrateMinute = 600.0
- self.extrusionHeight = 0.4
+ self.layerThickness = 0.4
self.numberOfLines = 0
self.procedures = []
self.totalBuildTime = 0.0
@@ -229,7 +235,7 @@ class StatisticSkein:
roundedLow = euclidean.getRoundedPoint( self.cornerLow )
roundedExtent = euclidean.getRoundedPoint( extent )
axisString = " axis, the extrusion starts at "
- volumeExtruded = 0.0009 * self.extrusionWidth * self.extrusionHeight * self.totalDistanceExtruded # the 9 comes from a typical fill density of 0.9
+ volumeExtruded = 0.0009 * self.extrusionWidth * self.layerThickness * self.totalDistanceExtruded # the 9 comes from a typical fill density of 0.9
self.addLine( "On the X" + axisString + str( int ( roundedLow.x ) ) + " mm and ends at " + str( int ( roundedHigh.x ) ) + " mm, for a width of " + str( int ( extent.x ) ) + " mm" )
self.addLine( "On the Y" + axisString + str( int ( roundedLow.y ) ) + " mm and ends at " + str( int ( roundedHigh.y ) ) + " mm, for a depth of " + str( int ( extent.y ) ) + " mm" )
self.addLine( "On the Z" + axisString + str( int ( roundedLow.z ) ) + " mm and ends at " + str( int ( roundedHigh.z ) ) + " mm, for a height of " + str( int ( extent.z ) ) + " mm" )
@@ -242,7 +248,7 @@ class StatisticSkein:
self.addLine( "The following procedures have been performed on the skein:" )
for procedure in self.procedures:
self.addLine( procedure )
- self.addLine( "The layer thickness is " + str( self.extrusionHeight ) + " mm." )
+ self.addLine( "The layer thickness is " + str( self.layerThickness ) + " mm." )
self.addLine( "The text has " + str( self.numberOfLines ) + " lines and a size of " + str( kilobytes ) + " KB." )
self.addLine( "The total build time is " + str( int( round( self.totalBuildTime ) ) ) + " s." )
self.addLine( "The total distance extruded is " + str( int( round( self.totalDistanceExtruded ) ) ) + " mm." )
@@ -275,8 +281,8 @@ class StatisticSkein:
self.extrusionDiameter = gcodec.getDoubleAfterFirstLetter( splitLine[ 1 ] )
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = gcodec.getDoubleAfterFirstLetter( splitLine[ 1 ] )
- elif firstWord == '(<extrusionHeight>':
- self.extrusionHeight = gcodec.getDoubleAfterFirstLetter( splitLine[ 1 ] )
+ elif firstWord == '(<layerThickness>':
+ self.layerThickness = gcodec.getDoubleAfterFirstLetter( splitLine[ 1 ] )
elif firstWord == '(<procedureDone>':
self.procedures.append( splitLine[ 1 ] )
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/vectorwrite.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/vectorwrite.py
index b806621b..2e76e5f0 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/vectorwrite.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/analyze_plugins/vectorwrite.py
@@ -55,35 +55,35 @@ __license__ = "GPL 3.0"
#add open webbrowser first time file is created choice
-def writeOutput( filename, gcodeText = '' ):
+def writeOutput( fileName, gcodeText = '' ):
"Write scalable vector graphics for a skeinforge gcode file, if 'Write Scalable Vector Graphics for Skeinforge Chain' is selected."
vectorwritePreferences = VectorwritePreferences()
preferences.readPreferences( vectorwritePreferences )
if gcodeText == '':
- gcodeText = gcodec.getFileText( filename )
+ gcodeText = gcodec.getFileText( fileName )
if vectorwritePreferences.activateVectorwrite.value:
- writeVectorFileGivenText( filename, gcodeText, vectorwritePreferences )
+ writeVectorFileGivenText( fileName, gcodeText, vectorwritePreferences )
-def writeVectorFile( filename = '' ):
- "Write scalable vector graphics for a gcode file. If no filename is specified, write scalable vector graphics for the first gcode file in this folder."
- if filename == '':
+def writeVectorFile( fileName = '' ):
+ "Write scalable vector graphics for a gcode file. If no fileName is specified, write scalable vector graphics for the first gcode file in this folder."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There is no gcode file in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
vectorwritePreferences = VectorwritePreferences()
preferences.readPreferences( vectorwritePreferences )
- gcodeText = gcodec.getFileText( filename )
- writeVectorFileGivenText( filename, gcodeText, vectorwritePreferences )
+ gcodeText = gcodec.getFileText( fileName )
+ writeVectorFileGivenText( fileName, gcodeText, vectorwritePreferences )
-def writeVectorFileGivenText( filename, gcodeText, vectorwritePreferences ):
+def writeVectorFileGivenText( fileName, gcodeText, vectorwritePreferences ):
"Write scalable vector graphics for a gcode file."
if gcodeText == '':
return ''
skein = VectorwriteSkein()
skein.parseGcode( gcodeText, vectorwritePreferences )
- print( 'The scalable vector graphics file is saved as ' + skein.getFilenameWriteFiles( filename ) )
+ print( 'The scalable vector graphics file is saved as ' + skein.getFilenameWriteFiles( fileName ) )
class VectorWindow:
@@ -149,21 +149,21 @@ class VectorWindow:
class VectorwritePreferences:
"A class to handle the vectorwrite preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateVectorwrite = preferences.BooleanPreference().getFromValue( 'Activate Vectorwrite', False )
self.archive.append( self.activateVectorwrite )
- self.filenameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Write Vector Graphics for', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to Write Vector Graphics for', '' )
+ self.archive.append( self.fileNameInput )
self.minimumNumberLayersMultipleFiles = preferences.IntPreference().getFromValue( 'Minimum Number of Layers for Multiple Files (integer):', 10 )
self.archive.append( self.minimumNumberLayersMultipleFiles )
self.pixelsWidthExtrusion = preferences.FloatPreference().getFromValue( 'Pixels over Extrusion Width (ratio):', 5.0 )
self.archive.append( self.pixelsWidthExtrusion )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Write Vector Graphics'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'vectorwrite.csv' )
- self.filenameHelp = 'skeinforge_tools.analyze_plugins.vectorwrite.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'vectorwrite.csv' )
+ self.fileNameHelp = 'skeinforge_tools.analyze_plugins.vectorwrite.html'
self.saveTitle = 'Save Preferences'
self.title = 'Vectorwrite Preferences'
@@ -206,10 +206,10 @@ class VectorwriteSkein:
self.vectorWindow.setPaneCorners( self.scaleCornerLow, self.scaleCornerHigh )
self.vectorWindows.append( self.vectorWindow )
- def getFilenameWriteFiles( self, filename ):
- "Write one or multiple files for the filename."
- directoryName = os.path.dirname( filename )
- baseUnderscoredName = os.path.basename( filename ).replace( ' ', '_' )
+ def getFilenameWriteFiles( self, fileName ):
+ "Write one or multiple files for the fileName."
+ directoryName = os.path.dirname( fileName )
+ baseUnderscoredName = os.path.basename( fileName ).replace( ' ', '_' )
baseUnderscoredPrefix = baseUnderscoredName[ : baseUnderscoredName.rfind( '.' ) ]
if not self.isMultiple:
suffixFilename = os.path.join( directoryName, baseUnderscoredPrefix + '.svg' )
@@ -239,7 +239,7 @@ class VectorwriteSkein:
return baseUnderscoredPrefix + '_' + zeroPrefixIndex
def getSuffixFilename( self, baseUnderscoredPrefix, multipleDirectoryName, vectorWindowIndex ):
- "Get suffix filename for a numbered vector window."
+ "Get suffix fileName for a numbered vector window."
return os.path.join( multipleDirectoryName, self.getLinkBasename( baseUnderscoredPrefix, vectorWindowIndex ) + '.svg' )
def initializeActiveLocation( self ):
@@ -361,9 +361,9 @@ class VectorwriteSkein:
def execute( self ):
"Write button has been clicked."
- filenames = polyfile.getFileOrGcodeDirectory( self.filenameInput.value, self.filenameInput.wasCancelled )
- for filename in filenames:
- writeVectorFile( filename )
+ fileNames = polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeVectorFile( fileName )
def main( hashtable = None ):
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/carve.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/carve.py
new file mode 100644
index 00000000..272fdd59
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/carve.py
@@ -0,0 +1,399 @@
+"""
+Carve shape is a script to carve a list of slice layers.
+
+Carve carves a list of slices into svg slice layers. The 'Layer Thickness' is the thickness the extrusion layer at default extruder speed,
+this is the most important carve preference. The 'Extrusion Diameter over Thickness is the ratio of the extrusion diameter over the
+layer thickness, the default is 1.25. The 'Extrusion Width over Thickness' is the ratio of the extrusion width over the layer thickness,
+the default is 1.5. A ratio of one means the extrusion is a circle, a typical ratio of 1.5 means the extrusion is a wide oval. These
+values should be measured from a test extrusion line.
+
+The extrusion fill density ratio that is printed to the console, ( it is derived quantity not a parameter ) is the area of the extrusion diameter
+over the extrusion width over the layer thickness. Assuming the extrusion diameter is correct, a high value means the filament will be
+packed tightly, and the object will be almost as dense as the filament. If the value is too high, there could be too little room for the
+filament, and the extruder will end up plowing through the extra filament. A low value means the filaments will be far away from each
+other, the object will be leaky and light. The value with the default extrusion preferences is around 0.82.
+
+Rarely changed preferences are 'Import Coarseness', 'Mesh Type', 'Infill Bridge Width Over Thickness', 'Infill in Direction of Bridges' &
+'Layer Thickness over Precision'. When a triangle mesh has holes in it, the triangle mesh slicer switches over to a slow algorithm that
+spans gaps in the mesh. The higher the import coarseness, the wider the gaps in the mesh it will span. An import coarseness of one
+means it will span gaps the width of the extrusion. When the Mesh Type preference is Correct Mesh, the mesh will be accurately
+carved, and if a hole is found, carve will switch over to the algorithm that spans gaps. If the Mesh Type preference is Unproven
+Mesh, carve will use the gap spanning algorithm from the start. The problem with the gap spanning algothm is that it will span gaps,
+even if there actually is a gap in the model. Infill bridge width over thickness ratio is the ratio of the extrusion width over the layer
+thickness on a bridge layer. If the infill in direction of bridges preference is chosen, the infill will be in the direction of bridges across
+gaps, so that the fill will be able to span a bridge easier. The 'Layer Thickness over Precision' is the ratio of the layer thickness over
+the smallest change in value. The higher the layer thickness over precision, the more significant figures the output numbers will have,
+the default is ten.
+
+To run carve, in a shell type:
+> python carve.py
+
+The following examples carve the GNU Triangulated Surface file Screw Holder Bottom.stl. The examples are run in a terminal in the
+folder which contains Screw Holder Bottom.stl and carve.py. The preferences can be set in the dialog or by changing the preferences file
+'carve.csv' with a text editor or a spreadsheet program set to separate tabs.
+
+
+> python carve.py
+This brings up the dialog, after clicking 'Carve', the following is printed:
+File Screw Holder Bottom.stl is being carved.
+The carved file is saved as Screw Holder Bottom_carve.svg
+
+
+>python
+Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
+[GCC 4.2.1 (SUSE Linux)] on linux2
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import carve
+>>> carve.main()
+File Screw Holder Bottom.stl is being carved.
+The carved file is saved as Screw Holder Bottom_carve.svg
+It took 3 seconds to carve the file.
+
+
+>>> carve.writeOutput()
+File Screw Holder Bottom.gcode is being carved.
+The carved file is saved as Screw Holder Bottom_carve.svg
+It took 3 seconds to carve the file.
+
+
+>>> carve.getCarveGcode("
+54 162 108 Number of Vertices,Number of Edges,Number of Faces
+-5.800000000000001 5.341893939393939 4.017841892579603 Vertex Coordinates XYZ
+5.800000000000001 5.341893939393939 4.017841892579603
+..
+many lines of GNU Triangulated Surface vertices, edges and faces
+..
+")
+
+"""
+
+from __future__ import absolute_import
+try:
+ import psyco
+ psyco.full()
+except:
+ pass
+#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
+import __init__
+
+from skeinforge_tools.skeinforge_utilities import euclidean
+from skeinforge_tools.skeinforge_utilities import gcodec
+from skeinforge_tools.skeinforge_utilities import preferences
+from skeinforge_tools.skeinforge_utilities import triangle_mesh
+from skeinforge_tools import analyze
+from skeinforge_tools.skeinforge_utilities import interpret
+from skeinforge_tools import polyfile
+import cStringIO
+import math
+import os
+import sys
+import time
+import webbrowser
+
+
+__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
+__date__ = "$Date: 2008/02/05 $"
+__license__ = "GPL 3.0"
+
+
+def getCarveGcode( fileName, carvePreferences = None ):
+ "Carve a shape file."
+ carving = getCarving( fileName )
+ if carving == None:
+ return ''
+ if carvePreferences == None:
+ carvePreferences = CarvePreferences()
+ preferences.readPreferences( carvePreferences )
+ skein = CarveSkein()
+ skein.parseCarving( carvePreferences, carving )
+ return skein.output.getvalue()
+
+def getCarving( fileName ):
+ "Get a carving for the file using an import plugin."
+ importPluginFilenames = interpret.getImportPluginFilenames()
+ for importPluginFilename in importPluginFilenames:
+ fileTypeDot = '.' + importPluginFilename
+ if fileName[ - len( fileTypeDot ) : ].lower() == fileTypeDot:
+ pluginModule = gcodec.getModule( importPluginFilename, 'import_plugins', __file__ )
+ if pluginModule != None:
+ return pluginModule.getCarving( fileName )
+ print( 'Could not find plugin to handle ' + fileName )
+ return None
+
+def getParameterFromJavascript( lines, parameterName, parameterValue ):
+ "Get a paramater from lines of javascript."
+ for line in lines:
+ strippedLine = line.replace( ';', ' ' ).lstrip()
+ splitLine = strippedLine.split()
+ firstWord = gcodec.getFirstWord( splitLine )
+ if firstWord == parameterName:
+ return float( splitLine[ 2 ] )
+ return parameterValue
+
+def getReplacedInQuotes( original, replacement, text ):
+ "Replace what follows in quotes after the word."
+ wordAndQuote = original + '="'
+ originalIndexStart = text.find( wordAndQuote )
+ if originalIndexStart == - 1:
+ return text
+ originalIndexEnd = text.find( '"', originalIndexStart + len( wordAndQuote ) )
+ if originalIndexEnd == - 1:
+ return text
+ wordAndBothQuotes = text[ originalIndexStart : originalIndexEnd + 1 ]
+ return text.replace( wordAndBothQuotes, wordAndQuote + replacement + '"' )
+
+def getReplacedTagString( replacementTagString, tagID, text ):
+ "Get text with the tag string replaced."
+ idString = 'id="' + tagID + '"'
+ idStringIndexStart = text.find( idString )
+ if idStringIndexStart == - 1:
+ return text
+ tagBeginIndex = text.rfind( '<', 0, idStringIndexStart )
+ tagEndIndex = text.find( '>', idStringIndexStart )
+ if tagBeginIndex == - 1 or tagEndIndex == - 1:
+ return text
+ originalTagString = text[ tagBeginIndex : tagEndIndex + 1 ]
+ return text.replace( originalTagString, replacementTagString )
+
+def getReplacedWordAndInQuotes( original, replacement, text ):
+ "Replace the word in the text and replace what follows in quotes after the word."
+ text = text.replace( 'replaceWith' + original, replacement )
+ return getReplacedInQuotes( original, replacement, text )
+
+def writeOutput( fileName = '' ):
+ "Carve a GNU Triangulated Surface file. If no fileName is specified, carve the first GNU Triangulated Surface file in this folder."
+ if fileName == '':
+ unmodified = gcodec.getFilesWithFileTypesWithoutWords( interpret.getImportPluginFilenames() )
+ if len( unmodified ) == 0:
+ print( "There are no GNU Triangulated Surface files in this folder." )
+ return
+ fileName = unmodified[ 0 ]
+ startTime = time.time()
+ carvePreferences = CarvePreferences()
+ preferences.readPreferences( carvePreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being carved.' )
+ carveGcode = getCarveGcode( fileName, carvePreferences )
+ if carveGcode == '':
+ return
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_carve.svg'
+ suffixFilename = suffixFilename.replace( ' ', '_' )
+ gcodec.writeFileText( suffixFilename, carveGcode )
+ print( 'The carved file is saved as ' + gcodec.getSummarizedFilename( suffixFilename ) )
+# packageFilePath = os.path.abspath( __file__ )
+# for level in xrange( numberOfLevelsDeepInPackageHierarchy + 1 ):
+# packageFilePath = os.path.dirname( packageFilePath )
+# documentationPath = os.path.join( os.path.join( packageFilePath, 'documentation' ), self.displayPreferences.fileNameHelp )
+# os.system( webbrowser.get().name + ' ' + documentationPath )#used this instead of webbrowser.open() to workaround webbrowser open() bug
+# analyze.writeOutput( suffixFilename, carveGcode )
+ os.system( webbrowser.get().name + ' ' + suffixFilename )#used this instead of webbrowser.open() to workaround webbrowser open() bug
+ print( 'It took ' + str( int( round( time.time() - startTime ) ) ) + ' seconds to carve the file.' )
+
+
+class CarvePreferences:
+ "A class to handle the carve preferences."
+ def __init__( self ):
+ "Set the default preferences, execute title & preferences fileName."
+ #Set the default preferences.
+ self.archive = []
+ self.extrusionDiameterOverThickness = preferences.FloatPreference().getFromValue( 'Extrusion Diameter over Thickness (ratio):', 1.25 )
+ self.archive.append( self.extrusionDiameterOverThickness )
+ self.extrusionWidthOverThickness = preferences.FloatPreference().getFromValue( 'Extrusion Width over Thickness (ratio):', 1.5 )
+ self.archive.append( self.extrusionWidthOverThickness )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getTranslatorFileTypeTuples(), 'Open File to be Carved', '' )
+ self.archive.append( self.fileNameInput )
+ self.importCoarseness = preferences.FloatPreference().getFromValue( 'Import Coarseness (ratio):', 1.0 )
+ self.archive.append( self.importCoarseness )
+ self.meshTypeLabel = preferences.LabelDisplay().getFromName( 'Mesh Type: ' )
+ self.archive.append( self.meshTypeLabel )
+ importRadio = []
+ self.correctMesh = preferences.Radio().getFromRadio( 'Correct Mesh', importRadio, True )
+ self.archive.append( self.correctMesh )
+ self.unprovenMesh = preferences.Radio().getFromRadio( 'Unproven Mesh', importRadio, False )
+ self.archive.append( self.unprovenMesh )
+ self.infillBridgeWidthOverThickness = preferences.FloatPreference().getFromValue( 'Infill Bridge Width over Thickness (ratio):', 1.5 )
+ self.archive.append( self.infillBridgeWidthOverThickness )
+ self.infillDirectionBridge = preferences.BooleanPreference().getFromValue( 'Infill in Direction of Bridges', True )
+ self.archive.append( self.infillDirectionBridge )
+ self.layerThickness = preferences.FloatPreference().getFromValue( 'Layer Thickness (mm):', 0.4 )
+ self.archive.append( self.layerThickness )
+ self.layerThicknessOverPrecision = preferences.FloatPreference().getFromValue( 'Layer Thickness over Precision (ratio):', 10.0 )
+ self.archive.append( self.layerThicknessOverPrecision )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
+ self.executeTitle = 'Carve'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'carve.csv' )
+ self.fileNameHelp = 'skeinforge_tools.carve.html'
+ self.saveTitle = 'Save Preferences'
+ self.title = 'Carve Preferences'
+
+ def execute( self ):
+ "Carve button has been clicked."
+ fileNames = polyfile.getFileOrDirectoryTypes( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
+
+
+class CarveSkein:
+ "A class to carve a GNU Triangulated Surface."
+ def __init__( self ):
+ self.margin = 20
+ self.output = cStringIO.StringIO()
+ self.textHeight = 22.5
+ self.unitScale = 3.7
+
+ def addInitializationToOutputSVG( self ):
+ "Add initialization gcode to the output."
+ endOfSVGHeaderIndex = self.svgTemplateLines.index( '//End of svg header' )
+ self.addLines( self.svgTemplateLines[ : endOfSVGHeaderIndex ] )
+ self.addLine( '\tdecimalPlacesCarried = ' + str( self.decimalPlacesCarried ) ) # Set decimal places carried.
+ self.addLine( '\textrusionDiameter = ' + self.getRounded( self.extrusionDiameter ) ) # Set extrusion diameter.
+ self.addLine( '\tlayerThickness = ' + self.getRounded( self.layerThickness ) ) # Set layer thickness.
+ self.addLine( '\textrusionWidth = ' + self.getRounded( self.extrusionWidth ) ) # Set extrusion width.
+ # Set bridge extrusion width over solid extrusion width.
+ self.addLine( '\tbridgeExtrusionWidthOverSolid = ' + euclidean.getRoundedToThreePlaces( self.bridgeExtrusionWidth / self.extrusionWidth ) )
+ self.addLine( '\tprocedureDone = "carve"' ) # The skein has been carved.
+ self.addLine( '\textrusionStart = 1' ) # Initialization is finished, extrusion is starting.
+ beginningOfPathSectionIndex = self.svgTemplateLines.index( '//Beginning of path section' )
+ self.addLines( self.svgTemplateLines[ endOfSVGHeaderIndex + 1 : beginningOfPathSectionIndex ] )
+
+ def addLayerStart( self, layerIndex, z ):
+ "Add the start lines for the layer."
+# y = (1 * i + 1) * ( margin + sliceDimY * unitScale) + i * txtHeight
+ layerTranslateY = layerIndex * self.textHeight + ( layerIndex + 1 ) * ( self.extent.y * self.unitScale + self.margin )
+ zRounded = self.getRounded( z )
+ self.addLine( '\t\t<g id="z %s" transform="translate(%s, %s)">' % ( zRounded, self.getRounded( self.margin ), self.getRounded( layerTranslateY ) ) )
+ self.addLine( '\t\t\t<text y="15" fill="#000" stroke="none">Layer %s, z %s</text>' % ( layerIndex, zRounded ) )
+# <g id="z 0.1" transform="translate(20, 242)">
+# <text y="15" fill="#000" stroke="none">Layer 1, z 0.1</text>
+# unit scale (mm=3.7, in=96)
+#
+# g transform
+# x = margin
+# y = (layer + 1) * ( margin + (slice height * unit scale)) + (layer * 20)
+#
+# text
+# y = text height
+#
+# path transform
+# scale = (unit scale) (-1 * unitscale)
+# translate = (-1 * minX) (-1 * minY)
+
+ def addLine( self, line ):
+ "Add a line of text and a newline to the output."
+ self.output.write( line + "\n" )
+
+ def addLines( self, lines ):
+ "Add lines of text to the output."
+ for line in lines:
+ self.addLine( line )
+
+ def addRotatedLoopLayersToOutput( self, rotatedBoundaryLayers ):
+ "Add rotated boundary layers to the output."
+ for rotatedBoundaryLayerIndex in xrange( len( rotatedBoundaryLayers ) ):
+ rotatedBoundaryLayer = rotatedBoundaryLayers[ rotatedBoundaryLayerIndex ]
+ self.addRotatedLoopLayerToOutput( rotatedBoundaryLayerIndex, rotatedBoundaryLayer )
+
+ def addRotatedLoopLayerToOutput( self, layerIndex, rotatedBoundaryLayer ):
+ "Add rotated boundary layer to the output."
+ self.addLayerStart( layerIndex, rotatedBoundaryLayer.z )
+ if rotatedBoundaryLayer.rotation != None:
+ self.addLine('\t\t\t//bridgeDirection %s' % rotatedBoundaryLayer.rotation ) # Indicate the bridge direction.
+# <path transform="scale(3.7, -3.7) translate(0, 5)" d="M 0 -5 L 50 0 L60 50 L 5 50 z M 5 3 L5 15 L15 15 L15 5 z"/>
+# transform = 'scale(' + unitScale + ' ' + (unitScale * -1) + ') translate(' + (sliceMinX * -1) + ' ' + (sliceMinY * -1) + ')'
+ pathString = '\t\t\t<path transform="scale(%s, %s) translate(%s, %s)" d="' % ( self.unitScale, - self.unitScale, self.getRounded( - self.cornerMinimum.x ), self.getRounded( - self.cornerMinimum.y ) )
+ if len( rotatedBoundaryLayer.loops ) > 0:
+ pathString += self.getSVGLoopString( rotatedBoundaryLayer.loops[ 0 ] )
+ for loop in rotatedBoundaryLayer.loops[ 1 : ]:
+ pathString += ' ' + self.getSVGLoopString( loop )
+ pathString += '"/>'
+ self.addLine( pathString )
+ self.addLine( '\t\t</g>' )
+
+ def addShutdownToOutput( self ):
+ "Add shutdown svg to the output."
+ endOfPathSectionIndex = self.svgTemplateLines.index( '//End of path section' )
+ self.addLines( self.svgTemplateLines[ endOfPathSectionIndex + 1 : ] )
+
+ def getReplacedSVGTemplateLines( self, rotatedBoundaryLayers ):
+ "Get the lines of text from the svg_template.txt file."
+#( layers.length + 1 ) * (margin + sliceDimY * unitScale + txtHeight) + margin + txtHeight + margin + 110
+ svgTemplateText = gcodec.getFileTextInFileDirectory( __file__, 'svg_template.svg' )
+ originalTextLines = gcodec.getTextLines( svgTemplateText )
+ self.margin = getParameterFromJavascript( originalTextLines, 'margin', self.margin )
+ self.textHeight = getParameterFromJavascript( originalTextLines, 'textHeight', self.textHeight )
+ javascriptControlsWidth = getParameterFromJavascript( originalTextLines, 'javascripControlBoxX', 510.0 )
+ noJavascriptControlsHeight = getParameterFromJavascript( originalTextLines, 'noJavascriptControlBoxY', 110.0 )
+ controlTop = len( rotatedBoundaryLayers ) * ( self.margin + self.extent.y * self.unitScale + self.textHeight ) + 2.0 * self.margin + self.textHeight
+# width = margin + (sliceDimX * unitScale) + margin;
+ svgTemplateText = getReplacedInQuotes( 'height', self.getRounded( controlTop + noJavascriptControlsHeight + self.margin ), svgTemplateText )
+ width = 2.0 * self.margin + max( self.extent.y * self.unitScale, javascriptControlsWidth )
+ svgTemplateText = getReplacedInQuotes( 'width', self.getRounded( width ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'layerThickness', self.getRounded( self.layerThickness ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'maxX', self.getRounded( self.cornerMaximum.x ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'minX', self.getRounded( self.cornerMinimum.x ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'dimX', self.getRounded( self.extent.x ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'maxY', self.getRounded( self.cornerMaximum.y ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'minY', self.getRounded( self.cornerMinimum.y ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'dimY', self.getRounded( self.extent.y ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'maxZ', self.getRounded( self.cornerMaximum.z ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'minZ', self.getRounded( self.cornerMinimum.z ), svgTemplateText )
+ svgTemplateText = getReplacedWordAndInQuotes( 'dimZ', self.getRounded( self.extent.z ), svgTemplateText )
+ noJavascriptControlsTagString = '<g id="noJavascriptControls" fill="#000" transform="translate(%s, %s)">' % ( self.getRounded( self.margin ), self.getRounded( controlTop ) )
+ svgTemplateText = getReplacedTagString( noJavascriptControlsTagString, 'noJavascriptControls', svgTemplateText )
+# <g id="noJavascriptControls" fill="#000" transform="translate(20, 1400)">
+ return gcodec.getTextLines( svgTemplateText )
+
+ def getRounded( self, number ):
+ "Get number rounded to the number of carried decimal places as a string."
+ return euclidean.getRoundedToDecimalPlaces( self.decimalPlacesCarried, number )
+
+ def getSVGLoopString( self, loop ):
+ "Get the svg loop string."
+ svgLoopString = ''
+ for pointIndex in xrange( len( loop ) ):
+ point = loop[ pointIndex ]
+ stringBeginning = 'M '
+ if pointIndex > 0:
+ stringBeginning = ' L '
+ svgLoopString += stringBeginning + self.getRounded( point.real ) + ' ' + self.getRounded( point.imag )
+ return svgLoopString + ' z'
+
+ def parseCarving( self, carvePreferences, carving ):
+ "Parse gnu triangulated surface text and store the carved gcode."
+ self.layerThickness = carvePreferences.layerThickness.value
+ self.setExtrusionDiameterWidth( carvePreferences )
+ if carvePreferences.infillDirectionBridge.value:
+ carving.setCarveBridgeLayerThickness( self.bridgeLayerThickness )
+ carving.setCarveLayerThickness( self.layerThickness )
+ carving.setCarveExtrusionWidth( self.extrusionWidth )
+ carving.setCarveImportCoarseness( carvePreferences.importCoarseness.value )
+ carving.setCarveIsCorrectMesh( carvePreferences.correctMesh.value )
+ rotatedBoundaryLayers = carving.getCarveRotatedBoundaryLayers()
+ self.cornerMaximum = carving.getCarveCornerMaximum()
+ self.cornerMinimum = carving.getCarveCornerMinimum()
+ #reset from slicable
+ self.layerThickness = carving.getCarveLayerThickness()
+ self.setExtrusionDiameterWidth( carvePreferences )
+ self.decimalPlacesCarried = int( max( 0.0, math.ceil( 1.0 - math.log10( self.layerThickness / carvePreferences.layerThicknessOverPrecision.value ) ) ) )
+ self.extent = self.cornerMaximum - self.cornerMinimum
+ self.svgTemplateLines = self.getReplacedSVGTemplateLines( rotatedBoundaryLayers )
+ self.addInitializationToOutputSVG()
+ self.addRotatedLoopLayersToOutput( rotatedBoundaryLayers )
+ self.addShutdownToOutput()
+
+ def setExtrusionDiameterWidth( self, carvePreferences ):
+ "Set the extrusion diameter & width and the bridge thickness & width."
+ self.extrusionDiameter = carvePreferences.extrusionDiameterOverThickness.value * self.layerThickness
+ self.extrusionWidth = carvePreferences.extrusionWidthOverThickness.value * self.layerThickness
+ self.bridgeExtrusionWidth = carvePreferences.infillBridgeWidthOverThickness.value * self.layerThickness
+ self.bridgeLayerThickness = self.layerThickness * self.extrusionWidth / self.bridgeExtrusionWidth
+
+
+def main():
+ "Display the carve dialog."
+ if len( sys.argv ) > 1:
+ writeOutput( ' '.join( sys.argv[ 1 : ] ) )
+ else:
+ preferences.displayDialog( CarvePreferences() )
+
+if __name__ == "__main__":
+ main()
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/clip.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/clip.py
index eed7b9ad..9f6dc1aa 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/clip.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/clip.py
@@ -44,7 +44,7 @@ The clipped file is saved as Screw Holder Bottom_clip.gcode
>>> clip.getClipGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -53,7 +53,7 @@ many lines of gcode
>>> clip.getClipChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -72,7 +72,7 @@ from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
from skeinforge_tools import comb
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
import cStringIO
import math
@@ -84,11 +84,11 @@ __author__ = "Enrique Perez (perez_enrique@yahoo.com)"
__date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getClipChainGcode( filename, gcodeText, loopTailorPreferences = None ):
+def getClipChainGcode( fileName, gcodeText, loopTailorPreferences = None ):
"Clip a gcode linear move text. Chain clip the gcode if it is not already clipped."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'comb' ):
- gcodeText = comb.getCombChainGcode( filename, gcodeText )
+ gcodeText = comb.getCombChainGcode( fileName, gcodeText )
return getClipGcode( gcodeText, loopTailorPreferences )
def getClipGcode( gcodeText, loopTailorPreferences = None ):
@@ -106,20 +106,20 @@ def getClipGcode( gcodeText, loopTailorPreferences = None ):
skein.parseGcode( gcodeText, loopTailorPreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
- "Clip a gcode linear move file. Chain clip the gcode if it is not already clipped. If no filename is specified, clip the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Clip a gcode linear move file. Chain clip the gcode if it is not already clipped. If no fileName is specified, clip the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
loopTailorPreferences = ClipPreferences()
preferences.readPreferences( loopTailorPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain clipped.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_clip.gcode'
- loopTailorGcode = getClipChainGcode( filename, '', loopTailorPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain clipped.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_clip.gcode'
+ loopTailorGcode = getClipChainGcode( fileName, '', loopTailorPreferences )
if loopTailorGcode == '':
return
gcodec.writeFileText( suffixFilename, loopTailorGcode )
@@ -131,27 +131,27 @@ def writeOutput( filename = '' ):
class ClipPreferences:
"A class to handle the clip preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateClip = preferences.BooleanPreference().getFromValue( 'Activate Clip', True )
self.archive.append( self.activateClip )
self.clipOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Clip Over Extrusion Width (ratio):', 0.15 )
self.archive.append( self.clipOverExtrusionWidth )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Clipped', '' )
- self.archive.append( self.filenameInput )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Clipped', '' )
+ self.archive.append( self.fileNameInput )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Clip'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'clip.csv' )
- self.filenameHelp = 'skeinforge_tools.clip.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'clip.csv' )
+ self.fileNameHelp = 'skeinforge_tools.clip.html'
self.saveTitle = 'Save Preferences'
self.title = 'Clip Preferences'
def execute( self ):
"Clip button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class ClipSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/comb.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/comb.py
index baf0741b..b7ba70e1 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/comb.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/comb.py
@@ -4,7 +4,7 @@ Comb is a script to comb the extrusion hair of a gcode file.
The default 'Activate Comb' checkbox is on. When it is on, the functions described below will work, when it is off, the functions
will not be called.
-Comb bends the extruder travel paths around holes in the slice, to avoid stringers. It moves the extruder to the inside of outer
+Comb bends the extruder travel paths around holes in the carve, to avoid stringers. It moves the extruder to the inside of outer
perimeters before turning the extruder on so any start up ooze will be inside the shape. It jitters the loop end position to a
different place on each layer to prevent the a ridge from forming. The 'Arrival Inset Follow Distance over Extrusion Width' is the
ratio of the amount before the start of the outer perimeter the extruder will be moved to. A high value means the extruder will
@@ -48,7 +48,7 @@ The combed file is saved as Screw Holder Bottom_comb.gcode
>>> comb.getCombGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -57,7 +57,7 @@ many lines of gcode
>>> comb.getCombChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -75,7 +75,7 @@ from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
from skeinforge_tools import tower
import cStringIO
@@ -90,11 +90,11 @@ __license__ = "GPL 3.0"
#patched over falling tower comb bug if location.z < self.getBetweens()[ 0 ][ 0 ].z + 0.5 * self.extrusionWidth, but a real solution would be nice
#addLoopsBeforeLeavingPerimeter or something before crossing bug, seen on layer 8 of Screw holder
-def getCombChainGcode( filename, gcodeText, combPreferences = None ):
+def getCombChainGcode( fileName, gcodeText, combPreferences = None ):
"Comb a gcode linear move text. Chain comb the gcode if it is not already combed."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'tower' ):
- gcodeText = tower.getTowerChainGcode( filename, gcodeText )
+ gcodeText = tower.getTowerChainGcode( fileName, gcodeText )
return getCombGcode( gcodeText, combPreferences )
def getCombGcode( gcodeText, combPreferences = None ):
@@ -118,20 +118,20 @@ def isLoopNumberEqual( betweenX, betweenXIndex, loopNumber ):
return False
return betweenX[ betweenXIndex ].index == loopNumber
-def writeOutput( filename = '' ):
- "Comb a gcode linear move file. Chain comb the gcode if it is not already combed. If no filename is specified, comb the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Comb a gcode linear move file. Chain comb the gcode if it is not already combed. If no fileName is specified, comb the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
combPreferences = CombPreferences()
preferences.readPreferences( combPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain combed.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_comb.gcode'
- combGcode = getCombChainGcode( filename, '', combPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain combed.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_comb.gcode'
+ combGcode = getCombChainGcode( fileName, '', combPreferences )
if combGcode == '':
return
gcodec.writeFileText( suffixFilename, combGcode )
@@ -143,7 +143,7 @@ def writeOutput( filename = '' ):
class CombPreferences:
"A class to handle the comb preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateComb = preferences.BooleanPreference().getFromValue( 'Activate Comb', True )
@@ -154,20 +154,20 @@ class CombPreferences:
self.archive.append( self.jitterOverExtrusionWidth )
self.minimumPerimeterDepartureDistanceOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Minimum Perimeter Departure Distance over Extrusion Width (ratio):', 30.0 )
self.archive.append( self.minimumPerimeterDepartureDistanceOverExtrusionWidth )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Combed', '' )
- self.archive.append( self.filenameInput )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Combed', '' )
+ self.archive.append( self.fileNameInput )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Comb'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'comb.csv' )
- self.filenameHelp = 'skeinforge_tools.comb.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'comb.csv' )
+ self.fileNameHelp = 'skeinforge_tools.comb.html'
self.saveTitle = 'Save Preferences'
self.title = 'Comb Preferences'
def execute( self ):
"Comb button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class CombSkein:
@@ -491,7 +491,8 @@ class CombSkein:
if self.isLoopPerimeter:
if self.isNextExtruderOn():
self.loopPath = euclidean.PathZ( location.z )
- self.beforeLoopLocation = self.oldLocation.dropAxis( 2 )
+ if self.oldLocation != None:
+ self.beforeLoopLocation = self.oldLocation.dropAxis( 2 )
if self.loopPath != None:
self.loopPath.path.append( location.dropAxis( 2 ) )
self.oldLocation = location
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/cool.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/cool.py
index b93f1624..c585406d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/cool.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/cool.py
@@ -55,7 +55,7 @@ It took 34 seconds to cool the file.
>>> cool.getCoolGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -64,7 +64,7 @@ many lines of gcode
>>> cool.getCoolChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -83,7 +83,7 @@ from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
from skeinforge_tools import clip
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
import cStringIO
import math
@@ -96,11 +96,11 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getCoolChainGcode( filename, gcodeText, coolPreferences = None ):
+def getCoolChainGcode( fileName, gcodeText, coolPreferences = None ):
"Cool a gcode linear move text. Chain cool the gcode if it is not already cooled."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'clip' ):
- gcodeText = clip.getClipChainGcode( filename, gcodeText )
+ gcodeText = clip.getClipChainGcode( fileName, gcodeText )
return getCoolGcode( gcodeText, coolPreferences )
def getCoolGcode( gcodeText, coolPreferences = None ):
@@ -118,20 +118,20 @@ def getCoolGcode( gcodeText, coolPreferences = None ):
skein.parseGcode( gcodeText, coolPreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
- "Cool a gcode linear move file. Chain cool the gcode if it is not already cooled. If no filename is specified, cool the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Cool a gcode linear move file. Chain cool the gcode if it is not already cooled. If no fileName is specified, cool the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
coolPreferences = CoolPreferences()
preferences.readPreferences( coolPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain cooled.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_cool.gcode'
- coolGcode = getCoolChainGcode( filename, '', coolPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain cooled.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_cool.gcode'
+ coolGcode = getCoolChainGcode( fileName, '', coolPreferences )
if coolGcode == '':
return
gcodec.writeFileText( suffixFilename, coolGcode )
@@ -231,31 +231,31 @@ class CoolSkein:
class CoolPreferences:
"A class to handle the cool preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateCool = preferences.BooleanPreference().getFromValue( 'Activate Cool', True )
self.archive.append( self.activateCool )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Cooled', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Cooled', '' )
+ self.archive.append( self.fileNameInput )
self.minimumLayerTime = preferences.FloatPreference().getFromValue( 'Minimum Layer Time (seconds):', 60.0 )
self.archive.append( self.minimumLayerTime )
self.turnFanOnAtBeginning = preferences.BooleanPreference().getFromValue( 'Turn Fan On at Beginning', True )
self.archive.append( self.turnFanOnAtBeginning )
self.turnFanOffAtEnding = preferences.BooleanPreference().getFromValue( 'Turn Fan Off at Ending', True )
self.archive.append( self.turnFanOffAtEnding )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Cool'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'cool.csv' )
- self.filenameHelp = 'skeinforge_tools.cool.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'cool.csv' )
+ self.fileNameHelp = 'skeinforge_tools.cool.html'
self.saveTitle = 'Save Preferences'
self.title = 'Cool Preferences'
def execute( self ):
"Cool button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
def main( hashtable = None ):
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export.py
index 3e29331a..b5b3f203 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export.py
@@ -56,7 +56,7 @@ from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
from skeinforge_tools import unpause
import cStringIO
@@ -92,23 +92,23 @@ def getSelectedPlugin( exportPreferences ):
return plugin
return None
-def writeOutput( filename = '' ):
+def writeOutput( fileName = '' ):
"""Export a gcode linear move file. Chain export the gcode if it is not already exported.
- If no filename is specified, export the first unmodified gcode file in this folder."""
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ If no fileName is specified, export the first unmodified gcode file in this folder."""
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
exportPreferences = ExportPreferences()
preferences.readPreferences( exportPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain exported.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_export.' + exportPreferences.fileExtension.value
- gcodeText = gcodec.getGcodeFileText( filename, '' )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain exported.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_export.' + exportPreferences.fileExtension.value
+ gcodeText = gcodec.getGcodeFileText( fileName, '' )
if not gcodec.isProcedureDone( gcodeText, 'unpause' ):
- gcodeText = unpause.getUnpauseChainGcode( filename, gcodeText )
+ gcodeText = unpause.getUnpauseChainGcode( fileName, gcodeText )
if gcodeText == '':
return
analyze.writeOutput( suffixFilename, gcodeText )
@@ -133,7 +133,7 @@ def writeOutput( filename = '' ):
class ExportPreferences:
"A class to handle the export preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateExport = preferences.BooleanPreference().getFromValue( 'Activate Export', True )
@@ -169,20 +169,20 @@ class ExportPreferences:
self.archive += self.exportOperationsButtons
self.fileExtension = preferences.StringPreference().getFromValue( 'File Extension:', 'gcode' )
self.archive.append( self.fileExtension )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Exported', '' )
- self.archive.append( self.filenameInput )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Exported', '' )
+ self.archive.append( self.fileNameInput )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Export'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'export.csv' )
- self.filenameHelp = 'skeinforge_tools.export.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'export.csv' )
+ self.fileNameHelp = 'skeinforge_tools.export.html'
self.saveTitle = 'Save Preferences'
self.title = 'Export Preferences'
def execute( self ):
"Export button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class ExportSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/binary_16_byte.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/binary_16_byte.py
index 09507e73..e3a81d6d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/binary_16_byte.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/binary_16_byte.py
@@ -61,7 +61,7 @@ from __future__ import absolute_import
import __init__
from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import preferences
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
from struct import Struct
import cStringIO
@@ -107,11 +107,11 @@ def getStringFromCharacterSplitLine( character, splitLine ):
return None
return splitLine[ indexOfCharacter ][ 1 : ]
-def getSummarizedFilename( filename ):
- "Get the filename basename if the file is in the current working directory, otherwise return the original full name."
- if os.getcwd() == os.path.dirname( filename ):
- return os.path.basename( filename )
- return filename
+def getSummarizedFilename( fileName ):
+ "Get the fileName basename if the file is in the current working directory, otherwise return the original full name."
+ if os.getcwd() == os.path.dirname( fileName ):
+ return os.path.basename( fileName )
+ return fileName
def getTextLines( text ):
"Get the all the lines of text of a text."
@@ -130,28 +130,28 @@ def isArchivable():
"Return whether or not this plugin is archivable."
return True
-def writeFileText( filename, fileText ):
+def writeFileText( fileName, fileText ):
"Write a text to a file."
try:
- file = open( filename, 'wb' )
+ file = open( fileName, 'wb' )
file.write( fileText )
file.close()
except IOError:
- print( 'The file ' + filename + ' can not be written to.' )
+ print( 'The file ' + fileName + ' can not be written to.' )
-def writeOutput( filename = '', gcodeText = '' ):
+def writeOutput( fileName = '', gcodeText = '' ):
"Write the exported version of a gcode file. This function, getOutput and isArchivable are the only necessary functions in a skeinforge export plugin."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
binary16BytePreferences = Binary16BytePreferences()
preferences.readPreferences( binary16BytePreferences )
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
skeinOutput = getOutput( gcodeText, binary16BytePreferences )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_export.' + binary16BytePreferences.fileExtension.value
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_export.' + binary16BytePreferences.fileExtension.value
writeFileText( suffixFilename, skeinOutput )
print( 'The converted file is saved as ' + getSummarizedFilename( suffixFilename ) )
@@ -159,13 +159,13 @@ def writeOutput( filename = '', gcodeText = '' ):
class Binary16BytePreferences:
"A class to handle the export preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.fileExtension = preferences.StringPreference().getFromValue( 'File Extension:', 'bin' )
self.archive.append( self.fileExtension )
- self.filenameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to be Converted to Binary 16 Byte', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to be Converted to Binary 16 Byte', '' )
+ self.archive.append( self.fileNameInput )
self.feedrateStepLength = preferences.FloatPreference().getFromValue( 'Feedrate Step Length (millimeters/second)', 0.1 )
self.archive.append( self.feedrateStepLength )
self.xStepLength = preferences.FloatPreference().getFromValue( 'X Step Length (millimeters)', 0.1 )
@@ -180,18 +180,18 @@ class Binary16BytePreferences:
self.archive.append( self.yOffset )
self.zOffset = preferences.FloatPreference().getFromValue( 'Z Offset (millimeters)', 0.0 )
self.archive.append( self.zOffset )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Convert to Binary 16 Byte'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'binary_16_byte.csv' )
- self.filenameHelp = 'skeinforge_tools.export_plugins.binary_16_byte.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'binary_16_byte.csv' )
+ self.fileNameHelp = 'skeinforge_tools.export_plugins.binary_16_byte.html'
self.saveTitle = 'Save Preferences'
self.title = 'Binary 16 Byte Preferences'
def execute( self ):
"Convert to binary 16 byte button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, [ '.gcode' ], self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, [ '.gcode' ], self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class Binary16ByteSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_small.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_small.py
index 3bc5c49a..710b7d47 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_small.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_small.py
@@ -37,11 +37,11 @@ def getStringFromCharacterSplitLine( character, splitLine ):
return None
return splitLine[ indexOfCharacter ][ 1 : ]
-def getSummarizedFilename( filename ):
- "Get the filename basename if the file is in the current working directory, otherwise return the original full name."
- if os.getcwd() == os.path.dirname( filename ):
- return os.path.basename( filename )
- return filename
+def getSummarizedFilename( fileName ):
+ "Get the fileName basename if the file is in the current working directory, otherwise return the original full name."
+ if os.getcwd() == os.path.dirname( fileName ):
+ return os.path.basename( fileName )
+ return fileName
def getTextLines( text ):
"Get the all the lines of text of a text."
@@ -60,20 +60,20 @@ def isArchivable():
"Return whether or not this plugin is archivable."
return False
-def writeFileText( filename, fileText ):
+def writeFileText( fileName, fileText ):
"Write a text to a file."
try:
- file = open( filename, 'w+' )
+ file = open( fileName, 'w+' )
file.write( fileText )
file.close()
except IOError:
- print( 'The file ' + filename + ' can not be written to.' )
+ print( 'The file ' + fileName + ' can not be written to.' )
-def writeOutput( filename, gcodeText ):
+def writeOutput( fileName, gcodeText ):
"Write the exported version of a gcode file. This function, getOutput and isArchivable are the only necessary functions in a skeinforge export plugin."
output = getOutput( gcodeText )
- writeFileText( filename, output )
- print( 'The exported file is saved as ' + getSummarizedFilename( filename ) )
+ writeFileText( fileName, output )
+ print( 'The exported file is saved as ' + getSummarizedFilename( fileName ) )
class GcodeSmallSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_step.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_step.py
index 87f998c1..6a799242 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_step.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/export_plugins/gcode_step.py
@@ -26,7 +26,7 @@ from __future__ import absolute_import
import __init__
from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import preferences
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
from struct import Struct
import cStringIO
@@ -74,11 +74,11 @@ def getStringFromCharacterSplitLine( character, splitLine ):
return None
return splitLine[ indexOfCharacter ][ 1 : ]
-def getSummarizedFilename( filename ):
- "Get the filename basename if the file is in the current working directory, otherwise return the original full name."
- if os.getcwd() == os.path.dirname( filename ):
- return os.path.basename( filename )
- return filename
+def getSummarizedFilename( fileName ):
+ "Get the fileName basename if the file is in the current working directory, otherwise return the original full name."
+ if os.getcwd() == os.path.dirname( fileName ):
+ return os.path.basename( fileName )
+ return fileName
def getTextLines( text ):
"Get the all the lines of text of a text."
@@ -97,38 +97,38 @@ def isArchivable():
"Return whether or not this plugin is archivable."
return True
-def writeFileText( filename, fileText ):
+def writeFileText( fileName, fileText ):
"Write a text to a file."
try:
- file = open( filename, 'wb' )
+ file = open( fileName, 'wb' )
file.write( fileText )
file.close()
except IOError:
- print( 'The file ' + filename + ' can not be written to.' )
+ print( 'The file ' + fileName + ' can not be written to.' )
-def writeOutput( filename = '', gcodeText = '' ):
+def writeOutput( fileName = '', gcodeText = '' ):
"Write the exported version of a gcode file. This function, getOutput and isArchivable are the only necessary functions in a skeinforge export plugin."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
gcodeStepPreferences = GcodeStepPreferences()
preferences.readPreferences( gcodeStepPreferences )
if gcodeText == '':
- if filename[ - len( '.gcode' ) : ] == '.gcode':
- gcodeText = gcodec.getFileText( filename )
- filename = filename[ : filename.rfind( '.' ) ] + '_export.gcode'
+ if fileName[ - len( '.gcode' ) : ] == '.gcode':
+ gcodeText = gcodec.getFileText( fileName )
+ fileName = fileName[ : fileName.rfind( '.' ) ] + '_export.gcode'
output = getOutput( gcodeText, gcodeStepPreferences )
- writeFileText( filename, output )
- print( 'The converted file is saved as ' + getSummarizedFilename( filename ) )
+ writeFileText( fileName, output )
+ print( 'The converted file is saved as ' + getSummarizedFilename( fileName ) )
class GcodeStepPreferences:
"A class to handle the export preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.addFeedrateEvenWhenUnchanging = preferences.BooleanPreference().getFromValue( 'Add Feedrate Even When Unchanging', True )
@@ -137,8 +137,8 @@ class GcodeStepPreferences:
self.archive.append( self.addSpaceBetweenWords )
self.addZEvenWhenUnchanging = preferences.BooleanPreference().getFromValue( 'Add Z Even When Unchanging', True )
self.archive.append( self.addZEvenWhenUnchanging )
- self.filenameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to be Converted to Gcode Step', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( [ ( 'Gcode text files', '*.gcode' ) ], 'Open File to be Converted to Gcode Step', '' )
+ self.archive.append( self.fileNameInput )
self.feedrateStepLength = preferences.FloatPreference().getFromValue( 'Feedrate Step Length (millimeters/second)', 0.1 )
self.archive.append( self.feedrateStepLength )
self.radiusStepLength = preferences.FloatPreference().getFromValue( 'Radius Step Length (millimeters)', 0.1 )
@@ -155,18 +155,18 @@ class GcodeStepPreferences:
self.archive.append( self.yOffset )
self.zOffset = preferences.FloatPreference().getFromValue( 'Z Offset (millimeters)', 0.0 )
self.archive.append( self.zOffset )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Convert to Gcode Step'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'gcode_step.csv' )
- self.filenameHelp = 'skeinforge_tools.export_plugins.gcode_step.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'gcode_step.csv' )
+ self.fileNameHelp = 'skeinforge_tools.export_plugins.gcode_step.html'
self.saveTitle = 'Save Preferences'
self.title = 'Gcode Step Preferences'
def execute( self ):
"Convert to gcode step button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, [ '.gcode' ], self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, [ '.gcode' ], self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class GcodeStepSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fill.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fill.py
index 0cfc0025..d7351f54 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fill.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fill.py
@@ -1,6 +1,6 @@
#! /usr/bin/env python
"""
-Fill is a script to fill the slices of a gcode file.
+Fill is a script to fill the carves of a gcode file.
The diaphragm is a solid group of layers, at regular intervals. It can be used with a sparse infill to give the object watertight, horizontal
compartments and/or a higher shear strength. The "Diaphragm Period" is the number of layers between diaphrams. The "Diaphragm
@@ -88,9 +88,9 @@ from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
+from skeinforge_tools import inset
from skeinforge_tools import polyfile
-from skeinforge_tools import slice_shape
import cStringIO
import math
import sys
@@ -101,8 +101,9 @@ __author__ = "Enrique Perez (perez_enrique@yahoo.com)"
__date__ = "$Date: 2008/28/04 $"
__license__ = "GPL 3.0"
-#oozebane to handle minimum start up, add differential flow rates
-#use slice format, carve & inset, slice aoi xml
+#use slice svg and slc format
+#move early startup to oozebane
+#carve aoi xml
#user mcodes
#skeinedge
#pyramidal
@@ -125,7 +126,7 @@ __license__ = "GPL 3.0"
#custom inclined plane, inclined plane from model, screw, fillet travel as well maybe
#maybe much afterwards make congajure multistep view
#maybe bridge supports although staggered spans are probably better
-#maybe update slice to add perimeter path intersection information to the large loop also
+#maybe update carve to add perimeter path intersection information to the large loop also
#maybe stripe although mosaic alone can handle it
#stretch fiber around shape
#multiple heads around edge
@@ -255,11 +256,11 @@ def addSparseEndpointsFromSegment( doubleExtrusionWidth, endpoints, fillLine, ho
return
endpoints += segment
-def addSurroundingXIntersectionIndexes( surroundingSlices, xIntersectionIndexList, y ):
+def addSurroundingXIntersectionIndexes( surroundingCarves, xIntersectionIndexList, y ):
"Add x intersection indexes from surrounding layers."
- for surroundingIndex in xrange( len( surroundingSlices ) ):
- surroundingSlice = surroundingSlices[ surroundingIndex ]
- euclidean.addXIntersectionIndexesFromLoops( surroundingSlice, surroundingIndex, xIntersectionIndexList, y )
+ for surroundingIndex in xrange( len( surroundingCarves ) ):
+ surroundingCarve = surroundingCarves[ surroundingIndex ]
+ euclidean.addXIntersectionIndexesFromLoops( surroundingCarve, surroundingIndex, xIntersectionIndexList, y )
def addYIntersectionPathToList( pathIndex, pointIndex, y, yIntersection, yIntersectionPaths ):
"Add the y intersection path to the y intersection paths."
@@ -346,15 +347,15 @@ def getExtraFillLoops( insideLoops, outsideLoop, radius ):
extraFillLoops.append( inset )
return extraFillLoops
-def getFillChainGcode( filename, gcodeText, fillPreferences = None ):
- "Fill the slices of a gcode text. Chain fill the gcode if it is not already sliced."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
- if not gcodec.isProcedureDone( gcodeText, 'slice_shape' ):
- gcodeText = slice_shape.getSliceGcode( filename )
+def getFillChainGcode( fileName, gcodeText, fillPreferences = None ):
+ "Fill the carves of a gcode text. Chain fill the gcode if it is not already carved."
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
+ if not gcodec.isProcedureDone( gcodeText, 'inset' ):
+ gcodeText = inset.getInsetChainGcode( fileName, gcodeText )
return getFillGcode( gcodeText, fillPreferences )
def getFillGcode( gcodeText, fillPreferences = None ):
- "Fill the slices of a gcode text."
+ "Fill the carves of a gcode text."
if gcodeText == '':
return ''
if gcodec.isProcedureDone( gcodeText, 'fill' ):
@@ -413,11 +414,11 @@ def getPlusMinusSign( number ):
return 1.0
return - 1.0
-def getSurroundingXIntersections( doubleSolidSurfaceThickness, surroundingSlices, y ):
+def getSurroundingXIntersections( doubleSolidSurfaceThickness, surroundingCarves, y ):
"Get x intersections from surrounding layers."
xIntersectionIndexList = []
- addSurroundingXIntersectionIndexes( surroundingSlices, xIntersectionIndexList, y )
- if len( surroundingSlices ) < doubleSolidSurfaceThickness:
+ addSurroundingXIntersectionIndexes( surroundingCarves, xIntersectionIndexList, y )
+ if len( surroundingCarves ) < doubleSolidSurfaceThickness:
return None
return getIntersectionOfXIntersectionIndexes( doubleSolidSurfaceThickness, xIntersectionIndexList )
@@ -720,20 +721,20 @@ def setIsOutside( yCloseToCenterPath, yIntersectionPaths ):
return
yCloseToCenterPath.isOutside = True
-def writeOutput( filename = '' ):
- "Fill the slices of a gcode file. Chain slice the file if it is a GNU TriangulatedSurface file. If no filename is specified, fill the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Fill the carves of a gcode file. Chain carve the file if it is a GNU TriangulatedSurface file. If no fileName is specified, fill the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
startTime = time.time()
fillPreferences = FillPreferences()
preferences.readPreferences( fillPreferences )
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain filled.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_fill.gcode'
- fillGcode = getFillChainGcode( filename, '', fillPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain filled.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_fill.gcode'
+ fillGcode = getFillChainGcode( fileName, '', fillPreferences )
if fillGcode == '':
return
gcodec.writeFileText( suffixFilename, fillGcode )
@@ -745,7 +746,7 @@ def writeOutput( filename = '' ):
class FillPreferences:
"A class to handle the fill preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.diaphragmPeriod = preferences.IntPreference().getFromValue( 'Diaphragm Period (layers):', 999999 )
@@ -762,8 +763,8 @@ class FillPreferences:
self.archive.append( self.gridExtraOverlap )
self.gridJunctionSeparationOverInnerOctogonRadius = preferences.FloatPreference().getFromValue( 'Grid Junction Separation over Inner Octogon Radius (ratio):', 0.0 )
self.archive.append( self.gridJunctionSeparationOverInnerOctogonRadius )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Filled', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Filled', '' )
+ self.archive.append( self.fileNameInput )
self.infillBeginRotation = preferences.FloatPreference().getFromValue( 'Infill Begin Rotation (degrees):', 45.0 )
self.archive.append( self.infillBeginRotation )
self.infillBeginRotationRepeat = preferences.IntPreference().getFromValue( 'Infill Begin Rotation Repeat (layers):', 1 )
@@ -785,18 +786,18 @@ class FillPreferences:
self.archive.append( self.interiorInfillDensityOverExteriorDensity )
self.solidSurfaceThickness = preferences.IntPreference().getFromValue( 'Solid Surface Thickness (layers):', 3 )
self.archive.append( self.solidSurfaceThickness )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Fill'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'fill.csv' )
- self.filenameHelp = 'skeinforge_tools.fill.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'fill.csv' )
+ self.fileNameHelp = 'skeinforge_tools.fill.html'
self.saveTitle = 'Save Preferences'
self.title = 'Fill Preferences'
def execute( self ):
"Fill button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class FillSkein:
@@ -818,7 +819,7 @@ class FillSkein:
self.thread = None
def addFill( self, layerIndex ):
- "Add fill to the slice layer."
+ "Add fill to the carve layer."
# if layerIndex != 17 and layerIndex != 18:
# return
alreadyFilledArounds = []
@@ -855,14 +856,14 @@ class FillSkein:
loops = []
for surroundingLoop in rotatedLayer.surroundingLoops:
loops.append( surroundingLoop.boundary )
- surroundingSlices = []
+ surroundingCarves = []
layerRemainder = layerIndex % int( round( self.fillPreferences.diaphragmPeriod.value ) )
if layerRemainder >= int( round( self.fillPreferences.diaphragmThickness.value ) ):
for surroundingIndex in xrange( 1, self.solidSurfaceThickness + 1 ):
- self.addRotatedSlice( layerIndex - surroundingIndex, reverseRotationAroundZAngle, surroundingSlices )
- self.addRotatedSlice( layerIndex + surroundingIndex, reverseRotationAroundZAngle, surroundingSlices )
+ self.addRotatedCarve( layerIndex - surroundingIndex, reverseRotationAroundZAngle, surroundingCarves )
+ self.addRotatedCarve( layerIndex + surroundingIndex, reverseRotationAroundZAngle, surroundingCarves )
extraShells = self.fillPreferences.extraShellsSparseLayer.value
- if len( surroundingSlices ) < self.doubleSolidSurfaceThickness:
+ if len( surroundingCarves ) < self.doubleSolidSurfaceThickness:
extraShells = self.fillPreferences.extraShellsAlternatingSolidLayer.value
if self.lastExtraShells != self.fillPreferences.extraShellsBase.value:
extraShells = self.fillPreferences.extraShellsBase.value
@@ -899,7 +900,7 @@ class FillSkein:
return
back = euclidean.getBackOfLoops( arounds )
front = euclidean.getFrontOfLoops( arounds )
- area = self.getSliceArea( layerIndex )
+ area = self.getCarveArea( layerIndex )
if area > 0.0:
areaChange = 1.0
for surroundingIndex in xrange( 1, self.solidSurfaceThickness + 1 ):
@@ -919,14 +920,14 @@ class FillSkein:
for fillLine in xrange( len( horizontalSegments ) ):
y = front + float( fillLine ) * layerExtrusionWidth
horizontalEndpoints = horizontalSegments[ fillLine ]
- surroundingXIntersections = getSurroundingXIntersections( self.doubleSolidSurfaceThickness, surroundingSlices, y )
+ surroundingXIntersections = getSurroundingXIntersections( self.doubleSolidSurfaceThickness, surroundingCarves, y )
addSparseEndpoints( doubleExtrusionWidth, endpoints, fillLine, horizontalSegments, layerInfillSolidity, removedEndpoints, self.solidSurfaceThickness, surroundingXIntersections )
if len( endpoints ) < 1:
euclidean.addToThreadsRemoveFromSurroundings( self.oldOrderedLocation, surroundingLoops, self )
return
paths = euclidean.getPathsFromEndpoints( endpoints, layerFillInset, aroundPixelTable, aroundWidth )
if not self.fillPreferences.infillPatternLine.value:
- self.addGrid( alreadyFilledArounds, arounds, fillLoops, gridPointInsetX, paths, aroundPixelTable, aroundWidth, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingSlices )
+ self.addGrid( alreadyFilledArounds, arounds, fillLoops, gridPointInsetX, paths, aroundPixelTable, aroundWidth, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingCarves )
oldRemovedEndpointLength = len( removedEndpoints ) + 1
while oldRemovedEndpointLength - len( removedEndpoints ) > 0:
oldRemovedEndpointLength = len( removedEndpoints )
@@ -953,8 +954,8 @@ class FillSkein:
"Add a movement to the output."
self.addLine( "G1 X%s Y%s Z%s" % ( self.getRounded( point.real ), self.getRounded( point.imag ), self.getRounded( z ) ) )
- def addGrid( self, alreadyFilledArounds, arounds, fillLoops, gridPointInsetX, paths, pixelTable, width, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingSlices ):
- gridPoints = self.getGridPoints( alreadyFilledArounds, fillLoops, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingSlices )
+ def addGrid( self, alreadyFilledArounds, arounds, fillLoops, gridPointInsetX, paths, pixelTable, width, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingCarves ):
+ gridPoints = self.getGridPoints( alreadyFilledArounds, fillLoops, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingCarves )
gridPointInsetY = gridPointInsetX * ( 1.0 - self.fillPreferences.gridExtraOverlap.value )
if self.fillPreferences.infillPatternGridRectangular.value:
gridPointInsetX += self.gridJunctionSeparation
@@ -968,7 +969,7 @@ class FillSkein:
oldGridPointLength = len( gridPoints )
self.addRemainingGridPoints( arounds, gridPointInsetX, gridPointInsetY, gridPoints, False, paths, pixelTable, width )
- def addGridLinePoints( self, alreadyFilledArounds, begin, end, gridPoints, gridRotationAngle, offset, rotatedExtruderLoops, surroundingSlices, y ):
+ def addGridLinePoints( self, alreadyFilledArounds, begin, end, gridPoints, gridRotationAngle, offset, rotatedExtruderLoops, surroundingCarves, y ):
"Add the segments of one line of a grid to the infill."
if self.gridRadius == 0.0:
return
@@ -981,7 +982,7 @@ class FillSkein:
while gridXOffset < end:
gridPointComplex = complex( gridXOffset, y ) * gridRotationAngle
gridPoint = complex( gridPointComplex.real, gridPointComplex.imag )
- if self.isPointInsideLineSegments( alreadyFilledArounds, gridPoint, rotatedExtruderLoops, surroundingSlices ):
+ if self.isPointInsideLineSegments( alreadyFilledArounds, gridPoint, rotatedExtruderLoops, surroundingCarves ):
gridPoints.append( gridPoint )
gridXStep = self.getNextGripXStep( gridXStep )
gridXOffset = offset + gridWidth * float( gridXStep )
@@ -997,16 +998,16 @@ class FillSkein:
gridPoint = gridPoints[ gridPointIndex ]
addAroundGridPoint( arounds, gridPoint, gridPointInsetX, gridPointInsetY, gridPoints, self.gridRadius, isBothOrNone, self.isDoubleJunction, self.isJunctionWide, paths, pixelTable, width )
- def addRotatedSlice( self, layerIndex, reverseRotationAroundZAngle, surroundingSlices ):
- "Add a rotated slice to the surrounding slices."
+ def addRotatedCarve( self, layerIndex, reverseRotationAroundZAngle, surroundingCarves ):
+ "Add a rotated carve to the surrounding carves."
if layerIndex < 0 or layerIndex >= len( self.rotatedLayers ):
return
surroundingLoops = self.rotatedLayers[ layerIndex ].surroundingLoops
- rotatedSlice = []
+ rotatedCarve = []
for surroundingLoop in surroundingLoops:
planeRotatedLoop = euclidean.getPointsRoundZAxis( reverseRotationAroundZAngle, surroundingLoop.boundary )
- rotatedSlice.append( planeRotatedLoop )
- surroundingSlices.append( rotatedSlice )
+ rotatedCarve.append( planeRotatedLoop )
+ surroundingCarves.append( rotatedCarve )
def addShutdownToOutput( self ):
"Add shutdown gcode to the output."
@@ -1026,11 +1027,11 @@ class FillSkein:
self.thread.append( location.dropAxis( 2 ) )
def getAreaChange( self, area, layerIndex ):
- "Get the difference between the area of the slice at the layer index and the given area."
- layerArea = self.getSliceArea( layerIndex )
+ "Get the difference between the area of the carve at the layer index and the given area."
+ layerArea = self.getCarveArea( layerIndex )
return min( area, layerArea ) / max( area, layerArea )
- def getGridPoints( self, alreadyFilledArounds, fillLoops, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingSlices ):
+ def getGridPoints( self, alreadyFilledArounds, fillLoops, reverseRotationAroundZAngle, rotatedExtruderLoops, surroundingCarves ):
"Add a grid to the infill."
if self.infillSolidity > 0.8:
return []
@@ -1038,8 +1039,8 @@ class FillSkein:
rotationBaseAngle = euclidean.getPolar( self.infillBeginRotation, 1.0 )
reverseRotationBaseAngle = complex( rotationBaseAngle.real, - rotationBaseAngle.imag )
gridRotationAngle = reverseRotationAroundZAngle * rotationBaseAngle
- surroundingSlicesLength = len( surroundingSlices )
- if surroundingSlicesLength < self.doubleSolidSurfaceThickness:
+ surroundingCarvesLength = len( surroundingCarves )
+ if surroundingCarvesLength < self.doubleSolidSurfaceThickness:
return []
gridAlreadyFilledArounds = []
gridRotatedExtruderLoops = []
@@ -1082,7 +1083,7 @@ class FillSkein:
end = max( endpointFirst.point.real, endpointSecond.point.real )
y = endpointFirst.point.imag
offset = self.offsetMultiplier * self.gridRadius * ( round( y / self.gridRadius ) % 2 )
- self.addGridLinePoints( alreadyFilledArounds, begin, end, gridPoints, gridRotationAngle, offset, rotatedExtruderLoops, surroundingSlices, y )
+ self.addGridLinePoints( alreadyFilledArounds, begin, end, gridPoints, gridRotationAngle, offset, rotatedExtruderLoops, surroundingCarves, y )
return gridPoints
def getLayerRoundZ( self, layerIndex ):
@@ -1106,8 +1107,8 @@ class FillSkein:
"Get number rounded to the number of carried decimal places as a string."
return euclidean.getRoundedToDecimalPlaces( self.decimalPlacesCarried, number )
- def getSliceArea( self, layerIndex ):
- "Get the area of the slice."
+ def getCarveArea( self, layerIndex ):
+ "Get the area of the carve."
if layerIndex < 0 or layerIndex >= len( self.rotatedLayers ):
return 0.0
surroundingLoops = self.rotatedLayers[ layerIndex ].surroundingLoops
@@ -1116,12 +1117,12 @@ class FillSkein:
area += euclidean.getPolygonArea( surroundingLoop.boundary )
return area
- def isPointInsideLineSegments( self, alreadyFilledArounds, gridPoint, rotatedExtruderLoops, surroundingSlices ):
+ def isPointInsideLineSegments( self, alreadyFilledArounds, gridPoint, rotatedExtruderLoops, surroundingCarves ):
"Is the point inside the line segments of the loops."
if self.solidSurfaceThickness <= 0:
return True
lineSegments = getHorizontalSegmentsFromLoopLists( rotatedExtruderLoops, alreadyFilledArounds, gridPoint.imag )
- surroundingXIntersections = getSurroundingXIntersections( self.doubleSolidSurfaceThickness, surroundingSlices, gridPoint.imag )
+ surroundingXIntersections = getSurroundingXIntersections( self.doubleSolidSurfaceThickness, surroundingCarves, gridPoint.imag )
for lineSegment in lineSegments:
if isSegmentCompletelyInAnIntersection( lineSegment, surroundingXIntersections ):
xFirst = lineSegment[ 0 ].point.real
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fillet.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fillet.py
index b1953a02..2ff2868b 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fillet.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/fillet.py
@@ -63,7 +63,7 @@ The beveled file is saved as Screw Holder Bottom_fillet.gcode
>>> fillet.getArcPointGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -72,7 +72,7 @@ many lines of gcode
>>> fillet.getArcRadiusGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -81,7 +81,7 @@ many lines of gcode
>>> fillet.getArcSegmentGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -90,7 +90,7 @@ many lines of gcode
>>> fillet.getBevelGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -99,7 +99,7 @@ many lines of gcode
>>> fillet.getFilletGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -108,7 +108,7 @@ many lines of gcode
>>> fillet.getFilletChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -131,7 +131,7 @@ from skeinforge_tools.skeinforge_utilities import euclidean
from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import oozebane
from skeinforge_tools import polyfile
import cStringIO
@@ -145,69 +145,69 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def arcPointFile( filename = '' ):
- "Fillet a gcode linear move file into a helical point move file. If no filename is specified, arc point the first unmodified gcode file in this folder."
- if filename == '':
+def arcPointFile( fileName = '' ):
+ "Fillet a gcode linear move file into a helical point move file. If no fileName is specified, arc point the first unmodified gcode file in this folder."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
filletPreferences = FilletPreferences()
preferences.readPreferences( filletPreferences )
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being filleted into arc points.' )
- gcodeText = gcodec.getFileText( filename )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being filleted into arc points.' )
+ gcodeText = gcodec.getFileText( fileName )
if gcodeText == '':
return
- gcodec.writeFileMessageSuffix( filename, getArcPointGcode( filletPreferences, gcodeText ), 'The arc point file is saved as ', '_fillet' )
+ gcodec.writeFileMessageSuffix( fileName, getArcPointGcode( filletPreferences, gcodeText ), 'The arc point file is saved as ', '_fillet' )
-def arcRadiusFile( filename = '' ):
- "Fillet a gcode linear move file into a helical radius move file. If no filename is specified, arc radius the first unmodified gcode file in this folder."
- if filename == '':
+def arcRadiusFile( fileName = '' ):
+ "Fillet a gcode linear move file into a helical radius move file. If no fileName is specified, arc radius the first unmodified gcode file in this folder."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
filletPreferences = FilletPreferences()
preferences.readPreferences( filletPreferences )
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being filleted into arc radiuses.' )
- gcodeText = gcodec.getFileText( filename )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being filleted into arc radiuses.' )
+ gcodeText = gcodec.getFileText( fileName )
if gcodeText == '':
return
- gcodec.writeFileMessageSuffix( filename, getArcRadiusGcode( filletPreferences, gcodeText ), 'The arc radius file is saved as ', '_fillet' )
+ gcodec.writeFileMessageSuffix( fileName, getArcRadiusGcode( filletPreferences, gcodeText ), 'The arc radius file is saved as ', '_fillet' )
-def arcSegmentFile( filename = '' ):
- "Fillet a gcode linear move file into an arc segment linear move file. If no filename is specified, arc segment the first unmodified gcode file in this folder."
- if filename == '':
+def arcSegmentFile( fileName = '' ):
+ "Fillet a gcode linear move file into an arc segment linear move file. If no fileName is specified, arc segment the first unmodified gcode file in this folder."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
filletPreferences = FilletPreferences()
preferences.readPreferences( filletPreferences )
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being arc segmented.' )
- gcodeText = gcodec.getFileText( filename )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being arc segmented.' )
+ gcodeText = gcodec.getFileText( fileName )
if gcodeText == '':
return
- gcodec.writeFileMessageSuffix( filename, getArcSegmentGcode( filletPreferences, gcodeText ), 'The arc segment file is saved as ', '_fillet' )
+ gcodec.writeFileMessageSuffix( fileName, getArcSegmentGcode( filletPreferences, gcodeText ), 'The arc segment file is saved as ', '_fillet' )
-def bevelFile( filename = '' ):
- "Bevel a gcode linear move file. If no filename is specified, bevel the first unmodified gcode file in this folder."
- if filename == '':
+def bevelFile( fileName = '' ):
+ "Bevel a gcode linear move file. If no fileName is specified, bevel the first unmodified gcode file in this folder."
+ if fileName == '':
unmodified = gcodec.getUnmodifiedGCodeFiles()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
filletPreferences = FilletPreferences()
preferences.readPreferences( filletPreferences )
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being beveled.' )
- gcodeText = gcodec.getFileText( filename )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being beveled.' )
+ gcodeText = gcodec.getFileText( fileName )
if gcodeText == '':
return
- gcodec.writeFileMessageSuffix( filename, getBevelGcode( filletPreferences, gcodeText ), 'The beveled file is saved as ', '_fillet' )
+ gcodec.writeFileMessageSuffix( fileName, getBevelGcode( filletPreferences, gcodeText ), 'The beveled file is saved as ', '_fillet' )
def getArcPointGcode( filletPreferences, gcodeText ):
"Arc point a gcode linear move text into a helical point move gcode text."
@@ -233,11 +233,11 @@ def getBevelGcode( filletPreferences, gcodeText ):
skein.parseGcode( filletPreferences, gcodeText )
return skein.output.getvalue()
-def getFilletChainGcode( filename, gcodeText, filletPreferences = None ):
+def getFilletChainGcode( fileName, gcodeText, filletPreferences = None ):
"Fillet a gcode linear move text. Chain oozebane the gcode if it is not already oozebaned."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'oozebane' ):
- gcodeText = oozebane.getOozebaneChainGcode( filename, gcodeText )
+ gcodeText = oozebane.getOozebaneChainGcode( fileName, gcodeText )
return getFilletGcode( gcodeText, filletPreferences )
def getFilletGcode( gcodeText, filletPreferences = None ):
@@ -261,22 +261,22 @@ def getFilletGcode( gcodeText, filletPreferences = None ):
return getBevelGcode( filletPreferences, gcodeText )
return gcodeText
-def writeOutput( filename = '' ):
+def writeOutput( fileName = '' ):
"""Fillet a gcode linear move file. Chain fill the gcode if it is not already filled.
Depending on the preferences, either arcPoint, arcRadius, arcSegment, bevel or do nothing.
- If no filename is specified, fillet the first unmodified gcode file in this folder."""
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ If no fileName is specified, fillet the first unmodified gcode file in this folder."""
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
filletPreferences = FilletPreferences()
preferences.readPreferences( filletPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain filleted.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_fillet.gcode'
- filletGcode = getFilletChainGcode( filename, '', filletPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain filleted.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_fillet.gcode'
+ filletGcode = getFilletChainGcode( fileName, '', filletPreferences )
if filletGcode == '':
return
gcodec.writeFileText( suffixFilename, filletGcode )
@@ -543,7 +543,7 @@ class ArcRadiusSkein( ArcPointSkein ):
class FilletPreferences:
"A class to handle the fillet preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateFillet = preferences.BooleanPreference().getFromValue( 'Activate Fillet', True )
@@ -563,24 +563,24 @@ class FilletPreferences:
self.archive.append( self.cornerFeedrateOverOperatingFeedrate )
self.filletRadiusOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Fillet Radius over Extrusion Width (ratio):', 0.35 )
self.archive.append( self.filletRadiusOverExtrusionWidth )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Filleted', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Filleted', '' )
+ self.archive.append( self.fileNameInput )
self.reversalSlowdownDistanceOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Reversal Slowdown Distance over Extrusion Width (ratio):', 0.5 )
self.archive.append( self.reversalSlowdownDistanceOverExtrusionWidth )
self.useIntermediateFeedrateInCorners = preferences.BooleanPreference().getFromValue( 'Use Intermediate Feedrate in Corners', True )
self.archive.append( self.useIntermediateFeedrateInCorners )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Fillet'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'fillet.csv' )
- self.filenameHelp = 'skeinforge_tools.fillet.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'fillet.csv' )
+ self.fileNameHelp = 'skeinforge_tools.fillet.html'
self.saveTitle = 'Save Preferences'
self.title = 'Fillet Preferences'
def execute( self ):
"Fillet button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
def main():
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/hop.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/hop.py
index 666f36ca..e09f357f 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/hop.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/hop.py
@@ -4,8 +4,8 @@ Hop is a script to raise the extruder when it is not extruding.
The default 'Activate Hop' checkbox is off. It is off because Vik and Nophead found better results without hopping. When it
is on, the functions described below will work, when it is off, the functions will not be called.
-The important value for the hop preferences is "Hop Over Extrusion Height (ratio)" which is the ratio of the hop height over the
-extrusion height, the default is 1.0. The 'Minimum Hop Angle (degrees)' is the minimum angle that the path of the extruder
+The important value for the hop preferences is "Hop Over Layer Thickness (ratio)" which is the ratio of the hop height over the
+layer thickness, the default is 1.0. The 'Minimum Hop Angle (degrees)' is the minimum angle that the path of the extruder
will be raised. An angle of ninety means that the extruder will go straight up as soon as it is not extruding and a low angle
means the extruder path will gradually rise to the hop height, the default is 20 degrees.
@@ -40,7 +40,7 @@ The hopped file is saved as Screw Holder Bottom_hop.gcode
>>> hop.getHopGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -49,7 +49,7 @@ many lines of gcode
>>> hop.getHopChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -66,7 +66,7 @@ from skeinforge_tools.skeinforge_utilities import euclidean
from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
from skeinforge_tools import stretch
import cStringIO
@@ -80,11 +80,11 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getHopChainGcode( filename, gcodeText, hopPreferences = None ):
+def getHopChainGcode( fileName, gcodeText, hopPreferences = None ):
"Hop a gcode linear move text. Chain hop the gcode if it is not already hopped."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'stretch' ):
- gcodeText = stretch.getStretchChainGcode( filename, gcodeText )
+ gcodeText = stretch.getStretchChainGcode( fileName, gcodeText )
return getHopGcode( gcodeText, hopPreferences )
def getHopGcode( gcodeText, hopPreferences = None ):
@@ -102,20 +102,20 @@ def getHopGcode( gcodeText, hopPreferences = None ):
skein.parseGcode( gcodeText, hopPreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
- "Hop a gcode linear move file. Chain hop the gcode if it is not already hopped. If no filename is specified, hop the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Hop a gcode linear move file. Chain hop the gcode if it is not already hopped. If no fileName is specified, hop the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
hopPreferences = HopPreferences()
preferences.readPreferences( hopPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain hopped.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_hop.gcode'
- hopGcode = getHopChainGcode( filename, '', hopPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain hopped.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_hop.gcode'
+ hopGcode = getHopChainGcode( fileName, '', hopPreferences )
if hopGcode == '':
return
gcodec.writeFileText( suffixFilename, hopGcode )
@@ -127,29 +127,29 @@ def writeOutput( filename = '' ):
class HopPreferences:
"A class to handle the hop preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateHop = preferences.BooleanPreference().getFromValue( 'Activate Hop', False )
self.archive.append( self.activateHop )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Hopped', '' )
- self.archive.append( self.filenameInput )
- self.hopOverExtrusionHeight = preferences.FloatPreference().getFromValue( 'Hop Over Extrusion Height (ratio):', 1.0 )
- self.archive.append( self.hopOverExtrusionHeight )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Hopped', '' )
+ self.archive.append( self.fileNameInput )
+ self.hopOverLayerThickness = preferences.FloatPreference().getFromValue( 'Hop Over Layer Thickness (ratio):', 1.0 )
+ self.archive.append( self.hopOverLayerThickness )
self.minimumHopAngle = preferences.FloatPreference().getFromValue( 'Minimum Hop Angle (degrees):', 30.0 )
self.archive.append( self.minimumHopAngle )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Hop'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'hop.csv' )
- self.filenameHelp = 'skeinforge_tools.hop.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'hop.csv' )
+ self.fileNameHelp = 'skeinforge_tools.hop.html'
self.saveTitle = 'Save Preferences'
self.title = 'Hop Preferences'
def execute( self ):
"Hop button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class HopSkein:
@@ -247,10 +247,10 @@ class HopSkein:
firstWord = ''
if len( splitLine ) > 0:
firstWord = splitLine[ 0 ]
- if firstWord == '(<extrusionHeight>':
- extrusionHeight = float( splitLine[ 1 ] )
- self.hopHeight = hopPreferences.hopOverExtrusionHeight.value * extrusionHeight
- self.minimumDistance = 0.5 * extrusionHeight
+ if firstWord == '(<layerThickness>':
+ layerThickness = float( splitLine[ 1 ] )
+ self.hopHeight = hopPreferences.hopOverLayerThickness.value * layerThickness
+ self.minimumDistance = 0.5 * layerThickness
elif firstWord == '(<bridgeExtrusionWidthOverSolid>':
self.bridgeExtrusionWidthOverSolid = float( splitLine[ 1 ] )
elif firstWord == '(<decimalPlacesCarried>':
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/gts.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/gts.py
new file mode 100644
index 00000000..0cacbbf8
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/gts.py
@@ -0,0 +1,94 @@
+"""
+The gts.py script is an import translator plugin to get a carving from an gts file.
+
+An import plugin is a script in the import_plugins folder which has the function getCarving. It is meant to be run from the
+interpret tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin
+a lower case name.
+
+The getCarving function takes the file name of an gts file and returns the carving.
+
+The GNU Triangulated Surface (.gts) format is described at:
+http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE
+
+This example gets a carving for the gts file Screw Holder Bottom.gts. This example is run in a terminal in the folder which
+contains Screw Holder Bottom.gts and gts.py.
+
+
+> python
+Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
+[GCC 4.2.1 (SUSE Linux)] on linux2
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import gts
+>>> gts.getCarving()
+[11.6000003815, 10.6837882996, 7.80209827423
+..
+many more lines of the carving
+..
+
+"""
+
+
+from __future__ import absolute_import
+#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
+import __init__
+
+from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
+from skeinforge_tools.skeinforge_utilities import gcodec
+from skeinforge_tools.skeinforge_utilities import triangle_mesh
+
+__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
+__credits__ = 'Nophead <http://hydraraptor.blogspot.com/>\nArt of Illusion <http://www.artofillusion.org/>'
+__date__ = "$Date: 2008/21/04 $"
+__license__ = "GPL 3.0"
+
+
+def getFromGNUTriangulatedSurfaceText( gnuTriangulatedSurfaceText, triangleMesh ):
+ "Initialize from a GNU Triangulated Surface Text."
+ if gnuTriangulatedSurfaceText == '':
+ return None
+ lines = gcodec.getTextLines( gnuTriangulatedSurfaceText )
+ linesWithoutComments = []
+ for line in lines:
+ if len( line ) > 0:
+ firstCharacter = line[ 0 ]
+ if firstCharacter != '#' and firstCharacter != '!':
+ linesWithoutComments.append( line )
+ splitLine = linesWithoutComments[ 0 ].split()
+ numberOfVertices = int( splitLine[ 0 ] )
+ numberOfEdges = int( splitLine[ 1 ] )
+ numberOfFaces = int( splitLine[ 2 ] )
+ faceTriples = []
+ for vertexIndex in xrange( numberOfVertices ):
+ line = linesWithoutComments[ vertexIndex + 1 ]
+ splitLine = line.split()
+ vertex = Vector3( float( splitLine[ 0 ] ), float( splitLine[ 1 ] ), float( splitLine[ 2 ] ) )
+ triangleMesh.vertices.append( vertex )
+ edgeStart = numberOfVertices + 1
+ for edgeIndex in xrange( numberOfEdges ):
+ line = linesWithoutComments[ edgeIndex + edgeStart ]
+ splitLine = line.split()
+ vertexIndexes = []
+ for word in splitLine[ : 2 ]:
+ vertexIndexes.append( int( word ) - 1 )
+ edge = triangle_mesh.Edge().getFromVertexIndexes( edgeIndex, vertexIndexes )
+ triangleMesh.edges.append( edge )
+ faceStart = edgeStart + numberOfEdges
+ for faceIndex in xrange( numberOfFaces ):
+ line = linesWithoutComments[ faceIndex + faceStart ]
+ splitLine = line.split()
+ edgeIndexes = []
+ for word in splitLine[ : 3 ]:
+ edgeIndexes.append( int( word ) - 1 )
+ face = triangle_mesh.Face().getFromEdgeIndexes( edgeIndexes, triangleMesh.edges, faceIndex )
+ triangleMesh.faces.append( face )
+ return triangleMesh
+
+def getCarving( fileName = '' ):
+ "Get the triangle mesh for the gts file."
+ if fileName == '':
+ unmodified = gcodec.getFilesWithFileTypeWithoutWords( 'gts' )
+ if len( unmodified ) == 0:
+ print( "There is no gts file in this folder." )
+ return None
+ fileName = unmodified[ 0 ]
+ return getFromGNUTriangulatedSurfaceText( gcodec.getFileText( fileName ), triangle_mesh.TriangleMesh() )
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/slc.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/slc.py
new file mode 100644
index 00000000..3f1b13a0
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/slc.py
@@ -0,0 +1,200 @@
+"""
+The slc.py script is an import translator plugin to get a carving from an slc file.
+
+An import plugin is a script in the import_plugins folder which has the function getCarving. It is meant to be run from the
+interpret tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin
+a lower case name.
+
+The getCarving function takes the file name of an slc file and returns the carving.
+
+This example gets a triangle mesh for the slc file rotor.slc. This example is run in a terminal in the folder which contains
+rotor.slc and slc.py.
+
+
+> python
+Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
+[GCC 4.2.1 (SUSE Linux)] on linux2
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import slc
+>>> slc.getCarving()
+0.20000000298, 999999999.0, -999999999.0, [8.72782748851e-17, None
+..
+many more lines of the carving
+..
+
+
+An explanation of the SLC format can be found at:
+http://rapid.lpt.fi/archives/rp-ml-1999/0713.html
+
+"""
+
+
+from __future__ import absolute_import
+#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
+import __init__
+
+from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
+from skeinforge_tools.skeinforge_utilities import euclidean
+from skeinforge_tools.skeinforge_utilities import gcodec
+from struct import unpack
+import sys
+
+__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
+__credits__ = 'Nophead <http://hydraraptor.blogspot.com/>\nArt of Illusion <http://www.artofillusion.org/>'
+__date__ = "$Date: 2008/21/04 $"
+__license__ = "GPL 3.0"
+
+
+def getCarving( fileName = '' ):
+ "Get the triangle mesh for the slc file."
+ if fileName == '':
+ unmodified = gcodec.getFilesWithFileTypeWithoutWords( 'slc' )
+ if len( unmodified ) == 0:
+ print( "There is no slc file in this folder." )
+ return None
+ fileName = unmodified[ 0 ]
+ carving = SLCCarving()
+ carving.readFile( fileName )
+ return carving
+
+def getLittleEndianFloatGivenFile( file ):
+ "Get little endian float given a file."
+ return unpack( '<f', file.read( 4 ) )[ 0 ]
+
+def getLittleEndianUnsignedLongGivenFile( file ):
+ "Get little endian float given a file."
+ return unpack( '<L', file.read( 4 ) )[ 0 ]
+
+def getPointsFromFile( numPoints, file ):
+ "Process the vertice points for a given boundary."
+ points = []
+ for pointIndex in xrange( numPoints ):
+ x = getLittleEndianFloatGivenFile( file )
+ y = getLittleEndianFloatGivenFile( file )
+ points.append( complex( x, y ) )
+ return points
+
+def readHeader( file ):
+ "Read the slc header."
+ while ord( file.read( 1 ) ) != 0x1A:
+ pass
+
+
+class SampleTableEntry:
+ "Sample table entry."
+ def __init__( self, file ):
+ "Read in the sampling table section. It contains a table length (byte) and the table entries."
+ self.min_z_level = getLittleEndianFloatGivenFile( file )
+ self.layer_thickness = getLittleEndianFloatGivenFile( file )
+ self.beam_comp = getLittleEndianFloatGivenFile( file )
+ getLittleEndianFloatGivenFile( file )
+ print( self )
+
+ def __repr__( self ):
+ "Get the string representation of this sample table entry."
+ return '%s, %s, %s' % ( self.min_z_level, self.layer_thickness, self.beam_comp )
+
+
+class SLCCarving:
+ "An slc carving."
+ def __init__( self ):
+ "Add empty lists."
+ self.maximumZ = - 999999999.0
+ self.minimumZ = 999999999.0
+ self.layerThickness = None
+ self.rotatedBoundaryLayers = []
+
+ def __repr__( self ):
+ "Get the string representation of this carving."
+ return '%s, %s, %s, %s' % ( self.layerThickness, self.minimumZ, self.maximumZ, self.rotatedBoundaryLayers )
+
+ def getCarveCornerMaximum( self ):
+ "Get the corner maximum of the vertices."
+ return self.cornerMaximum
+
+ def getCarveCornerMinimum( self ):
+ "Get the corner minimum of the vertices."
+ return self.cornerMinimum
+
+ def getCarveLayerThickness( self ):
+ "Get the layer thickness."
+ return self.layerThickness
+
+ def getCarveRotatedBoundaryLayers( self ):
+ "Get the rotated boundary layers."
+ self.cornerMaximum = Vector3( - 999999999.0, - 999999999.0, self.maximumZ )
+ self.cornerMinimum = Vector3( 999999999.0, 999999999.0, self.minimumZ )
+ for rotatedBoundaryLayer in self.rotatedBoundaryLayers:
+ for loop in rotatedBoundaryLayer.loops:
+ for point in loop:
+ pointVector3 = Vector3( point.real, point.imag, rotatedBoundaryLayer.z )
+ self.cornerMaximum = euclidean.getPointMaximum( self.cornerMaximum, pointVector3 )
+ self.cornerMinimum = euclidean.getPointMinimum( self.cornerMinimum, pointVector3 )
+ halfLayerThickness = 0.5 * self.layerThickness
+ self.cornerMaximum.z += halfLayerThickness
+ self.cornerMinimum.z -= halfLayerThickness
+ return self.rotatedBoundaryLayers
+
+ def processContourLayers( self, file ):
+ "Process a contour layer at a time until the top of the part."
+ while True:
+ minLayer = getLittleEndianFloatGivenFile( file )
+ numContours = getLittleEndianUnsignedLongGivenFile( file )
+ if numContours == 0xFFFFFFFF:
+ return
+ rotatedBoundaryLayer = euclidean.RotatedLoopLayer( minLayer )
+ self.rotatedBoundaryLayers.append( rotatedBoundaryLayer )
+ for contourIndex in xrange( numContours ):
+ numPoints = getLittleEndianUnsignedLongGivenFile( file )
+ numGaps = getLittleEndianUnsignedLongGivenFile( file )
+ rotatedBoundaryLayer.loops.append( getPointsFromFile( numPoints, file ) )
+
+ def readFile( self, fileName ):
+ "Read SLC and store the layers."
+ pslcfile = open( fileName, 'rb' )
+ readHeader( pslcfile )
+ pslcfile.read( 256 ) #Go past the 256 byte 3D Reserved Section.
+ self.readTableEntry( pslcfile )
+ self.processContourLayers( pslcfile )
+ pslcfile.close()
+
+ def readTableEntry( self, file ):
+ "Read in the sampling table section. It contains a table length (byte) and the table entries."
+ tableEntrySize = ord( file.read( 1 ) )
+ if tableEntrySize == 0:
+ print( "Sampling table size is zero!" )
+ exit()
+# print( "Sampling table size: %s\n", tableEntrySize )
+# print( "Minimum z level, Layer thickness, Line width compensation, Reserved" )
+ for index in xrange( tableEntrySize ):
+ sampleTableEntry = SampleTableEntry( file )
+ self.layerThickness = sampleTableEntry.layer_thickness
+
+ def setCarveBridgeLayerThickness( self, bridgeLayerThickness ):
+ "Set the bridge layer thickness. If the infill is not in the direction of the bridge, the bridge layer thickness should be given as None or not set at all."
+ pass
+
+ def setCarveLayerThickness( self, layerThickness ):
+ "Set the layer thickness."
+ pass
+
+ def setCarveExtrusionWidth( self, extrusionWidth ):
+ "Set the extrusion width."
+ pass
+
+ def setCarveImportCoarseness( self, importCoarseness ):
+ "Set the import coarseness."
+ pass
+
+ def setCarveIsCorrectMesh( self, isCorrectMesh ):
+ "Set the is correct mesh flag."
+ pass
+
+
+def main( hashtable = None ):
+ "Display the inset dialog."
+ if len( sys.argv ) > 1:
+ getCarving( ' '.join( sys.argv[ 1 : ] ) )
+
+if __name__ == "__main__":
+ main()
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/stl.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/stl.py
index 8b4e8c0b..2f19c057 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/stl.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/stl.py
@@ -1,11 +1,11 @@
"""
-The stl.py script is an import translator plugin to get a triangle mesh from an stl file.
+The stl.py script is an import translator plugin to get a carving from an stl file.
-An import plugin is a script in the import_plugins folder which has the function getTriangleMesh. It is meant to be run from the
-import_translator tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin
+An import plugin is a script in the import_plugins folder which has the function getCarving. It is meant to be run from the
+interpret tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin
a lower case name.
-The getTriangleMesh function takes the filename of an stl file and returns the triangle mesh.
+The getCarving function takes the file name of an stl file and returns the carving.
STL is an inferior triangle surface format, described at:
http://en.wikipedia.org/wiki/STL_(file_format)
@@ -13,8 +13,8 @@ http://en.wikipedia.org/wiki/STL_(file_format)
A good triangle surface format is the GNU Triangulated Surface format which is described at:
http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE
-This example gets a triangle mesh for the stl file Screw Holder Bottom.stl. This example is run in a terminal in the folder which contains
-Screw Holder Bottom.stl and stl.py.
+This example gets a carving for the stl file Screw Holder Bottom.stl. This example is run in a terminal in the folder which
+contains Screw Holder Bottom.stl and stl.py.
> python
@@ -22,10 +22,10 @@ Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import stl
->>> stl.getTriangleMesh()
+>>> stl.getCarving()
[11.6000003815, 10.6837882996, 7.80209827423
..
-many more lines of the triangle mesh
+many more lines of the carving
..
"""
@@ -90,15 +90,15 @@ def getFloatGivenBinary( byteIndex, stlData ):
"Get vertex given stl vertex line."
return unpack( 'f', stlData[ byteIndex : byteIndex + 4 ] )[ 0 ]
-def getTriangleMesh( filename = '' ):
+def getCarving( fileName = '' ):
"Get the triangle mesh for the stl file."
- if filename == '':
+ if fileName == '':
unmodified = gcodec.getFilesWithFileTypeWithoutWords( 'stl' )
if len( unmodified ) == 0:
print( "There is no stl file in this folder." )
- return
- filename = unmodified[ 0 ]
- stlData = gcodec.getFileText( filename, 'rb' )
+ return None
+ fileName = unmodified[ 0 ]
+ stlData = gcodec.getFileText( fileName, 'rb' )
if stlData == '':
return None
triangleMesh = triangle_mesh.TriangleMesh()
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/svg.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/svg.py
new file mode 100644
index 00000000..8b05912d
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/import_plugins/svg.py
@@ -0,0 +1,199 @@
+"""
+The svg.py script is an import translator plugin to get a carving from an svg file.
+
+An import plugin is a script in the import_plugins folder which has the function getCarving. It is meant to be run from the
+interpret tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin
+a lower case name.
+
+The getCarving function takes the file name of an svg file and returns the carving.
+
+This example gets a carving for the svg file Screw Holder Bottom.svg. This example is run in a terminal in the folder which
+contains Screw Holder Bottom.svg and svg.py.
+
+
+> python
+Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
+[GCC 4.2.1 (SUSE Linux)] on linux2
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import svg
+>>> svg.getCarving()
+0.20000000298, 999999999.0, -999999999.0, [8.72782748851e-17, None
+..
+many more lines of the carving
+..
+"""
+
+
+from __future__ import absolute_import
+#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
+import __init__
+
+from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
+from skeinforge_tools.skeinforge_utilities import euclidean
+from skeinforge_tools.skeinforge_utilities import gcodec
+
+__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
+__credits__ = 'Nophead <http://hydraraptor.blogspot.com/>\nArt of Illusion <http://www.artofillusion.org/>'
+__date__ = "$Date: 2008/21/04 $"
+__license__ = "GPL 3.0"
+
+
+#later , make defaults for layerThickness, maxZ, minZ
+def addPathData( line, loops ):
+ "Add the data from the path line."
+ line = line.replace( '"', ' ' )
+ splitLine = line.split()
+ if splitLine[ 1 ] != 'transform=':
+ return
+ line = line.lower()
+ line = line.replace( 'm', ' ' )
+ line = line.replace( 'l', ' ' )
+ line = line.replace( '/>', ' ' )
+ splitLine = line.split()
+ if 'd=' not in splitLine:
+ return
+ splitLine = splitLine[ splitLine.index( 'd=' ) + 1 : ]
+ pathSequence = []
+ for word in splitLine:
+ if word == 'z':
+ loop = []
+ for pathSequenceIndex in xrange( 0, len( pathSequence ), 2 ):
+ coordinate = complex( pathSequence[ pathSequenceIndex ], pathSequence[ pathSequenceIndex + 1 ] )
+ loop.append( coordinate )
+ loops.append( loop )
+ pathSequence = []
+ else:
+ pathSequence.append( float( word ) )
+
+def addTextData( line, rotatedBoundaryLayers ):
+ "Add the data from the text line."
+ if line.find( 'layerThickness' ) != - 1:
+ return
+ line = line.replace( '>', ' ' )
+ line = line.replace( '<', ' ' )
+ line = line.replace( ',', ' ' )
+ splitLine = line.split()
+ if 'Layer' not in splitLine:
+ return
+ splitLine = splitLine[ splitLine.index( 'Layer' ) + 1 : ]
+ if 'z' not in splitLine:
+ return
+ zIndex = splitLine.index( 'z' )
+ rotatedBoundaryLayer = euclidean.RotatedLoopLayer( float( splitLine[ zIndex + 1 ] ) )
+ rotatedBoundaryLayers.append( rotatedBoundaryLayer )
+
+def getCarving( fileName = '' ):
+ "Get the triangle mesh for the gts file."
+ if fileName == '':
+ unmodified = gcodec.getFilesWithFileTypeWithoutWords( 'gts' )
+ if len( unmodified ) == 0:
+ print( "There is no gts file in this folder." )
+ return None
+ fileName = unmodified[ 0 ]
+ carving = SVGCarving()
+ carving.parseSVG( gcodec.getFileText( fileName ) )
+ return carving
+
+def getValueInQuotes( name, text, value ):
+ "Get value in quotes after the name."
+ nameAndQuote = name + '="'
+ nameIndexStart = text.find( nameAndQuote )
+ if nameIndexStart == - 1:
+ return value
+ valueStartIndex = nameIndexStart + len( nameAndQuote )
+ nameIndexEnd = text.find( '"', valueStartIndex )
+ if nameIndexEnd == - 1:
+ return value
+ return float( text[ valueStartIndex : nameIndexEnd ] )
+
+
+class SVGCarving:
+ "An svg carving."
+ def __init__( self ):
+ "Add empty lists."
+ self.maximumZ = - 999999999.0
+ self.minimumZ = 999999999.0
+ self.layerThickness = None
+ self.rotatedBoundaryLayers = []
+
+ def __repr__( self ):
+ "Get the string representation of this carving."
+ return str( self.rotatedBoundaryLayers )
+
+ def getCarveCornerMaximum( self ):
+ "Get the corner maximum of the vertices."
+ return self.cornerMaximum
+
+ def getCarveCornerMinimum( self ):
+ "Get the corner minimum of the vertices."
+ return self.cornerMinimum
+
+ def getCarveLayerThickness( self ):
+ "Get the layer thickness."
+ return self.layerThickness
+
+ def getCarveRotatedBoundaryLayers( self ):
+ "Get the rotated boundary layers."
+ self.cornerMaximum = Vector3( - 999999999.0, - 999999999.0, self.maximumZ )
+ self.cornerMinimum = Vector3( 999999999.0, 999999999.0, self.minimumZ )
+ for rotatedBoundaryLayer in self.rotatedBoundaryLayers:
+ for loop in rotatedBoundaryLayer.loops:
+ for point in loop:
+ pointVector3 = Vector3( point.real, point.imag, rotatedBoundaryLayer.z )
+ self.cornerMaximum = euclidean.getPointMaximum( self.cornerMaximum, pointVector3 )
+ self.cornerMinimum = euclidean.getPointMinimum( self.cornerMinimum, pointVector3 )
+ return self.rotatedBoundaryLayers
+
+ def parseSVG( self, svgText ):
+ "Parse SVG text and store the layers."
+ if svgText == '':
+ return None
+ svgText = svgText.replace( '\t', ' ' )
+ svgText = svgText.replace( ';', ' ' )
+ self.lines = gcodec.getTextLines( svgText )
+ self.parseInitialization()
+ for lineIndex in xrange( self.lineIndex, len( self.lines ) ):
+ self.parseLine( lineIndex )
+
+ def parseInitialization( self ):
+ "Parse gcode initialization and store the parameters."
+ for self.lineIndex in xrange( len( self.lines ) ):
+ line = self.lines[ self.lineIndex ].lstrip()
+ self.layerThickness = getValueInQuotes( 'layerThickness', line, self.layerThickness )
+ self.maximumZ = getValueInQuotes( 'maxZ', line, self.maximumZ )
+ self.minimumZ = getValueInQuotes( 'minZ', line, self.minimumZ )
+ if line.find( '</metadata>' ) != - 1:
+ return
+ self.lineIndex = 2
+
+ def parseLine( self, lineIndex ):
+ "Parse a gcode line and add it to the inset skein."
+ line = self.lines[ lineIndex ].lstrip()
+ splitLine = line.split()
+ if len( splitLine ) < 1:
+ return
+ firstWord = splitLine[ 0 ]
+ if firstWord == '<path':
+ addPathData( line, self.rotatedBoundaryLayers[ - 1 ].loops )
+ elif firstWord == '<text':
+ addTextData( line, self.rotatedBoundaryLayers )
+
+ def setCarveBridgeLayerThickness( self, bridgeLayerThickness ):
+ "Set the bridge layer thickness. If the infill is not in the direction of the bridge, the bridge layer thickness should be given as None or not set at all."
+ pass
+
+ def setCarveLayerThickness( self, layerThickness ):
+ "Set the layer thickness."
+ pass
+
+ def setCarveExtrusionWidth( self, extrusionWidth ):
+ "Set the extrusion width."
+ pass
+
+ def setCarveImportCoarseness( self, importCoarseness ):
+ "Set the import coarseness."
+ pass
+
+ def setCarveIsCorrectMesh( self, isCorrectMesh ):
+ "Set the is correct mesh flag."
+ pass
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/inset.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/inset.py
new file mode 100644
index 00000000..ebd320f8
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/inset.py
@@ -0,0 +1,601 @@
+#! /usr/bin/env python
+"""
+Inset is a script to inset the carves of a gcode file.
+
+Inset insets the svg slices into gcode extrusion layers. The 'Extrusion Perimeter Width over Thickness' ratio is the ratio of the
+extrusion perimeter width over the layer thickness. The higher the value the more the perimeter will be inset, the default is 1.8.
+
+The 'Infill Perimeter Overlap' ratio is the amount the infill overlaps the perimeter over the extrusion width. The higher the value the
+more the infill will overlap the perimeter, and the thicker join between the infill and the perimeter. If the value is too high, the join will
+be so thick that the nozzle will run plow through the join below making a mess, the default is 0.05. There are two choices for the
+infill perimeter overlap method of calculation. If the 'Calculate Overlap from Perimeter and Infill' option is chosen, the overlap will be
+calculated from the average of the perimeter width and the infill width, this is the default choice. If the 'Calculate Overlap from
+Perimeter Only' option is chosen, the overlap will be calculated from the perimeter width only.
+
+If the "Start at Home" preference is selected, the G28 gcode will be added at the beginning of the file.
+
+When inset is generating the code, if there is a file start.txt, it will add that to the very beginning of the gcode. After it has added some
+initialization code and just before it adds the extrusion gcode, it will add the file endofthebeginning.txt if it exists. At the very end, it will
+add the file end.txt if it exists. Carve does not care if the text file names are capitalized, but some file systems do not handle file name
+cases properly, so to be on the safe side you should give them lower case names. It will first look for the file in the same directory as
+inset, if it does not find it it will look in ~/.skeinforge/gcode_scripts.
+
+The following examples inset the files Screw Holder Bottom.gcode & Screw Holder Bottom.stl. The examples are run in a terminal in
+the folder which contains Screw Holder Bottom.stl and inset.py.
+
+
+> python inset.py
+This brings up the dialog, after clicking 'Inset', the following is printed:
+File Screw Holder Bottom.stl is being chain insetted.
+The insetted file is saved as Screw Holder Bottom_inset.gcode
+
+
+> python
+Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
+[GCC 4.2.1 (SUSE Linux)] on linux2
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import inset
+>>> inset.main()
+File Screw Holder Bottom.stl is being insetted.
+The insetted file is saved as Screw Holder Bottom_inset.gcode
+It took 3 seconds to inset the file.
+
+
+>>> inset.writeOutput()
+File Screw Holder Bottom.stl is being insetted.
+The insetted file is saved as Screw Holder Bottom_inset.gcode
+It took 3 seconds to inset the file.
+
+"""
+
+from __future__ import absolute_import
+try:
+ import psyco
+ psyco.full()
+except:
+ pass
+#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
+import __init__
+
+from skeinforge_tools.skeinforge_utilities import euclidean
+from skeinforge_tools.skeinforge_utilities import gcodec
+from skeinforge_tools.skeinforge_utilities import intercircle
+from skeinforge_tools.skeinforge_utilities import preferences
+from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
+from skeinforge_tools import analyze
+from skeinforge_tools.skeinforge_utilities import interpret
+from skeinforge_tools import polyfile
+from skeinforge_tools import carve
+import cStringIO
+import math
+import os
+import sys
+import time
+
+
+__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
+__date__ = "$Date: 2008/28/04 $"
+__license__ = "GPL 3.0"
+
+
+def addAlreadyFilledArounds( alreadyFilledArounds, loop, radius ):
+ "Add already filled loops around loop to alreadyFilledArounds."
+ alreadyFilledLoop = []
+ slightlyGreaterThanRadius = 1.01 * radius
+ muchGreaterThanRadius = 2.5 * radius
+ circleNodes = intercircle.getCircleNodesFromLoop( loop, slightlyGreaterThanRadius )
+ centers = intercircle.getCentersFromCircleNodes( circleNodes )
+ for center in centers:
+ alreadyFilledInset = intercircle.getSimplifiedInsetFromClockwiseLoop( center, radius )
+ if euclidean.getMaximumSpan( alreadyFilledInset ) > muchGreaterThanRadius or euclidean.isWiddershins( alreadyFilledInset ):
+ alreadyFilledLoop.append( alreadyFilledInset )
+ if len( alreadyFilledLoop ) > 0:
+ alreadyFilledArounds.append( alreadyFilledLoop )
+
+def addSegmentOutline( isThick, outlines, pointBegin, pointEnd, width ):
+ "Add a diamond or hexagonal outline for a line segment."
+ exclusionWidth = 0.6 * width
+ slope = 0.3
+ if isThick:
+ slope = 3.0
+ exclusionWidth = 0.8 * width
+ segment = pointEnd - pointBegin
+ segmentLength = abs( segment )
+ if segmentLength == 0.0:
+ return
+ normalizedSegment = segment / segmentLength
+ outline = []
+ segmentYMirror = complex( normalizedSegment.real, - normalizedSegment.imag )
+ pointBeginRotated = segmentYMirror * pointBegin
+ pointEndRotated = segmentYMirror * pointEnd
+ along = 0.01
+ alongLength = along * segmentLength
+ if alongLength > 0.1 * exclusionWidth:
+ along *= 0.1 * exclusionWidth / alongLength
+ alongEnd = 1.0 - along
+ remainingToHalf = 0.5 - along
+ alongToWidth = exclusionWidth / slope / segmentLength
+ pointBeginIntermediate = euclidean.getIntermediateLocation( along, pointBeginRotated, pointEndRotated )
+ pointEndIntermediate = euclidean.getIntermediateLocation( alongEnd, pointBeginRotated, pointEndRotated )
+ outline.append( pointBeginIntermediate )
+ verticalWidth = complex( 0.0, exclusionWidth )
+ if alongToWidth > 0.9 * remainingToHalf:
+ verticalWidth = complex( 0.0, slope * remainingToHalf )
+ middle = ( pointBeginIntermediate + pointEndIntermediate ) * 0.5
+ middleDown = middle - verticalWidth
+ middleUp = middle + verticalWidth
+ outline.append( middleUp )
+ outline.append( pointEndIntermediate )
+ outline.append( middleDown )
+ else:
+ alongOutsideBegin = along + alongToWidth
+ alongOutsideEnd = alongEnd - alongToWidth
+ outsideBeginCenter = euclidean.getIntermediateLocation( alongOutsideBegin, pointBeginRotated, pointEndRotated )
+ outsideBeginCenterDown = outsideBeginCenter - verticalWidth
+ outsideBeginCenterUp = outsideBeginCenter + verticalWidth
+ outsideEndCenter = euclidean.getIntermediateLocation( alongOutsideEnd, pointBeginRotated, pointEndRotated )
+ outsideEndCenterDown = outsideEndCenter - verticalWidth
+ outsideEndCenterUp = outsideEndCenter + verticalWidth
+ outline.append( outsideBeginCenterUp )
+ outline.append( outsideEndCenterUp )
+ outline.append( pointEndIntermediate )
+ outline.append( outsideEndCenterDown )
+ outline.append( outsideBeginCenterDown )
+ outlines.append( euclidean.getPointsRoundZAxis( normalizedSegment, outline ) )
+
+def getInsetChainGcode( fileName, gcodeText, insetPreferences = None ):
+ "Inset the carves of a gcode text. Chain inset the gcode if it is not already carved."
+ if gcodeText == '':
+ if fileName[ - len( '.svg' ) : ] == '.svg':
+ gcodeText = gcodec.getFileText( fileName )
+ if not gcodec.isProcedureDone( gcodeText, '"carve"' ): #"carve" is used instead of carve because quotes have to be used for strings in svg files
+ gcodeText = carve.getCarveGcode( fileName )
+ return getInsetGcode( gcodeText, insetPreferences )
+
+def getInsetGcode( gcodeText, insetPreferences = None ):
+ "Inset the carves of a gcode text."
+ if gcodeText == '':
+ return ''
+ if gcodec.isProcedureDone( gcodeText, 'inset' ):
+ return gcodeText
+ if insetPreferences == None:
+ insetPreferences = InsetPreferences()
+ preferences.readPreferences( insetPreferences )
+ skein = InsetSkein()
+ skein.parseGcode( insetPreferences, gcodeText )
+ return skein.output.getvalue()
+
+def getSegmentsFromPoints( aroundLists, loopLists, pointBegin, pointEnd ):
+ "Get endpoint segments from the beginning and end of a line segment."
+ normalizedSegment = pointEnd - pointBegin
+ normalizedSegmentLength = abs( normalizedSegment )
+ if normalizedSegmentLength == 0.0:
+ return
+ normalizedSegment /= normalizedSegmentLength
+ segmentYMirror = complex( normalizedSegment.real, - normalizedSegment.imag )
+ pointBeginRotated = segmentYMirror * pointBegin
+ pointEndRotated = segmentYMirror * pointEnd
+ rotatedLoopLists = []
+ for loopList in loopLists:
+ rotatedLoopList = []
+ rotatedLoopLists.append( rotatedLoopList )
+ for loop in loopList:
+ rotatedLoop = euclidean.getPointsRoundZAxis( segmentYMirror, loop )
+ rotatedLoopList.append( rotatedLoop )
+ xIntersectionIndexList = []
+ xIntersectionIndexList.append( euclidean.XIntersectionIndex( - 1, pointBeginRotated.real ) )
+ xIntersectionIndexList.append( euclidean.XIntersectionIndex( - 1, pointEndRotated.real ) )
+ euclidean.addXIntersectionIndexesFromLoopLists( rotatedLoopLists, xIntersectionIndexList, pointBeginRotated.imag )
+ segments = euclidean.getSegmentsFromXIntersectionIndexes( xIntersectionIndexList, pointBeginRotated.imag )
+ insideSegments = []
+ for segment in segments:
+ endpointBegin = segment[ 0 ]
+ endpointBegin.point = normalizedSegment * endpointBegin.point
+ endpointEnd = segment[ 1 ]
+ endpointEnd.point = normalizedSegment * endpointEnd.point
+ if len( aroundLists ) < 1:
+ insideSegments.append( segment )
+ elif isSegmentInsideAround( aroundLists, segment ):
+ insideSegments.append( segment )
+ return insideSegments
+
+def isCloseToLast( paths, point, radius ):
+ "Determine if the point is close to the last point of the last path."
+ if len( paths ) < 1:
+ return False
+ lastPath = paths[ - 1 ]
+ return abs( lastPath[ - 1 ] - point ) < radius
+
+def isIntersectingWithinList( loop, loopList ):
+ "Determine if the loop is intersecting or is within the loop list."
+ if euclidean.isLoopIntersectingLoops( loop, loopList ):
+ return True
+ totalNumberOfIntersections = 0
+ for otherLoop in loopList:
+ leftPoint = euclidean.getLeftPoint( otherLoop )
+ totalNumberOfIntersections += euclidean.getNumberOfIntersectionsToLeft( leftPoint, loop )
+ return totalNumberOfIntersections % 2 == 1
+
+def isIntersectingWithinLists( loop, loopLists ):
+ "Determine if the loop is intersecting or is within the loop lists."
+ for loopList in loopLists:
+ if isIntersectingWithinList( loop, loopList ):
+ return True
+ return False
+
+def isIntersectingItself( loop, width ):
+ "Determine if the loop is intersecting itself."
+ outlines = []
+ for pointIndex in xrange( len( loop ) ):
+ pointBegin = loop[ pointIndex ]
+ pointEnd = loop[ ( pointIndex + 1 ) % len( loop ) ]
+ if euclidean.isLineIntersectingLoops( outlines, pointBegin, pointEnd ):
+ return True
+ addSegmentOutline( False, outlines, pointBegin, pointEnd, width )
+ return False
+
+def isSegmentInsideAround( aroundLists, segment ):
+ "Determine if the segment is inside an around."
+ midpoint = 0.5 * ( segment[ 0 ].point + segment[ 1 ].point )
+ for aroundList in aroundLists:
+ for around in aroundList:
+ if euclidean.isPointInsideLoop( around, midpoint ):
+ return True
+ return False
+
+def writeOutput( fileName = '' ):
+ "Inset the carves of a gcode file. Chain carve the file if it is a GNU TriangulatedSurface file. If no fileName is specified, inset the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
+ if len( unmodified ) == 0:
+ print( "There are no unmodified gcode files in this folder." )
+ return
+ fileName = unmodified[ 0 ]
+ startTime = time.time()
+ insetPreferences = InsetPreferences()
+ preferences.readPreferences( insetPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain insetted.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_inset.gcode'
+ insetGcode = getInsetChainGcode( fileName, '', insetPreferences )
+ if insetGcode == '':
+ return
+ gcodec.writeFileText( suffixFilename, insetGcode )
+ print( 'The insetted file is saved as ' + suffixFilename )
+ analyze.writeOutput( suffixFilename, insetGcode )
+ print( 'It took ' + str( int( round( time.time() - startTime ) ) ) + ' seconds to inset the file.' )
+
+
+class InsetPreferences:
+ "A class to handle the inset preferences."
+ def __init__( self ):
+ "Set the default preferences, execute title & preferences fileName."
+ #Set the default preferences.
+ self.archive = []
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
+ self.extrusionPerimeterWidthOverThickness = preferences.FloatPreference().getFromValue( 'Extrusion Perimeter Width over Thickness (ratio):', 1.8 )
+ self.archive.append( self.extrusionPerimeterWidthOverThickness )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Insetted', '' )
+ self.archive.append( self.fileNameInput )
+ self.infillPerimeterOverlap = preferences.FloatPreference().getFromValue( 'Infill Perimeter Overlap (ratio):', 0.05 )
+ self.archive.append( self.infillPerimeterOverlap )
+ self.infillPerimeterOverlapMethodOfCalculationLabel = preferences.LabelDisplay().getFromName( 'Infill Perimeter Overlap Method of Calculation: ' )
+ self.archive.append( self.infillPerimeterOverlapMethodOfCalculationLabel )
+ infillRadio = []
+ self.perimeterInfillPreference = preferences.Radio().getFromRadio( 'Calculate Overlap from Perimeter and Infill', infillRadio, True )
+ self.archive.append( self.perimeterInfillPreference )
+ self.perimeterPreference = preferences.Radio().getFromRadio( 'Calculate Overlap from Perimeter Only', infillRadio, False )
+ self.archive.append( self.perimeterPreference )
+ self.startAtHome = preferences.BooleanPreference().getFromValue( 'Start at Home', True )
+ self.archive.append( self.startAtHome )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
+ self.executeTitle = 'Inset'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'inset.csv' )
+ self.fileNameHelp = 'skeinforge_tools.inset.html'
+ self.saveTitle = 'Save Preferences'
+ self.title = 'Inset Preferences'
+
+ def execute( self ):
+ "Inset button has been clicked."
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
+
+
+class InsetSkein:
+ "A class to inset a skein of extrusions."
+ def __init__( self ):
+ self.boundary = None
+ self.decimalPlacesCarried = 3
+ self.extruderActive = False
+ self.lineIndex = 0
+ self.oldLocation = None
+ self.oldOrderedLocation = Vector3()
+ self.output = cStringIO.StringIO()
+ self.rotatedBoundaryLayers = []
+ self.thread = None
+
+ def addFromFile( self, fileName ):
+ "Add lines of text from the fileName."
+ fileLines = gcodec.getTextLines( gcodec.getFileTextInFileDirectory( __file__, fileName ) )
+ for line in fileLines:
+ self.addLine( line )
+
+ def addFromUpperLowerFile( self, fileName ):
+ "Add lines of text from the fileName or the lowercase fileName, if there is no file by the original fileName in the directory."
+ directory = os.listdir( os.getcwd() )
+ if fileName in directory:
+ self.addFromFile( fileName )
+ return
+ lowerFilename = fileName.lower()
+ if lowerFilename in directory:
+ self.addFromFile( lowerFilename )
+ return
+ gcodeDirectoryPath = os.path.join( preferences.getPreferencesDirectoryPath(), 'gcode_scripts' )
+ try:
+ os.mkdir( gcodeDirectoryPath )
+ except OSError:
+ pass
+ directory = os.listdir( gcodeDirectoryPath )
+ if fileName in directory:
+ self.addFromFile( os.path.join( gcodeDirectoryPath, fileName ) )
+ return
+ if lowerFilename in directory:
+ self.addFromFile( os.path.join( gcodeDirectoryPath, fileName.lower() ) )
+
+ def addGcodeFromPerimeterPaths( self, isIntersectingSelf, loop, loopLists, radius, z ):
+ "Add the perimeter paths to the output."
+ segments = []
+ outlines = []
+ thickOutlines = []
+ allLoopLists = loopLists[ : ] + [ thickOutlines ]
+ for pointIndex in xrange( len( loop ) ):
+ pointBegin = loop[ pointIndex ]
+ pointEnd = loop[ ( pointIndex + 1 ) % len( loop ) ]
+ if isIntersectingSelf:
+ if euclidean.isLineIntersectingLoops( outlines, pointBegin, pointEnd ):
+ segments += getSegmentsFromPoints( loopLists, allLoopLists, pointBegin, pointEnd )
+ else:
+ segments += getSegmentsFromPoints( loopLists, loopLists, pointBegin, pointEnd )
+ addSegmentOutline( False, outlines, pointBegin, pointEnd, self.extrusionWidth )
+ addSegmentOutline( True, thickOutlines, pointBegin, pointEnd, self.extrusionWidth )
+ else:
+ segments += getSegmentsFromPoints( loopLists, loopLists, pointBegin, pointEnd )
+ perimeterPaths = []
+ path = []
+ muchSmallerThanRadius = 0.1 * radius
+ for segment in segments:
+ pointBegin = segment[ 0 ].point
+ if not isCloseToLast( perimeterPaths, pointBegin, muchSmallerThanRadius ):
+ path = [ pointBegin ]
+ perimeterPaths.append( path )
+ path.append( segment[ 1 ].point )
+ if len( perimeterPaths ) > 1:
+ firstPath = perimeterPaths[ 0 ]
+ lastPath = perimeterPaths[ - 1 ]
+ if abs( lastPath[ - 1 ] - firstPath[ 0 ] ) < 0.1 * muchSmallerThanRadius:
+ connectedBeginning = lastPath[ : - 1 ] + firstPath
+ perimeterPaths[ 0 ] = connectedBeginning
+ perimeterPaths.remove( lastPath )
+ for perimeterPath in perimeterPaths:
+ self.addGcodeFromThreadZ( perimeterPath, z )
+
+ def addGcodeFromRemainingLoop( self, loop, loopLists, radius, z ):
+ "Add the remainder of the loop which does not overlap the alreadyFilledArounds loops."
+ euclidean.addSurroundingLoopBeginning( loop, self, z )
+ isIntersectingSelf = isIntersectingItself( loop, self.extrusionWidth )
+ if isIntersectingWithinLists( loop, loopLists ) or isIntersectingSelf:
+ self.addGcodeFromPerimeterPaths( isIntersectingSelf, loop, loopLists, radius, z )
+ else:
+ self.addLine( '(<perimeter> )' ) # Indicate that a perimeter is beginning.
+ self.addGcodeFromThreadZ( loop + [ loop[ 0 ] ], z )
+ self.addLine( '(</surroundingLoop> )' )
+
+ def addGcodeFromThreadZ( self, thread, z ):
+ "Add a thread to the output."
+ if len( thread ) > 0:
+ self.addGcodeMovementZ( thread[ 0 ], z )
+ else:
+ print( "zero length vertex positions array which was skipped over, this should never happen" )
+ if len( thread ) < 2:
+ return
+ self.addLine( "M101" ) # Turn extruder on.
+ for point in thread[ 1 : ]:
+ self.addGcodeMovementZ( point, z )
+ self.addLine( "M103" ) # Turn extruder off.
+
+ def addGcodeMovementZ( self, point, z ):
+ "Add a movement to the output."
+ self.addLine( "G1 X%s Y%s Z%s" % ( self.getRounded( point.real ), self.getRounded( point.imag ), self.getRounded( z ) ) )
+
+ def addInitializationToOutput( self ):
+ "Add initialization gcode to the output."
+ self.addFromUpperLowerFile( 'Start.txt' ) # Add a start file if it exists.
+ self.addLine( '(<creator> skeinforge January 8, 2009 )' ) # GCode formatted comment
+ self.addLine( 'M110' ) # GCode for compatibility with Nophead's code.
+ self.addLine( '(<extruderInitialization> )' ) # GCode formatted comment
+ self.addLine( 'G21' ) # Set units to mm.
+ self.addLine( 'G90' ) # Set positioning to absolute.
+ if self.insetPreferences.startAtHome.value:
+ self.addLine( 'G28' ) # Start at home.
+ self.addLine( 'M103' ) # Turn extruder off.
+ self.addLine( 'M105' ) # Custom code for temperature reading.
+ self.addFromUpperLowerFile( 'EndOfTheBeginning.txt' ) # Add a second start file if it exists.
+ self.addLine( '(<decimalPlacesCarried> ' + str( self.decimalPlacesCarried ) + ' )' ) # Set decimal places carried.
+ self.addLine( '(<extrusionDiameter> ' + self.getRounded( self.extrusionDiameter ) + ' )' ) # Set extrusion diameter.
+ self.addLine( '(<layerThickness> ' + self.getRounded( self.layerThickness ) + ' )' ) # Set layer thickness.
+ self.addLine( '(<extrusionPerimeterWidth> ' + self.getRounded( self.extrusionPerimeterWidth ) + ' )' ) # Set extrusion perimeter width.
+ self.addLine( '(<extrusionWidth> ' + self.getRounded( self.extrusionWidth ) + ' )' ) # Set extrusion width.
+ self.addLine( '(<fillInset> ' + str( self.fillInset ) + ' )' ) # Set fill inset.
+ # Set bridge extrusion width over solid extrusion width.
+ self.addLine( '(<bridgeExtrusionWidthOverSolid> ' + euclidean.getRoundedToThreePlaces( self.bridgeExtrusionWidthOverSolid ) + ' )' )
+ self.addLine( '(<procedureDone> carve )' ) # The skein has been carved.
+ self.addLine( '(<procedureDone> inset )' ) # The skein has been carved.
+ self.addLine( '(</extruderInitialization> )' ) # Initialization is finished, extrusion is starting.
+ self.addLine( '(<extrusionStart> )' ) # Initialization is finished, extrusion is starting.
+ circleArea = self.extrusionDiameter * self.extrusionDiameter * math.pi / 4.0
+ print( 'The extrusion fill density ratio is ' + euclidean.getRoundedToThreePlaces( circleArea / self.extrusionWidth / self.layerThickness ) )
+
+ def addInset( self, layerIndex ):
+ "Add fill to the carve layer."
+ alreadyFilledArounds = []
+ halfWidth = self.halfExtrusionPerimeterWidth
+ rotatedBoundaryLayer = self.rotatedBoundaryLayers[ layerIndex ]
+ self.addLine( '(<layerStart> %s )' % rotatedBoundaryLayer.z ) # Indicate that a new layer is starting.
+ if rotatedBoundaryLayer.rotation != None:
+ halfWidth *= self.bridgeExtrusionWidthOverSolid
+ self.addLine( '(<bridgeDirection> ' + str( rotatedBoundaryLayer.rotation ) + ' )' ) # Indicate the bridge direction.
+ for loop in rotatedBoundaryLayer.loops:
+ extrudateLoops = self.getExtrudateLoops( halfWidth, loop )
+ for extrudateLoop in extrudateLoops:
+ self.addGcodeFromRemainingLoop( extrudateLoop, alreadyFilledArounds, halfWidth, rotatedBoundaryLayer.z )
+ addAlreadyFilledArounds( alreadyFilledArounds, extrudateLoop, self.fillInset )
+
+ def addLine( self, line ):
+ "Add a line of text and a newline to the output."
+ if len( line ) > 0:
+ self.output.write( line + "\n" )
+
+ def addPathData( self, line ):
+ "Add the data from the path line."
+ line = line.replace( '"', ' ' )
+ splitLine = line.split()
+ if splitLine[ 1 ] != 'transform=':
+ return
+ line = line.lower()
+ line = line.replace( 'm', ' ' )
+ line = line.replace( 'l', ' ' )
+ line = line.replace( '/>', ' ' )
+ splitLine = line.split()
+ if 'd=' not in splitLine:
+ return
+ splitLine = splitLine[ splitLine.index( 'd=' ) + 1 : ]
+ pathSequence = []
+ for word in splitLine:
+ if word == 'z':
+ loop = []
+ for pathSequenceIndex in xrange( 0, len( pathSequence ), 2 ):
+ coordinate = complex( pathSequence[ pathSequenceIndex ], pathSequence[ pathSequenceIndex + 1 ] )
+ loop.append( coordinate )
+ self.rotatedBoundaryLayer.loops.append( loop )
+ pathSequence = []
+ else:
+ pathSequence.append( float( word ) )
+
+ def addRotatedLoopLayer( self, z ):
+ "Add rotated loop layer."
+ self.rotatedBoundaryLayer = euclidean.RotatedLoopLayer( z )
+ self.rotatedBoundaryLayers.append( self.rotatedBoundaryLayer )
+
+ def addShutdownToOutput( self ):
+ "Add shutdown gcode to the output."
+ self.addLine( '(</extrusionStart> )' ) # GCode formatted comment
+ self.addLine( 'M103' ) # Turn extruder motor off.
+ self.addLine( 'M104 S0' ) # Turn extruder heater off.
+ self.addFromUpperLowerFile( 'End.txt' ) # Add an end file if it exists.
+
+ def addTextData( self, line ):
+ "Add the data from the text line."
+ if line.find( 'layerThickness' ) != - 1:
+ return
+ line = line.replace( '>', ' ' )
+ line = line.replace( '<', ' ' )
+ line = line.replace( ',', ' ' )
+ splitLine = line.split()
+ if 'Layer' not in splitLine:
+ return
+ splitLine = splitLine[ splitLine.index( 'Layer' ) + 1 : ]
+ if 'z' not in splitLine:
+ return
+ zIndex = splitLine.index( 'z' )
+ self.addRotatedLoopLayer( float( splitLine[ zIndex + 1 ] ) )
+
+ def getExtrudateLoops( self, halfWidth, loop ):
+ "Get the inset extrudate loops from the loop."
+ slightlyGreaterThanHalfWidth = 1.1 * halfWidth
+ muchGreaterThanHalfWIdth = 2.5 * halfWidth
+ extrudateLoops = []
+ circleNodes = intercircle.getCircleNodesFromLoop( loop, slightlyGreaterThanHalfWidth )
+ centers = intercircle.getCentersFromCircleNodes( circleNodes )
+ for center in centers:
+ extrudateLoop = intercircle.getSimplifiedInsetFromClockwiseLoop( center, halfWidth )
+ if euclidean.isLargeSameDirection( extrudateLoop, center, muchGreaterThanHalfWIdth ):
+ if euclidean.isPathInsideLoop( loop, extrudateLoop ) == euclidean.isWiddershins( loop ):
+ extrudateLoop.reverse()
+ extrudateLoops.append( extrudateLoop )
+ return extrudateLoops
+
+ def getRounded( self, number ):
+ "Get number rounded to the number of carried decimal places as a string."
+ return euclidean.getRoundedToDecimalPlaces( self.decimalPlacesCarried, number )
+
+ def parseGcode( self, insetPreferences, gcodeText ):
+ "Parse gcode text and store the bevel gcode."
+ self.insetPreferences = insetPreferences
+ gcodeText = gcodeText.replace( '\t', ' ' )
+ gcodeText = gcodeText.replace( ';', ' ' )
+ self.lines = gcodec.getTextLines( gcodeText )
+ self.parseInitialization()
+ self.addInitializationToOutput()
+ for lineIndex in xrange( self.lineIndex, len( self.lines ) ):
+ self.parseLine( lineIndex )
+ for layerIndex in xrange( len( self.rotatedBoundaryLayers ) ):
+ self.addInset( layerIndex )
+ self.addShutdownToOutput()
+
+ def parseInitialization( self ):
+ "Parse gcode initialization and store the parameters."
+ for self.lineIndex in xrange( len( self.lines ) ):
+ line = self.lines[ self.lineIndex ].lstrip()
+ splitLine = gcodec.getWithoutBracketsEqualTab( line ).split()
+ firstWord = gcodec.getFirstWord( splitLine )
+ if firstWord == 'bridgeExtrusionWidthOverSolid':
+ self.bridgeExtrusionWidthOverSolid = float( splitLine[ 1 ] )
+ elif firstWord == 'decimalPlacesCarried':
+ self.decimalPlacesCarried = int( splitLine[ 1 ] )
+ elif firstWord == 'extrusionDiameter':
+ self.extrusionDiameter = float( splitLine[ 1 ] )
+ elif firstWord == 'layerThickness':
+ self.layerThickness = float( splitLine[ 1 ] )
+ self.extrusionPerimeterWidth = self.insetPreferences.extrusionPerimeterWidthOverThickness.value * self.layerThickness
+ self.halfExtrusionPerimeterWidth = 0.5 * self.extrusionPerimeterWidth
+ elif firstWord == 'extrusionWidth':
+ self.extrusionWidth = float( splitLine[ 1 ] )
+ self.fillInset = self.extrusionPerimeterWidth - self.extrusionPerimeterWidth * self.insetPreferences.infillPerimeterOverlap.value
+ if self.insetPreferences.perimeterInfillPreference.value:
+ self.fillInset = self.halfExtrusionPerimeterWidth + 0.5 * self.extrusionWidth - self.extrusionWidth * self.insetPreferences.infillPerimeterOverlap.value
+ elif firstWord == 'extrusionStart':
+ return
+
+ def parseLine( self, lineIndex ):
+ "Parse a gcode line and add it to the inset skein."
+ line = self.lines[ lineIndex ].lstrip()
+ splitLine = line.split()
+ if len( splitLine ) < 1:
+ return
+ firstWord = splitLine[ 0 ]
+ if firstWord == '(<boundaryPoint>':
+ location = gcodec.getLocationFromSplitLine( None, splitLine )
+ self.boundary.append( location.dropAxis( 2 ) )
+ elif ( firstWord == '(<bridgeDirection>' or firstWord == '//bridgeDirection' ):
+ secondWordWithoutBrackets = splitLine[ 1 ].replace( '(', '' ).replace( ')', '' )
+ self.rotatedBoundaryLayer.rotation = complex( secondWordWithoutBrackets )
+ elif firstWord == '(<layerStart>':
+ self.addRotatedLoopLayer( float( splitLine[ 1 ] ) )
+ elif firstWord == '<path':
+ self.addPathData( line )
+ elif firstWord == '(<surroundingLoop>':
+ self.boundary = []
+ self.rotatedBoundaryLayer.loops.append( self.boundary )
+ elif firstWord == '<text':
+ self.addTextData( line )
+
+
+def main( hashtable = None ):
+ "Display the inset dialog."
+ if len( sys.argv ) > 1:
+ writeOutput( ' '.join( sys.argv[ 1 : ] ) )
+ else:
+ preferences.displayDialog( InsetPreferences() )
+
+if __name__ == "__main__":
+ main()
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/material.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/material.py
index 7d8217bf..b34f2323 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/material.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/material.py
@@ -44,17 +44,17 @@ def getSelectedMaterial():
class MaterialPreferences:
"A class to handle the material preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.materialList = preferences.ListPreference().getFromValue( 'Material List:', [ 'ABS', 'HDPE', 'PCL', 'PLA' ] )
self.materialListbox = preferences.ListboxPreference().getFromListPreference( self.materialList, 'Material Selection:', 'ABS' )
self.addListboxSelection = preferences.AddListboxSelection().getFromListboxPreference( self.materialListbox )
self.deleteListboxSelection = preferences.DeleteListboxSelection().getFromListboxPreference( self.materialListbox )
- #Create the archive, title of the dialog & preferences filename.
+ #Create the archive, title of the dialog & preferences fileName.
self.archive = [ self.materialList, self.materialListbox, self.addListboxSelection, self.deleteListboxSelection ]
self.executeTitle = None
- self.filenameHelp = 'skeinforge_tools.material.html'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'material.csv' )
+ self.fileNameHelp = 'skeinforge_tools.material.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'material.csv' )
self.saveTitle = 'Save Preferences'
self.title = 'Material Preferences'
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/multiply.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/multiply.py
index 07c07424..5f494af0 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/multiply.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/multiply.py
@@ -39,7 +39,7 @@ The multiplied file is saved as Screw Holder Bottom_multiply.gcode
>>> multiply.getMultiplyGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -48,7 +48,7 @@ many lines of gcode
>>> multiply.getMultiplyChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -68,7 +68,7 @@ from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
from skeinforge_tools import fill
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import material
from skeinforge_tools import polyfile
import cStringIO
@@ -82,11 +82,11 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getMultiplyChainGcode( filename, gcodeText, multiplyPreferences = None ):
+def getMultiplyChainGcode( fileName, gcodeText, multiplyPreferences = None ):
"Multiply a gcode linear move text. Chain multiply the gcode if it is not already multiplied."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'fill' ):
- gcodeText = fill.getFillChainGcode( filename, gcodeText )
+ gcodeText = fill.getFillChainGcode( fileName, gcodeText )
return getMultiplyGcode( gcodeText, multiplyPreferences )
def getMultiplyGcode( gcodeText, multiplyPreferences = None ):
@@ -104,21 +104,21 @@ def getMultiplyGcode( gcodeText, multiplyPreferences = None ):
skein.parseGcode( gcodeText, multiplyPreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
+def writeOutput( fileName = '' ):
"""Multiply a gcode linear move file. Chain multiply the gcode if it is not already multiplied.
- If no filename is specified, multiply the first unmodified gcode file in this folder."""
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ If no fileName is specified, multiply the first unmodified gcode file in this folder."""
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
multiplyPreferences = MultiplyPreferences()
preferences.readPreferences( multiplyPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain multiplied.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_multiply.gcode'
- multiplyGcode = getMultiplyChainGcode( filename, '', multiplyPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain multiplied.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_multiply.gcode'
+ multiplyGcode = getMultiplyChainGcode( fileName, '', multiplyPreferences )
if multiplyGcode == '':
return
gcodec.writeFileText( suffixFilename, multiplyGcode )
@@ -130,35 +130,35 @@ def writeOutput( filename = '' ):
class MultiplyPreferences:
"A class to handle the multiply preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
- self.activateMultiply = preferences.BooleanPreference().getFromValue( 'Activate Multiply:', True )
+ self.activateMultiply = preferences.BooleanPreference().getFromValue( 'Activate Multiply:', False )
self.archive.append( self.activateMultiply )
self.centerX = preferences.FloatPreference().getFromValue( 'Center X (millimeters):', 0.0 )
self.archive.append( self.centerX )
self.centerY = preferences.FloatPreference().getFromValue( 'Center Y (millimeters):', 0.0 )
self.archive.append( self.centerY )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Multiplied', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Multiplied', '' )
+ self.archive.append( self.fileNameInput )
self.numberOfColumns = preferences.IntPreference().getFromValue( 'Number of Columns (integer):', 1 )
self.archive.append( self.numberOfColumns )
self.numberOfRows = preferences.IntPreference().getFromValue( 'Number of Rows (integer):', 1 )
self.archive.append( self.numberOfRows )
self.separationOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Separation over Extrusion Width (ratio):', 15.0 )
self.archive.append( self.separationOverExtrusionWidth )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Multiply'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'multiply.csv' )
- self.filenameHelp = 'skeinforge_tools.multiply.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'multiply.csv' )
+ self.fileNameHelp = 'skeinforge_tools.multiply.html'
self.saveTitle = 'Save Preferences'
self.title = 'Multiply Preferences'
def execute( self ):
"Multiply button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class MultiplySkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/oozebane.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/oozebane.py
index f1005dee..2ffffbcd 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/oozebane.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/oozebane.py
@@ -14,8 +14,11 @@ the feedrate will be decreased and the larger the size of the resulting gcode fi
Oozebane also turns the extruder on just before the start of a thread. The "Early Startup Maximum Distance Over Extrusion Width"
preference is the ratio of the maximum distance before the thread starts that the extruder will be turned off over the extrusion width,
-the default is 2.0. The longer the extruder has been off, the sooner the extruder will turn back on, the ratio is one minus one over e
-to the power of the distance the extruder has been off over the "Early Startup Distance Constant Over Extrusion Width".
+the default is 2.0. The longer the extruder has been off, the earlier the extruder will turn back on, the ratio is one minus one over e
+to the power of the distance the extruder has been off over the "Early Startup Distance Constant Over Extrusion Width". The 'First
+Early Startup Distance over Extrusion Width' preference is the ratio of the distance before the first thread starts that the extruder
+will be turned off over the extrusion width. This value should be high because, according to Marius, the extruder takes a second or
+two to extrude when starting for the first time, the default is forty.
The "Minimum Distance for Early Startup over Extrusion Width" ratio is the minimum distance that the extruder has to be off before
the thread begins over the extrusion width for the early start up feature to activate. The "Minimum Distance for Early Shutdown
@@ -31,7 +34,7 @@ To run oozebane, in a shell which oozebane is in type:
The following examples oozebane the files Screw Holder Bottom.gcode & Screw Holder Bottom.stl. The examples are run in a terminal in the
folder which contains Screw Holder Bottom.gcode, Screw Holder Bottom.stl and oozebane.py. The oozebane function will oozebane if the
'Activate Oozebane' checkbox is on. The functions writeOutput and getOozebaneChainGcode check to see if the text has been
-oozebaned, if not they call the getNozzleWipeChainGcode in nozzle_wipe.py to nozzle wipe the text; once they have the nozzle
+oozebaned, if not they call the getWipeChainGcode in wipe.py to nozzle wipe the text; once they have the nozzle
wiped text, then they oozebane.
@@ -61,7 +64,7 @@ The oozebaned file is saved as Screw Holder Bottom_oozebane.gcode
>>> oozebane.getOozebaneGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -70,7 +73,7 @@ many lines of gcode
>>> oozebane.getOozebaneChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -87,8 +90,8 @@ from skeinforge_tools.skeinforge_utilities import euclidean
from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
-from skeinforge_tools import nozzle_wipe
+from skeinforge_tools.skeinforge_utilities import interpret
+from skeinforge_tools import wipe
from skeinforge_tools import polyfile
import cStringIO
import math
@@ -101,11 +104,11 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getOozebaneChainGcode( filename, gcodeText, oozebanePreferences = None ):
+def getOozebaneChainGcode( fileName, gcodeText, oozebanePreferences = None ):
"Oozebane a gcode linear move text. Chain oozebane the gcode if it is not already oozebaned."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
- if not gcodec.isProcedureDone( gcodeText, 'nozzle_wipe' ):
- gcodeText = nozzle_wipe.getNozzleWipeChainGcode( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
+ if not gcodec.isProcedureDone( gcodeText, 'wipe' ):
+ gcodeText = wipe.getWipeChainGcode( fileName, gcodeText )
return getOozebaneGcode( gcodeText, oozebanePreferences )
def getOozebaneGcode( gcodeText, oozebanePreferences = None ):
@@ -123,20 +126,20 @@ def getOozebaneGcode( gcodeText, oozebanePreferences = None ):
skein.parseGcode( gcodeText, oozebanePreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
- "Oozebane a gcode linear move file. Chain oozebane the gcode if it is not already oozebaned. If no filename is specified, oozebane the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Oozebane a gcode linear move file. Chain oozebane the gcode if it is not already oozebaned. If no fileName is specified, oozebane the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
oozebanePreferences = OozebanePreferences()
preferences.readPreferences( oozebanePreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain oozebaned.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_oozebane.gcode'
- oozebaneGcode = getOozebaneChainGcode( filename, '', oozebanePreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain oozebaned.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_oozebane.gcode'
+ oozebaneGcode = getOozebaneChainGcode( fileName, '', oozebanePreferences )
if oozebaneGcode == '':
return
gcodec.writeFileText( suffixFilename, oozebaneGcode )
@@ -148,7 +151,7 @@ def writeOutput( filename = '' ):
class OozebanePreferences:
"A class to handle the oozebane preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateOozebane = preferences.BooleanPreference().getFromValue( 'Activate Oozebane', False )
@@ -159,8 +162,10 @@ class OozebanePreferences:
self.archive.append( self.earlyStartupDistanceConstantOverExtrusionWidth )
self.earlyStartupMaximumDistanceOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Early Startup Maximum Distance over Extrusion Width (ratio):', 2.0 )
self.archive.append( self.earlyStartupMaximumDistanceOverExtrusionWidth )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Oozebaned', '' )
- self.archive.append( self.filenameInput )
+ self.firstEarlyStartupDistanceOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'First Early Startup Distance over Extrusion Width (ratio):', 40.0 )
+ self.archive.append( self.firstEarlyStartupDistanceOverExtrusionWidth )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Oozebaned', '' )
+ self.archive.append( self.fileNameInput )
self.minimumDistanceForEarlyStartupOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Minimum Distance for Early Startup over Extrusion Width (ratio):', 10.0 )
self.archive.append( self.minimumDistanceForEarlyStartupOverExtrusionWidth )
self.minimumDistanceForEarlyShutdownOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Minimum Distance for Early Shutdown over Extrusion Width (ratio):', 10.0 )
@@ -169,18 +174,18 @@ class OozebanePreferences:
self.archive.append( self.slowdownStartupSteps )
self.shutdownDistanceOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Shutdown Distance over Extrusion Width (ratio):', 2.0 )
self.archive.append( self.shutdownDistanceOverExtrusionWidth )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Oozebane'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'oozebane.csv' )
- self.filenameHelp = 'skeinforge_tools.oozebane.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'oozebane.csv' )
+ self.fileNameHelp = 'skeinforge_tools.oozebane.html'
self.saveTitle = 'Save Preferences'
self.title = 'Oozebane Preferences'
def execute( self ):
"Oozebane button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class OozebaneSkein:
@@ -189,9 +194,10 @@ class OozebaneSkein:
self.decimalPlacesCarried = 3
self.distanceFromThreadEndToThreadBeginning = None
self.earlyStartupDistance = None
- self.extruderInactiveLongEnough= False
+ self.extruderInactiveLongEnough = True
self.feedrateMinute = 961.0
self.isExtruderActive = False
+ self.isFirstExtrusion = True
self.isShutdownEarly = False
self.isShutdownNeeded = False
self.isStartupEarly = False
@@ -257,9 +263,9 @@ class OozebaneSkein:
def getAddBeforeStartupLines( self, line ):
"Get and / or add before the startup lines."
distanceThreadBeginning = self.getDistanceToThreadBeginning()
- splitLine = line.split()
if distanceThreadBeginning == None:
return line
+ splitLine = line.split()
self.extruderInactiveLongEnough = False
self.isStartupEarly = True
location = gcodec.getLocationFromSplitLine( self.oldLocation, splitLine )
@@ -577,8 +583,12 @@ class OozebaneSkein:
self.distanceFromThreadEndToThreadBeginning += location.distance( lastThreadLocation )
lastThreadLocation = location
elif firstWord == 'M101':
- distanceConstants = self.distanceFromThreadEndToThreadBeginning / self.earlyStartupDistanceConstant
- self.earlyStartupDistance = self.getActiveFeedrateRatio() * self.earlyStartupMaximumDistance * ( 1.0 - math.exp( - distanceConstants ) )
+ distanceConstantRatio = self.distanceFromThreadEndToThreadBeginning / self.earlyStartupDistanceConstant
+ earlyStartupOperatingDistance = self.earlyStartupMaximumDistance * ( 1.0 - math.exp( - distanceConstantRatio ) )
+ if self.isFirstExtrusion:
+ earlyStartupOperatingDistance = self.oozebanePreferences.firstEarlyStartupDistanceOverExtrusionWidth.value * self.extrusionWidth
+ self.isFirstExtrusion = False
+ self.earlyStartupDistance = earlyStartupOperatingDistance * self.getActiveFeedrateRatio()
return
def setExtrusionWidth( self, oozebanePreferences ):
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/polyfile.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/polyfile.py
index a5d01a75..84db0279 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/polyfile.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/polyfile.py
@@ -38,29 +38,29 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getFileOrGcodeDirectory( filename, wasCancelled, words = [] ):
+def getFileOrGcodeDirectory( fileName, wasCancelled, words = [] ):
"Get the gcode files in the directory the file is in if directory preference is true. Otherwise, return the file in a list."
- if isEmptyOrCancelled( filename, wasCancelled ):
+ if isEmptyOrCancelled( fileName, wasCancelled ):
return []
if isDirectoryPreference():
- return gcodec.getFilesWithFileTypeWithoutWords( 'gcode', words, filename )
- return [ filename ]
+ return gcodec.getFilesWithFileTypeWithoutWords( 'gcode', words, fileName )
+ return [ fileName ]
-def getFileOrDirectoryTypes( filename, fileTypes, wasCancelled ):
+def getFileOrDirectoryTypes( fileName, fileTypes, wasCancelled ):
"Get the gcode files in the directory the file is in if directory preference is true. Otherwise, return the file in a list."
- if isEmptyOrCancelled( filename, wasCancelled ):
+ if isEmptyOrCancelled( fileName, wasCancelled ):
return []
if isDirectoryPreference():
- return gcodec.getFilesWithFileTypesWithoutWords( fileTypes, [], filename )
- return [ filename ]
+ return gcodec.getFilesWithFileTypesWithoutWords( fileTypes, [], fileName )
+ return [ fileName ]
-def getFileOrDirectoryTypesUnmodifiedGcode( filename, fileTypes, wasCancelled ):
+def getFileOrDirectoryTypesUnmodifiedGcode( fileName, fileTypes, wasCancelled ):
"Get the gcode files in the directory the file is in if directory preference is true. Otherwise, return the file in a list."
- if isEmptyOrCancelled( filename, wasCancelled ):
+ if isEmptyOrCancelled( fileName, wasCancelled ):
return []
if isDirectoryPreference():
- return gcodec.getFilesWithFileTypesWithoutWords( fileTypes, [], filename ) + gcodec.getUnmodifiedGCodeFiles( filename )
- return [ filename ]
+ return gcodec.getFilesWithFileTypesWithoutWords( fileTypes, [], fileName ) + gcodec.getUnmodifiedGCodeFiles( fileName )
+ return [ fileName ]
def isDirectoryPreference():
"Determine if the directory preference is true."
@@ -72,15 +72,15 @@ def isDirectoryPreference():
# print( '"Execute File" is selected, so only the opened file will be executed. To execute all the unmodified files in the directory, change the preference in polyfile.' )
return polyfilePreferences.directoryPreference.value
-def isEmptyOrCancelled( filename, wasCancelled ):
- "Determine if the filename is empty or the dialog was cancelled."
- return str( filename ) == '' or str( filename ) == '()' or wasCancelled
+def isEmptyOrCancelled( fileName, wasCancelled ):
+ "Determine if the fileName is empty or the dialog was cancelled."
+ return str( fileName ) == '' or str( fileName ) == '()' or wasCancelled
class PolyfilePreferences:
"A class to handle the polyfile preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.directoryOrFileChoiceLabel = preferences.LabelDisplay().getFromName( 'Directory or File Choice: ' )
@@ -90,10 +90,10 @@ class PolyfilePreferences:
self.archive.append( self.directoryPreference )
self.filePreference = preferences.Radio().getFromRadio( 'Execute File', directoryRadio, True )
self.archive.append( self.filePreference )
- #Create the archive, title of the dialog & preferences filename.
+ #Create the archive, title of the dialog & preferences fileName.
self.executeTitle = None
- self.filenameHelp = 'skeinforge_tools.polyfile.html'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'polyfile.csv' )
+ self.fileNameHelp = 'skeinforge_tools.polyfile.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'polyfile.csv' )
self.saveTitle = 'Save Preferences'
self.title = 'Polyfile Preferences'
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/raft.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/raft.py
index 32ea205c..ef8b0e5e 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/raft.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/raft.py
@@ -23,14 +23,14 @@ those will be in the raft dialog. If there are no preferences for the new mater
will have to set new preferences for the new material.
The "Base Infill Density" preference is the infill density ratio of the base of the raft, the default ratio is half. The "Base Layer
-Height over Extrusion Height" preference is the ratio of the height & width of the base layer compared to the height and width
+Height over Layer Thickness" preference is the ratio of the height & width of the base layer compared to the height and width
of the shape infill, the default is two. The feedrate will be slower for raft layers which have thicker extrusions than the shape
infill. The "Base Layers" preference is the number of base layers, the default is one. The "Base Nozzle Lift over Half Base
-Extrusion Height" is the amount the nozzle is above the center of the extrusion divided by half the base extrusion height.
+Layer Thickness" is the amount the nozzle is above the center of the extrusion divided by half the base layer thickness.
-The interface of the raft has equivalent preferences called "Interface Infill Density", "Interface Layer Height over Extrusion
-Height", "Interface Layers" and "Interface Nozzle Lift over Half Base Extrusion Height". The shape has the equivalent
-preference of called "Operating Nozzle Lift over Half Extrusion Height".
+The interface of the raft has equivalent preferences called "Interface Infill Density", "Interface Layer Thickness over Extrusion
+Height", "Interface Layers" and "Interface Nozzle Lift over Half Base Layer Thickness". The shape has the equivalent
+preference of called "Operating Nozzle Lift over Half Layer Thickness".
The altitude that the bottom of the raft will be set to the "Bottom Altitude" preference.
@@ -63,10 +63,6 @@ preference sets the temperature of the next layers of the shape. The "Temperatu
temperature of the support layer. The "Temperature of Supported Layers" preference sets the temperature of the layer of the
shape above the support layer.
-If the "Turn Extruder On Early" checkbox is checked, the extruder will be turned on before the first layer is extruded. Now that
-oozebane turns on the extruder just before a thread begins, the "Turn Extruder On Early" option is probably not necesary so the
-default is now off.
-
The following examples raft the files Screw Holder Bottom.gcode & Screw Holder Bottom.stl. The examples are run in a terminal in the folder
which contains Screw Holder Bottom.gcode, Screw Holder Bottom.stl and raft.py. The raft function will raft if "Activate Raft, Elevate Nozzle,
Orbit and Set Altitude" is true, which can be set in the dialog or by changing the preferences file 'raft.csv' with a text editor or a
@@ -98,7 +94,7 @@ The rafted file is saved as Screw Holder Bottom_raft.gcode
>>> raft.getRaftGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -107,7 +103,7 @@ many lines of gcode
>>> raft.getRaftChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -126,7 +122,7 @@ from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import material
from skeinforge_tools import polyfile
from skeinforge_tools import speed
@@ -203,11 +199,11 @@ def getJoinOfXIntersectionIndexes( xIntersectionIndexList ):
return xIntersectionList
#raft outline temperature http://hydraraptor.blogspot.com/2008/09/screw-top-pot.html
-def getRaftChainGcode( filename, gcodeText, raftPreferences = None ):
+def getRaftChainGcode( fileName, gcodeText, raftPreferences = None ):
"Raft a gcode linear move text. Chain raft the gcode if it is not already rafted."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'speed' ):
- gcodeText = speed.getSpeedChainGcode( filename, gcodeText )
+ gcodeText = speed.getSpeedChainGcode( fileName, gcodeText )
return getRaftGcode( gcodeText, raftPreferences )
def getRaftGcode( gcodeText, raftPreferences = None ):
@@ -274,21 +270,21 @@ def subtractFill( fillXIntersectionIndexTable, supportSegmentLayerTable ):
else:
del supportSegmentLayerTable[ supportSegmentLayerTableKey ]
-def writeOutput( filename = '' ):
+def writeOutput( fileName = '' ):
"""Raft a gcode linear move file. Chain raft the gcode if it is not already rafted.
- If no filename is specified, raft the first unmodified gcode file in this folder."""
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ If no fileName is specified, raft the first unmodified gcode file in this folder."""
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
raftPreferences = RaftPreferences()
preferences.readPreferences( raftPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain rafted.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_raft.gcode'
- raftGcode = getRaftChainGcode( filename, '', raftPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain rafted.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_raft.gcode'
+ raftGcode = getRaftChainGcode( fileName, '', raftPreferences )
if raftGcode == '':
return
gcodec.writeFileText( suffixFilename, raftGcode )
@@ -300,7 +296,7 @@ def writeOutput( filename = '' ):
class RaftPreferences:
"A class to handle the raft preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
materialName = material.getSelectedMaterial()
#Set the default preferences.
self.archive = []
@@ -310,30 +306,30 @@ class RaftPreferences:
self.archive.append( self.addRaftElevateNozzleOrbitSetAltitude )
self.baseInfillDensity = preferences.FloatPreference().getFromValue( 'Base Infill Density (ratio):', 0.5 )
self.archive.append( self.baseInfillDensity )
- self.baseLayerHeightOverExtrusionHeight = preferences.FloatPreference().getFromValue( 'Base Layer Height over Extrusion Height:', 2.0 )
- self.archive.append( self.baseLayerHeightOverExtrusionHeight )
+ self.baseLayerThicknessOverLayerThickness = preferences.FloatPreference().getFromValue( 'Base Layer Thickness over Layer Thickness:', 2.0 )
+ self.archive.append( self.baseLayerThicknessOverLayerThickness )
self.baseLayers = preferences.IntPreference().getFromValue( 'Base Layers (integer):', 1 )
self.archive.append( self.baseLayers )
- self.baseNozzleLiftOverHalfBaseExtrusionHeight = preferences.FloatPreference().getFromValue( 'Base Nozzle Lift over Half Base Extrusion Height (ratio):', 0.75 )
- self.archive.append( self.baseNozzleLiftOverHalfBaseExtrusionHeight )
+ self.baseNozzleLiftOverHalfBaseLayerThickness = preferences.FloatPreference().getFromValue( 'Base Nozzle Lift over Half Base Layer Thickness (ratio):', 0.75 )
+ self.archive.append( self.baseNozzleLiftOverHalfBaseLayerThickness )
self.bottomAltitude = preferences.FloatPreference().getFromValue( 'Bottom Altitude:', 0.0 )
self.archive.append( self.bottomAltitude )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Rafted', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Rafted', '' )
+ self.archive.append( self.fileNameInput )
self.infillOverhang = preferences.FloatPreference().getFromValue( 'Infill Overhang (ratio):', 0.1 )
self.archive.append( self.infillOverhang )
self.interfaceInfillDensity = preferences.FloatPreference().getFromValue( 'Interface Infill Density (ratio):', 0.5 )
self.archive.append( self.interfaceInfillDensity )
- self.interfaceLayerHeightOverExtrusionHeight = preferences.FloatPreference().getFromValue( 'Interface Layer Height over Extrusion Height:', 1.0 )
- self.archive.append( self.interfaceLayerHeightOverExtrusionHeight )
+ self.interfaceLayerThicknessOverLayerThickness = preferences.FloatPreference().getFromValue( 'Interface Layer Thickness over Layer Thickness:', 1.0 )
+ self.archive.append( self.interfaceLayerThicknessOverLayerThickness )
self.interfaceLayers = preferences.IntPreference().getFromValue( 'Interface Layers (integer):', 2 )
self.archive.append( self.interfaceLayers )
- self.interfaceNozzleLiftOverHalfInterfaceExtrusionHeight = preferences.FloatPreference().getFromValue( 'Interface Nozzle Lift over Half Interface Extrusion Height (ratio):', 1.0 )
- self.archive.append( self.interfaceNozzleLiftOverHalfInterfaceExtrusionHeight )
+ self.interfaceNozzleLiftOverHalfInterfaceLayerThickness = preferences.FloatPreference().getFromValue( 'Interface Nozzle Lift over Half Interface Layer Thickness (ratio):', 1.0 )
+ self.archive.append( self.interfaceNozzleLiftOverHalfInterfaceLayerThickness )
self.material = preferences.LabelDisplay().getFromName( 'Material: ' + materialName )
self.archive.append( self.material )
- self.operatingNozzleLiftOverHalfExtrusionHeight = preferences.FloatPreference().getFromValue( 'Operating Nozzle Lift over Half Extrusion Height (ratio):', 1.0 )
- self.archive.append( self.operatingNozzleLiftOverHalfExtrusionHeight )
+ self.operatingNozzleLiftOverHalfLayerThickness = preferences.FloatPreference().getFromValue( 'Operating Nozzle Lift over Half Layer Thickness (ratio):', 1.0 )
+ self.archive.append( self.operatingNozzleLiftOverHalfLayerThickness )
self.raftOutsetRadiusOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Raft Outset Radius over Extrusion Width (ratio):', 15.0 )
self.archive.append( self.raftOutsetRadiusOverExtrusionWidth )
self.supportInsetOverPerimeterExtrusionWidth = preferences.FloatPreference().getFromValue( 'Support Inset over Perimeter Extrusion Width (ratio):', 0.0 )
@@ -371,20 +367,18 @@ class RaftPreferences:
self.archive.append( self.temperatureShapeSupportLayers )
self.temperatureShapeSupportedLayers = preferences.FloatPreference().getFromValue( 'Temperature of Supported Layers (Celcius):', 230.0 )
self.archive.append( self.temperatureShapeSupportedLayers )
- self.turnExtruderOnEarly = preferences.BooleanPreference().getFromValue( 'Turn Extruder On Early:', False )
- self.archive.append( self.turnExtruderOnEarly )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Raft'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'raft_' + materialName + '.csv' )
- self.filenameHelp = 'skeinforge_tools.raft.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'raft_' + materialName + '.csv' )
+ self.fileNameHelp = 'skeinforge_tools.raft.html'
self.saveTitle = 'Save Preferences'
self.title = 'Raft Preferences'
def execute( self ):
"Raft button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class RaftSkein:
@@ -392,7 +386,7 @@ class RaftSkein:
def __init__( self ):
self.boundaryLayers = []
self.decimalPlacesCarried = 3
- self.extrusionHeight = 0.4
+ self.layerThickness = 0.4
self.extrusionStart = True
self.extrusionTop = 0.0
self.extrusionWidth = 0.6
@@ -413,16 +407,16 @@ class RaftSkein:
def addBaseLayer( self, baseExtrusionWidth, baseStep, stepBegin, stepEnd ):
"Add a base layer."
- baseExtrusionHeight = self.extrusionHeight * self.baseLayerHeightOverExtrusionHeight
- halfBaseExtrusionHeight = 0.5 * baseExtrusionHeight
+ baseLayerThickness = self.layerThickness * self.baseLayerThicknessOverLayerThickness
+ halfBaseLayerThickness = 0.5 * baseLayerThickness
halfBaseExtrusionWidth = 0.5 * baseExtrusionWidth
stepsUntilEnd = self.getStepsUntilEnd( stepBegin.real + halfBaseExtrusionWidth, stepEnd.real, baseStep )
baseOverhang = self.raftPreferences.infillOverhang.value * halfBaseExtrusionWidth - halfBaseExtrusionWidth
beginY = stepBegin.imag - baseOverhang
endY = stepEnd.imag + baseOverhang
segments = []
- zCenter = self.extrusionTop + halfBaseExtrusionHeight
- z = zCenter + halfBaseExtrusionHeight * self.raftPreferences.baseNozzleLiftOverHalfBaseExtrusionHeight.value
+ zCenter = self.extrusionTop + halfBaseLayerThickness
+ z = zCenter + halfBaseLayerThickness * self.raftPreferences.baseNozzleLiftOverHalfBaseLayerThickness.value
for x in stepsUntilEnd:
begin = complex( x, beginY )
end = complex( x, endY )
@@ -430,7 +424,7 @@ class RaftSkein:
if len( segments ) < 1:
print( 'This should never happen, the base layer has a size of zero.' )
return
- self.addLayerFromSegments( self.feedrateMinute / self.baseLayerHeightOverExtrusionHeight / self.baseLayerHeightOverExtrusionHeight, baseExtrusionHeight, segments, zCenter, z )
+ self.addLayerFromSegments( self.feedrateMinute / self.baseLayerThicknessOverLayerThickness / self.baseLayerThicknessOverLayerThickness, baseLayerThickness, segments, zCenter, z )
def addGcodeFromFeedrateThreadZ( self, feedrateMinute, thread, z ):
"Add a thread to the output."
@@ -451,11 +445,11 @@ class RaftSkein:
def addInterfaceLayer( self ):
"Add an interface layer."
- interfaceExtrusionHeight = self.extrusionHeight * self.interfaceLayerHeightOverExtrusionHeight
- halfInterfaceExtrusionHeight = 0.5 * interfaceExtrusionHeight
+ interfaceLayerThickness = self.layerThickness * self.interfaceLayerThicknessOverLayerThickness
+ halfInterfaceLayerThickness = 0.5 * interfaceLayerThickness
segments = []
- zCenter = self.extrusionTop + halfInterfaceExtrusionHeight
- z = zCenter + halfInterfaceExtrusionHeight * self.raftPreferences.interfaceNozzleLiftOverHalfInterfaceExtrusionHeight.value
+ zCenter = self.extrusionTop + halfInterfaceLayerThickness
+ z = zCenter + halfInterfaceLayerThickness * self.raftPreferences.interfaceNozzleLiftOverHalfInterfaceLayerThickness.value
for y in self.interfaceStepsUntilEnd:
begin = complex( self.interfaceBeginX, y )
end = complex( self.interfaceEndX, y )
@@ -463,9 +457,9 @@ class RaftSkein:
if len( segments ) < 1:
print( 'This should never happen, the interface layer has a size of zero.' )
return
- self.addLayerFromSegments( self.feedrateMinute / self.interfaceLayerHeightOverExtrusionHeight / self.interfaceLayerHeightOverExtrusionHeight, interfaceExtrusionHeight, segments, zCenter, z )
+ self.addLayerFromSegments( self.feedrateMinute / self.interfaceLayerThicknessOverLayerThickness / self.interfaceLayerThicknessOverLayerThickness, interfaceLayerThickness, segments, zCenter, z )
- def addLayerFromSegments( self, feedrateMinute, layerExtrusionHeight, segments, zCenter, z ):
+ def addLayerFromSegments( self, feedrateMinute, layerLayerThickness, segments, zCenter, z ):
"Add a layer from segments and raise the extrusion top."
firstSegment = segments[ 0 ]
nearestPoint = firstSegment[ 1 ].point
@@ -482,7 +476,7 @@ class RaftSkein:
path.append( nearestPoint )
self.addLine( '(<layerStart> ' + self.getRounded( zCenter ) + ' )' ) # Indicate that a new layer is starting.
self.addGcodeFromFeedrateThreadZ( feedrateMinute, path, z )
- self.extrusionTop += layerExtrusionHeight
+ self.extrusionTop += layerLayerThickness
def addLine( self, line ):
"Add a line of text and a newline to the output."
@@ -492,15 +486,15 @@ class RaftSkein:
def addRaft( self ):
self.extrusionTop = self.raftPreferences.bottomAltitude.value
complexRadius = complex( self.raftOutsetRadius, self.raftOutsetRadius )
- self.baseLayerHeightOverExtrusionHeight = self.raftPreferences.baseLayerHeightOverExtrusionHeight.value
- baseExtrusionWidth = self.extrusionWidth * self.baseLayerHeightOverExtrusionHeight
+ self.baseLayerThicknessOverLayerThickness = self.raftPreferences.baseLayerThicknessOverLayerThickness.value
+ baseExtrusionWidth = self.extrusionWidth * self.baseLayerThicknessOverLayerThickness
baseStep = baseExtrusionWidth / self.raftPreferences.baseInfillDensity.value
- self.interfaceLayerHeightOverExtrusionHeight = self.raftPreferences.interfaceLayerHeightOverExtrusionHeight.value
- interfaceExtrusionWidth = self.extrusionWidth * self.interfaceLayerHeightOverExtrusionHeight
+ self.interfaceLayerThicknessOverLayerThickness = self.raftPreferences.interfaceLayerThicknessOverLayerThickness.value
+ interfaceExtrusionWidth = self.extrusionWidth * self.interfaceLayerThicknessOverLayerThickness
self.interfaceStep = interfaceExtrusionWidth / self.raftPreferences.interfaceInfillDensity.value
self.setCornersZ()
self.cornerLowComplex = self.cornerLow.dropAxis( 2 )
- halfExtrusionHeight = 0.5 * self.extrusionHeight
+ halfLayerThickness = 0.5 * self.layerThickness
self.complexHigh = complexRadius + self.cornerHighComplex
self.complexLow = self.cornerLowComplex - complexRadius
extent = self.complexHigh - self.complexLow
@@ -510,7 +504,7 @@ class RaftSkein:
extentStep = complex( extentStepX, extentStepY )
stepBegin = center - 0.5 * extentStep
stepEnd = stepBegin + extentStep
- zBegin = self.extrusionTop + self.extrusionHeight
+ zBegin = self.extrusionTop + self.layerThickness
beginLoop = getSquareLoop( self.cornerLowComplex, self.cornerHighComplex )
extrudeRaft = self.raftPreferences.baseLayers.value > 0 or self.raftPreferences.interfaceLayers.value > 0
if extrudeRaft:
@@ -524,7 +518,7 @@ class RaftSkein:
self.setInterfaceVariables( interfaceExtrusionWidth, stepBegin, stepEnd )
for interfaceLayerIndex in xrange( self.raftPreferences.interfaceLayers.value ):
self.addInterfaceLayer()
- self.operatingJump = self.extrusionTop - self.cornerLow.z + halfExtrusionHeight + halfExtrusionHeight * self.raftPreferences.operatingNozzleLiftOverHalfExtrusionHeight.value
+ self.operatingJump = self.extrusionTop - self.cornerLow.z + halfLayerThickness + halfLayerThickness * self.raftPreferences.operatingNozzleLiftOverHalfLayerThickness.value
self.setBoundaryLayers()
if extrudeRaft and len( self.boundaryLayers ) > 0:
self.addTemperature( self.raftPreferences.temperatureShapeFirstLayerOutline.value )
@@ -710,9 +704,6 @@ class RaftSkein:
if raftPreferences.addRaftElevateNozzleOrbitSetAltitude.value:
self.addRaft()
self.addTemperature( raftPreferences.temperatureShapeFirstLayerOutline.value )
- if raftPreferences.turnExtruderOnEarly.value:
- self.addLine( 'M101' )
- self.isStartupEarly = True
for line in self.lines[ self.lineIndex : ]:
self.parseLine( line )
@@ -724,8 +715,8 @@ class RaftSkein:
firstWord = gcodec.getFirstWord( splitLine )
if firstWord == '(<decimalPlacesCarried>':
self.decimalPlacesCarried = int( splitLine[ 1 ] )
- elif firstWord == '(<extrusionHeight>':
- self.extrusionHeight = float( splitLine[ 1 ] )
+ elif firstWord == '(<layerThickness>':
+ self.layerThickness = float( splitLine[ 1 ] )
elif firstWord == '(<extrusionPerimeterWidth>':
self.extrusionPerimeterWidth = float( splitLine[ 1 ] )
self.supportOutset = self.extrusionPerimeterWidth - self.extrusionPerimeterWidth * self.raftPreferences.supportInsetOverPerimeterExtrusionWidth.value
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/euclidean.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/euclidean.py
index f38aeccd..4ec82645 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/euclidean.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/euclidean.py
@@ -1068,6 +1068,18 @@ class PathZ:
return '%s, %s' % ( self.path, self.z )
+class RotatedLoopLayer:
+ "A rotated layer."
+ def __init__( self, z ):
+ self.loops = []
+ self.rotation = None
+ self.z = z
+
+ def __repr__( self ):
+ "Get the string representation of this rotated loop layer."
+ return '%s, %s, %s' % ( self.z, self.rotation, self.loops )
+
+
class SurroundingLoop:
"A loop that surrounds paths."
def __init__( self ):
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/gcodec.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/gcodec.py
index 67e46ef0..96b81f91 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/gcodec.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/gcodec.py
@@ -35,15 +35,15 @@ def createInitFile():
fileText = '__all__ = ' + str( getPythonFilenamesExceptInit() )
writeFileText( '__init__.py', fileText )
-def findWords( filenames, search ):
+def findWords( fileNames, search ):
"Find in files the search."
print( search + ' is being searched for.' )
- for filename in filenames:
- fileText = getFileText( filename )
+ for fileName in fileNames:
+ fileText = getFileText( fileName )
if fileText != '':
whereInText = fileText.find( search )
if whereInText != - 1:
- print( filename )
+ print( fileName )
print( whereInText )
whereInTextFromEnd = fileText.rfind( search )
if whereInTextFromEnd != whereInText:
@@ -97,51 +97,56 @@ def getFilesWithFileTypeWithoutWords( fileType, words = [], fileInDirectory = ''
if fileInDirectory != '':
directoryName = os.path.dirname( fileInDirectory )
directory = os.listdir( directoryName )
- for filename in directory:
- joinedFilename = filename
+ for fileName in directory:
+ joinedFilename = fileName
if fileInDirectory != '':
- joinedFilename = os.path.join( directoryName, filename )
+ joinedFilename = os.path.join( directoryName, fileName )
if isFileWithFileTypeWithoutWords( fileType, joinedFilename, words ):
filesWithFileType.append( joinedFilename )
filesWithFileType.sort()
return filesWithFileType
-def getFileText( filename, readMode = 'r' ):
+def getFileText( fileName, readMode = 'r' ):
"Get the entire text of a file."
try:
- file = open( filename, readMode )
+ file = open( fileName, readMode )
fileText = file.read()
file.close()
return fileText
except IOError:
- print( 'The file ' + filename + ' does not exist, an empty string will be returned.' )
+ print( 'The file ' + fileName + ' does not exist, an empty string will be returned.' )
return ''
+def getFileTextInFileDirectory( fileInDirectory, fileName, readMode = 'r' ):
+ "Get the entire text of a file in the directory of the file in directory."
+ absoluteFilePathInFileDirectory = os.path.join( os.path.dirname( fileInDirectory ), fileName )
+ return getFileText( absoluteFilePathInFileDirectory, readMode )
+
def getFirstWord( splitLine ):
"Get the first word of a split line."
if len( splitLine ) > 0:
return splitLine[ 0 ]
return ''
-def getGcodeFileText( filename, gcodeText ):
+def getGcodeFileText( fileName, gcodeText ):
"Get the gcode text from a file if it the gcode text is empty and if the file is a gcode file."
if gcodeText != '':
return gcodeText
- if filename[ - len( '.gcode' ) : ] == '.gcode':
- return getFileText( filename )
+ if fileName[ - len( '.gcode' ) : ] == '.gcode':
+ return getFileText( fileName )
return ''
#def getGNUGcode( fileInDirectory = '' ):
# "Get GNU Triangulated Surface files and gcode files which are not modified."
# return getGNUTriangulatedSurfaceFiles( fileInDirectory ) + getUnmodifiedGCodeFiles( fileInDirectory )
-#def getGNUDirectoryOrFile( isDirectory, filename, wasCancelled ):
+#def getGNUDirectoryOrFile( isDirectory, fileName, wasCancelled ):
# "Get the GNU Triangulated Surface files in the directory the file is in if isDirectory is true. Otherwise, return the file in a list."
-# if str( filename ) == '()' or wasCancelled:
+# if str( fileName ) == '()' or wasCancelled:
# return []
# if isDirectory:
-# return getGNUTriangulatedSurfaceFiles( filename )
-# return [ filename ]
+# return getGNUTriangulatedSurfaceFiles( fileName )
+# return [ fileName ]
#def getGNUTriangulatedSurfaceFiles( fileInDirectory = '' ):
# "Get GNU Triangulated Surface files."
@@ -156,31 +161,31 @@ def getLocationFromSplitLine( oldLocation, splitLine ):
getDoubleFromCharacterSplitLineValue( 'Y', splitLine, oldLocation.y ),
getDoubleFromCharacterSplitLineValue( 'Z', splitLine, oldLocation.z ) )
-def getModule( filename, folderName, moduleFilename ):
- "Get the module from the filename and folder name."
+def getModule( fileName, folderName, moduleFilename ):
+ "Get the module from the fileName and folder name."
absoluteDirectory = os.path.join( os.path.dirname( os.path.abspath( moduleFilename ) ), folderName )
originalSystemPath = sys.path[ : ]
try:
sys.path.insert( 0, absoluteDirectory )
- folderPluginsModule = __import__( filename )
+ folderPluginsModule = __import__( fileName )
sys.path = originalSystemPath
return folderPluginsModule
except Exception, why:
sys.path = originalSystemPath
print( why )
print( '' )
- print( 'That error means; could not import a module with the filename ' + filename )
+ print( 'That error means; could not import a module with the fileName ' + fileName )
print( 'folder name ' + folderName )
- print( 'and module filename ' + moduleFilename )
+ print( 'and module fileName ' + moduleFilename )
print( 'giving an absolute directory name of ' + absoluteDirectory )
print( '' )
- print( 'The plugin could not be imported. So to run ' + filename + ' directly and at least get a more informative error message,' )
+ print( 'The plugin could not be imported. So to run ' + fileName + ' directly and at least get a more informative error message,' )
print( 'in a shell in the ' + folderName + ' folder type ' )
- print( '> python ' + filename + '.py' )
+ print( '> python ' + fileName + '.py' )
return None
def getPluginFilenames( folderName, moduleFilename ):
- "Get the filenames of the python plugins in the export_plugins folder."
+ "Get the fileNames of the python plugins in the export_plugins folder."
pluginsFolderName = os.path.join( os.path.dirname( os.path.abspath( moduleFilename ) ), folderName )
fileInDirectory = os.path.join( pluginsFolderName, '__init__.py' )
fullPluginFilenames = getPythonFilenamesExceptInit( fileInDirectory )
@@ -195,8 +200,8 @@ def getPythonDirectoryNames( directoryName ):
"Get the python directories."
pythonDirectoryNames = []
directory = os.listdir( directoryName )
- for filename in directory:
- subdirectoryName = os.path.join( directoryName, filename )
+ for fileName in directory:
+ subdirectoryName = os.path.join( directoryName, fileName )
if os.path.isdir( subdirectoryName ):
if os.path.isfile( os.path.join( subdirectoryName, '__init__.py' ) ):
pythonDirectoryNames.append( subdirectoryName )
@@ -217,13 +222,13 @@ def getPythonDirectoryNamesRecursively( directoryName = '' ):
return recursivePythonDirectoryNames
def getPythonFilenamesExceptInit( fileInDirectory = '' ):
- "Get the python filenames of the directory which the fileInDirectory is in, except for the __init__.py file."
+ "Get the python fileNames of the directory which the fileInDirectory is in, except for the __init__.py file."
pythonFilenamesExceptInit = getFilesWithFileTypeWithoutWords( 'py', [ '__init__.py' ], fileInDirectory )
pythonFilenamesExceptInit.sort()
return pythonFilenamesExceptInit
def getPythonFilenamesExceptInitRecursively( directoryName = '' ):
- "Get the python filenames of the directory recursively, except for the __init__.py files."
+ "Get the python fileNames of the directory recursively, except for the __init__.py files."
pythonDirectoryNames = getPythonDirectoryNamesRecursively( directoryName )
pythonFilenamesExceptInitRecursively = []
for pythonDirectoryName in pythonDirectoryNames:
@@ -231,21 +236,29 @@ def getPythonFilenamesExceptInitRecursively( directoryName = '' ):
pythonFilenamesExceptInitRecursively.sort()
return pythonFilenamesExceptInitRecursively
-def getSummarizedFilename( filename ):
- "Get the filename basename if the file is in the current working directory, otherwise return the original full name."
- if os.getcwd() == os.path.dirname( filename ):
- return os.path.basename( filename )
- return filename
+def getSummarizedFilename( fileName ):
+ "Get the fileName basename if the file is in the current working directory, otherwise return the original full name."
+ if os.getcwd() == os.path.dirname( fileName ):
+ return os.path.basename( fileName )
+ return fileName
def getTextLines( text ):
"Get the all the lines of text of a text."
- return text.replace( '\r', '\n' ).split( '\n' )
+ return text.replace( '\r', '\n' ).replace( '\n\n', '\n' ).split( '\n' )
def getUnmodifiedGCodeFiles( fileInDirectory = '' ):
"Get gcode files which are not modified."
- words = '_clip _comb _comment _cool _fill _fillet _hop _nozzle_wipe _oozebane _raft _slice _statistic _stretch _tower _transform _wipe'.split()
+ #transform may be needed in future but probably won't
+ words = ' carve clip comb comment cool fill fillet hop inset oozebane raft stretch tower wipe'.replace( ' ', ' _' ).split()
return getFilesWithFileTypeWithoutWords( 'gcode', words, fileInDirectory )
+def getWithoutBracketsEqualTab( line ):
+ "Get a string without the greater than sign, the bracket and less than sign, the equal sign or the tab."
+ line = line.replace( '=', ' ' )
+ line = line.replace( '(<', '' )
+ line = line.replace( '>', '' )
+ return line.replace( '\t', '' )
+
def indexOfStartingWithSecond( letter, splitLine ):
"Get index of the first occurence of the given letter in the split line, starting with the second word. Return - 1 if letter is not found"
for wordIndex in xrange( 1, len( splitLine ) ):
@@ -255,19 +268,19 @@ def indexOfStartingWithSecond( letter, splitLine ):
return wordIndex
return - 1
-def isFileWithFileTypeWithoutWords( fileType, filename, words ):
+def isFileWithFileTypeWithoutWords( fileType, fileName, words ):
"""Determine if file has a given file type, but with does not contain a word in a list.
Keyword arguments:
fileType -- file type required
- filename -- name of the file
- words -- list of words which the filename must not have"""
- filename = os.path.basename( filename )
+ fileName -- name of the file
+ words -- list of words which the fileName must not have"""
+ fileName = os.path.basename( fileName )
fileTypeDot = '.' + fileType
- if filename[ - len( fileTypeDot ) : ] != fileTypeDot:
+ if fileName[ - len( fileTypeDot ) : ] != fileTypeDot:
return False
for word in words:
- if filename.find( word ) >= 0:
+ if fileName.find( word ) >= 0:
return False
return True
@@ -277,14 +290,12 @@ def isProcedureDone( gcodeText, procedure ):
return False
lines = getTextLines( gcodeText )
for line in lines:
- splitLine = line.split( ' ' )
- firstWord = ''
- if len( splitLine ) > 0:
- firstWord = splitLine[ 0 ]
- if firstWord == '(<procedureDone>':
+ splitLine = getWithoutBracketsEqualTab( line ).split()
+ firstWord = getFirstWord( splitLine )
+ if firstWord == 'procedureDone':
if splitLine[ 1 ].find( procedure ) != - 1:
return True
- elif firstWord == '(<extrusionStart>':
+ elif firstWord == 'extrusionStart':
return False
return False
@@ -297,30 +308,30 @@ def isThereAFirstWord( firstWord, lines, startIndex ):
return True
return False
-def replaceWords( filenames, original, replacement ):
+def replaceWords( fileNames, original, replacement ):
"Replace in files the original with the replacement."
print( original + ' is being replaced with ' + replacement + ' in the following files:' )
- for filename in filenames:
- fileText = getFileText( filename )
+ for fileName in fileNames:
+ fileText = getFileText( fileName )
if fileText != '':
whereInText = fileText.find( original )
if whereInText != - 1:
- print( filename )
+ print( fileName )
print( whereInText )
fileText = fileText.replace( original, replacement )
- writeFileText( filename, fileText )
+ writeFileText( fileName, fileText )
-def writeFileMessageEnd( end, filename, fileText, message ):
- "Write to a filename with a suffix and print a message."
- suffixFilename = filename[ : filename.rfind( '.' ) ] + end
+def writeFileMessageEnd( end, fileName, fileText, message ):
+ "Write to a fileName with a suffix and print a message."
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + end
writeFileText( suffixFilename, fileText )
print( message + getSummarizedFilename( suffixFilename ) )
-def writeFileText( filename, fileText, writeMode = 'w+' ):
+def writeFileText( fileName, fileText, writeMode = 'w+' ):
"Write a text to a file."
try:
- file = open( filename, writeMode )
+ file = open( fileName, writeMode )
file.write( fileText )
file.close()
except IOError:
- print( 'The file ' + filename + ' can not be written to.' )
+ print( 'The file ' + fileName + ' can not be written to.' )
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/interpret.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/interpret.py
new file mode 100644
index 00000000..edd7aa12
--- /dev/null
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/interpret.py
@@ -0,0 +1,59 @@
+"""
+Interpret is a collection of utilities to list the import plugins.
+
+An import plugin is a script in the import_plugins folder which has the function getTriangleMesh.
+
+The following examples shows functions of interpret. The examples are run in a terminal in the folder which contains interpret.py.
+
+
+> python
+Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
+[GCC 4.2.1 (SUSE Linux)] on linux2
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import interpret
+>>> interpret.getGNUTranslatorGcodeFileTypeTuples()
+[('GTS files', '*.gts'), ('Gcode text files', '*.gcode'), ('STL files', '*.stl'), ('SVG files', '*.svg')]
+
+>>> interpret.getImportPluginFilenames()
+['gts', 'stl', 'svg']
+
+"""
+
+from __future__ import absolute_import
+#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
+import __init__
+
+from skeinforge_tools.skeinforge_utilities import gcodec
+import os
+
+
+__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
+__date__ = "$Date: 2008/21/04 $"
+__license__ = "GPL 3.0"
+
+
+def getGNUTranslatorGcodeFileTypeTuples():
+ "Get the file type tuples from the translators in the import plugins folder plus gcode."
+ fileTypeTuples = getTranslatorFileTypeTuples()
+ fileTypeTuples.append( ( 'Gcode text files', '*.gcode' ) )
+ fileTypeTuples.sort()
+ return fileTypeTuples
+
+def getGNUTranslatorFilesUnmodified():
+ "Get the file types from the translators in the import plugins folder."
+ return gcodec.getFilesWithFileTypesWithoutWords( getImportPluginFilenames() ) + [ gcodec.getUnmodifiedGCodeFiles() ]
+
+def getImportPluginFilenames():
+ "Get analyze plugin fileNames."
+ return gcodec.getPluginFilenames( 'import_plugins', os.path.dirname( __file__ ) )
+
+def getTranslatorFileTypeTuples():
+ "Get the file types from the translators in the import plugins folder."
+ importPluginFilenames = getImportPluginFilenames()
+ fileTypeTuples = []
+ for importPluginFilename in importPluginFilenames:
+ fileTypeTitle = importPluginFilename.upper() + ' files'
+ fileType = ( fileTypeTitle, '*.' + importPluginFilename )
+ fileTypeTuples.append( fileType )
+ fileTypeTuples.sort()
+ return fileTypeTuples
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/preferences.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/preferences.py
index 874ac89d..dfb9d494 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/preferences.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/preferences.py
@@ -50,23 +50,23 @@ def getPreferencesDirectoryPath():
"Get the preferences directory path, which is the home directory joined with .skeinforge."
return os.path.join( os.path.expanduser( '~' ), '.skeinforge' )
-def getPreferencesFilePath( filename ):
- "Get the preferences file path, which is the home directory joined with .skeinforge and filename."
+def getPreferencesFilePath( fileName ):
+ "Get the preferences file path, which is the home directory joined with .skeinforge and fileName."
directoryName = getPreferencesDirectoryPath()
try:
os.mkdir( directoryName )
except OSError:
pass
- return os.path.join( directoryName, filename )
+ return os.path.join( directoryName, fileName )
def readPreferences( preferences ):
"Set an archive to the preferences read from a file."
- text = gcodec.getFileText( preferences.filenamePreferences )
+ text = gcodec.getFileText( preferences.fileNamePreferences )
if text == '':
print( 'Since the preferences file:' )
- print( preferences.filenamePreferences )
+ print( preferences.fileNamePreferences )
print( 'does not exist, the default preferences will be written to that file.' )
- text = gcodec.getFileText( os.path.join( 'defaults', os.path.basename( preferences.filenamePreferences ) ) )
+ text = gcodec.getFileText( os.path.join( 'defaults', os.path.basename( preferences.fileNamePreferences ) ) )
if text != '':
readPreferencesFromText( preferences, text )
writePreferences( preferences )
@@ -94,7 +94,7 @@ def setArchiveToLine( lineIndex, lines, preferenceTable ):
def writePreferences( preferences ):
"Write the preferences to a file."
- gcodec.writeFileText( preferences.filenamePreferences, getArchiveText( preferences ) )
+ gcodec.writeFileText( preferences.fileNamePreferences, getArchiveText( preferences ) )
class AddListboxSelection:
@@ -276,7 +276,7 @@ class Filename( BooleanPreference ):
"Add this to the dialog."
preferencesDialog.executables.append( self )
- "A class to display, read & write a filename."
+ "A class to display, read & write a fileName."
def execute( self ):
try:
import tkFileDialog
@@ -286,13 +286,13 @@ class Filename( BooleanPreference ):
initialDirectory += os.sep
else:
initialDirectory = "."
- filename = tkFileDialog.askopenfilename( filetypes = self.getFilenameFirstTypes(), initialdir = initialDirectory, initialfile = os.path.basename( summarized ), title = self.name )
- if ( str( filename ) == '()' or str( filename ) == '' ):
+ fileName = tkFileDialog.askopenfilename( filetypes = self.getFilenameFirstTypes(), initialdir = initialDirectory, initialfile = os.path.basename( summarized ), title = self.name )
+ if ( str( fileName ) == '()' or str( fileName ) == '' ):
self.wasCancelled = True
else:
- self.value = filename
+ self.value = fileName
except:
- print( 'Oops, ' + self.name + ' could not get filename.' )
+ print( 'Oops, ' + self.name + ' could not get fileName.' )
def getFromFilename( self, fileTypes, name, value ):
"Initialize."
@@ -302,7 +302,7 @@ class Filename( BooleanPreference ):
return self
def getFilenameFirstTypes( self ):
- "Get the file types with the file type of the filename moved to the front of the list."
+ "Get the file types with the file type of the fileName moved to the front of the list."
basename = os.path.basename( self.value )
splitFile = basename.split( '.' )
allReadables = []
@@ -316,9 +316,9 @@ class Filename( BooleanPreference ):
for fileType in self.fileTypes:
fileExtension = fileType[ 1 ].split( '.' )[ - 1 ]
if fileExtension == baseExtension:
- filenameFirstTypes = self.fileTypes[ : ]
- filenameFirstTypes.remove( fileType )
- return [ fileType ] + filenameFirstTypes + allReadables
+ fileNameFirstTypes = self.fileTypes[ : ]
+ fileNameFirstTypes.remove( fileType )
+ return [ fileType ] + fileNameFirstTypes + allReadables
return self.fileTypes + allReadables
def setToDisplay( self ):
@@ -326,7 +326,7 @@ class Filename( BooleanPreference ):
pass
def setValueToString( self, valueString ):
- "Set the filename to the string."
+ "Set the fileName to the string."
self.value = valueString
@@ -582,7 +582,7 @@ class PreferencesDialog:
packageFilePath = os.path.abspath( __file__ )
for level in xrange( numberOfLevelsDeepInPackageHierarchy + 1 ):
packageFilePath = os.path.dirname( packageFilePath )
- documentationPath = os.path.join( os.path.join( packageFilePath, 'documentation' ), self.displayPreferences.filenameHelp )
+ documentationPath = os.path.join( os.path.join( packageFilePath, 'documentation' ), self.displayPreferences.fileNameHelp )
os.system( webbrowser.get().name + ' ' + documentationPath )#used this instead of webbrowser.open() to workaround webbrowser open() bug
def savePreferences( self ):
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/triangle_mesh.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/triangle_mesh.py
index acbce2fb..b38ca8d8 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/triangle_mesh.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/skeinforge_utilities/triangle_mesh.py
@@ -3,7 +3,7 @@ Triangle Mesh holds the faces and edges of a triangular mesh.
It can read from and write to a GNU Triangulated Surface (.gts) file.
-The following examples slice the GNU Triangulated Surface file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which
+The following examples carve the GNU Triangulated Surface file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which
contains Screw Holder Bottom.stl and triangle_mesh.py.
@@ -11,20 +11,20 @@ contains Screw Holder Bottom.stl and triangle_mesh.py.
Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
->>> import slice
->>> slice.main()
-File Screw Holder Bottom.stl is being sliced.
-The sliced file is saved as Screw Holder Bottom_slice.gcode
-It took 3 seconds to slice the file.
+>>> import carve
+>>> carve.main()
+File Screw Holder Bottom.stl is being carved.
+The carved file is saved as Screw Holder Bottom_carve.gcode
+It took 3 seconds to carve the file.
->>> slice.writeOutput()
-File Screw Holder Bottom.gcode is being sliced.
-The sliced file is saved as Screw Holder Bottom_slice.gcode
-It took 3 seconds to slice the file.
+>>> carve.writeOutput()
+File Screw Holder Bottom.gcode is being carved.
+The carved file is saved as Screw Holder Bottom_carve.gcode
+It took 3 seconds to carve the file.
->>> slice.getSliceGcode("
+>>> carve.getCarveGcode("
54 162 108 Number of Vertices,Number of Edges,Number of Faces
-5.800000000000001 5.341893939393939 4.017841892579603 Vertex Coordinates XYZ
5.800000000000001 5.341893939393939 4.017841892579603
@@ -40,8 +40,12 @@ from __future__ import absolute_import
import __init__
from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
+from skeinforge_tools.skeinforge_utilities import euclidean
from skeinforge_tools.skeinforge_utilities import gcodec
+from skeinforge_tools.skeinforge_utilities import intercircle
+import cmath
import cStringIO
+import math
__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
@@ -50,6 +54,82 @@ __date__ = "$Date: 2008/02/05 $"
__license__ = "GPL 3.0"
+def addEdgePair( edgePairTable, edges, faceEdgeIndex, remainingEdgeIndex, remainingEdgeTable ):
+ "Add edge pair to the edge pair table."
+ if faceEdgeIndex == remainingEdgeIndex:
+ return
+ if not faceEdgeIndex in remainingEdgeTable:
+ return
+ edgePair = triangle_mesh.EdgePair().getFromIndexesEdges( [ remainingEdgeIndex, faceEdgeIndex ], edges )
+ edgePairTable[ str( edgePair ) ] = edgePair
+
+def addLoopToPointTable( loop, pointTable ):
+ "Add the points in the loop to the point table."
+ for point in loop:
+ pointTable[ point ] = loop
+
+def addPointsAtZ( edgePair, points, radius, vertices, z ):
+ "Add point complexes on the segment between the edge intersections with z."
+ carveIntersectionFirst = getCarveIntersectionFromEdge( edgePair.edges[ 0 ], vertices, z )
+ carveIntersectionSecond = getCarveIntersectionFromEdge( edgePair.edges[ 1 ], vertices, z )
+ intercircle.addPointsFromSegment( points, radius, carveIntersectionFirst, carveIntersectionSecond, 0.3 )
+
+def addWithLeastLength( loops, point, shortestAdditionalLength ):
+ "Insert a point into a loop, at the index at which the loop would be shortest."
+ shortestLoop = None
+ shortestPointIndex = None
+ for loop in loops:
+ if len( loop ) > 2:
+ for pointIndex in xrange( len( loop ) ):
+ additionalLength = getAdditionalLoopLength( loop, point, pointIndex )
+ if additionalLength < shortestAdditionalLength:
+ shortestAdditionalLength = additionalLength
+ shortestLoop = loop
+ shortestPointIndex = pointIndex
+ if shortestPointIndex != None:
+ afterCenterComplex = shortestLoop[ shortestPointIndex ]
+ afterEndComplex = shortestLoop[ ( shortestPointIndex + 1 ) % len( shortestLoop ) ]
+ isInlineAfter = isInline( point, afterCenterComplex, afterEndComplex )
+ beforeCenterComplex = shortestLoop[ ( shortestPointIndex + len( shortestLoop ) - 1 ) % len( shortestLoop ) ]
+ beforeEndComplex = shortestLoop[ ( shortestPointIndex + len( shortestLoop ) - 2 ) % len( shortestLoop ) ]
+ isInlineBefore = isInline( point, beforeCenterComplex, beforeEndComplex )
+ if isInlineAfter or isInlineBefore:
+ shortestLoop.insert( shortestPointIndex, point )
+
+def compareArea( loopArea, otherLoopArea ):
+ "Get comparison in order to sort loop areas in descending order of area."
+ if loopArea.area < otherLoopArea.area:
+ return 1
+ if loopArea.area > otherLoopArea.area:
+ return - 1
+ return 0
+
+def getAdditionalLoopLength( loop, point, pointIndex ):
+ "Get the additional length added by inserting a point into a loop."
+ afterPoint = loop[ pointIndex ]
+ beforePoint = loop[ ( pointIndex + len( loop ) - 1 ) % len( loop ) ]
+ return abs( point - beforePoint ) + abs( point - afterPoint ) - abs( afterPoint - beforePoint )
+
+def getCommonVertexIndex( edgeFirst, edgeSecond ):
+ "Get the vertex index that both edges have in common."
+ for edgeFirstVertexIndex in edgeFirst.vertexIndexes:
+ if edgeFirstVertexIndex == edgeSecond.vertexIndexes[ 0 ] or edgeFirstVertexIndex == edgeSecond.vertexIndexes[ 1 ]:
+ return edgeFirstVertexIndex
+ print( "Inconsistent GNU Triangulated Surface" )
+ print( edgeFirst )
+ print( edgeSecond )
+ return 0
+
+def getCarveIntersectionFromEdge( edge, vertices, z ):
+ "Get the complex where the carve intersects the edge."
+ firstVertex = vertices[ edge.vertexIndexes[ 0 ] ]
+ firstVertexComplex = firstVertex.dropAxis( 2 )
+ secondVertex = vertices[ edge.vertexIndexes[ 1 ] ]
+ secondVertexComplex = secondVertex.dropAxis( 2 )
+ zMinusFirst = z - firstVertex.z
+ up = secondVertex.z - firstVertex.z
+ return zMinusFirst * ( secondVertexComplex - firstVertexComplex ) / up + firstVertexComplex
+
def getCommonVertexIndex( edgeFirst, edgeSecond ):
"Get the vertex index that both edges have in common."
for edgeFirstVertexIndex in edgeFirst.vertexIndexes:
@@ -60,20 +140,224 @@ def getCommonVertexIndex( edgeFirst, edgeSecond ):
print( edgeSecond )
return 0
-def getTriangleMesh( filename = '' ):
- "Slice a GNU Triangulated Surface file. If no filename is specified, slice the first GNU Triangulated Surface file in this folder."
- if filename == '':
+def getDoubledRoundZ( overhangingSegment, segmentRoundZ ):
+ "Get doubled plane angle around z of the overhanging segment."
+ endpoint = overhangingSegment[ 0 ]
+ roundZ = endpoint.point - endpoint.otherEndpoint.point
+ roundZ *= segmentRoundZ
+ if abs( roundZ ) == 0.0:
+ return complex()
+ if roundZ.real < 0.0:
+ roundZ *= - 1.0
+ roundZLength = abs( roundZ )
+ return roundZ * roundZ / roundZLength
+
+def getLoopsFromCorrectMesh( edges, faces, vertices, z ):
+ "Get loops from a carve of a correct mesh."
+ remainingEdgeTable = getRemainingEdgeTable( edges, vertices, z )
+ remainingValues = remainingEdgeTable.values()
+ for edge in remainingValues:
+ if len( edge.faceIndexes ) < 2:
+ print( 'This should never happen, there is a hole in the triangle mesh, each edge should have two faces.' )
+ print( edge )
+ print( "Something will still be printed, but there is no guarantee that it will be the correct shape." )
+ print( 'Once the gcode is saved, you should check over the layer with a z of:' )
+ print( z )
+ return []
+ loops = []
+ while isPathAdded( edges, faces, loops, remainingEdgeTable, vertices, z ):
+ pass
+ return loops
+# untouchables = []
+# for boundingLoop in boundingLoops:
+# if not boundingLoop.isIntersectingList( untouchables ):
+# untouchables.append( boundingLoop )
+# if len( untouchables ) < len( boundingLoops ):
+# print( 'This should never happen, the carve layer intersects itself. Something will still be printed, but there is no guarantee that it will be the correct shape.' )
+# print( 'Once the gcode is saved, you should check over the layer with a z of:' )
+# print( z )
+# remainingLoops = []
+# for untouchable in untouchables:
+# remainingLoops.append( untouchable.loop )
+# return remainingLoops
+
+def getLoopsFromUnprovenMesh( edges, extrusionWidth, faces, importCoarseness, vertices, z ):
+ "Get loops from a carve of an unproven mesh."
+ edgePairTable = {}
+ importRadius = importCoarseness * extrusionWidth
+ points = []
+ pointTable = {}
+ remainingEdgeTable = getRemainingEdgeTable( edges, vertices, z )
+ remainingEdgeTableKeys = remainingEdgeTable.keys()
+ for remainingEdgeIndexKey in remainingEdgeTable:
+ edge = remainingEdgeTable[ remainingEdgeIndexKey ]
+ carveIntersection = getCarveIntersectionFromEdge( edge, vertices, z )
+ points.append( carveIntersection )
+ for edgeFaceIndex in edge.faceIndexes:
+ face = faces[ edgeFaceIndex ]
+ for edgeIndex in face.edgeIndexes:
+ addEdgePair( edgePairTable, edges, edgeIndex, remainingEdgeIndexKey, remainingEdgeTable )
+ onlyPoints = points[ : ]
+ for edgePairValue in edgePairTable.values():
+ addPointsAtZ( edgePairValue, points, importRadius, vertices, z )
+ circleNodes = intercircle.getCircleNodesFromPoints( points, importRadius )
+ centers = intercircle.getCentersFromCircleNodes( circleNodes )
+ loops = intercircle.getLoopsFromLoopsDirection( True, centers )
+ for loop in loops:
+ addLoopToPointTable( loop, pointTable )
+ clockwiseLoops = getLoopsInDescendingOrderOfArea( intercircle.getLoopsFromLoopsDirection( False, centers ) )
+ clockwiseLoops.reverse()
+ for clockwiseLoop in clockwiseLoops:
+ if len( clockwiseLoop ) > 2 and euclidean.getMaximumSpan( clockwiseLoop ) > 2.5 * importRadius:
+ if getOverlapRatio( clockwiseLoop, pointTable ) < 0.45:
+ loops.append( clockwiseLoop )
+ addLoopToPointTable( clockwiseLoop, pointTable )
+ shortestAdditionalLength = 0.85 * importRadius
+ for onlyPoint in onlyPoints:
+ if onlyPoint not in pointTable:
+ addWithLeastLength( loops, onlyPoint, shortestAdditionalLength )
+ return loops
+
+def getLoopsInDescendingOrderOfArea( loops ):
+ "Get the lowest zone index."
+ loopAreas = []
+ for loop in loops:
+ loopArea = LoopArea( loop )
+ loopAreas.append( loopArea )
+ loopAreas.sort( compareArea )
+ loopsInDescendingOrderOfArea = []
+ for loopArea in loopAreas:
+ loopsInDescendingOrderOfArea.append( loopArea.loop )
+ return loopsInDescendingOrderOfArea
+
+def getLowestZoneIndex( zoneArray, z ):
+ "Get the lowest zone index."
+ lowestZoneIndex = 0
+ lowestZone = 99999999.0
+ for zoneIndex in xrange( len( zoneArray ) ):
+ zone = zoneArray[ zoneIndex ]
+ if zone < lowestZone:
+ lowestZone = zone
+ lowestZoneIndex = zoneIndex
+ return lowestZoneIndex
+
+def getNextEdgeIndexAroundZ( edge, faces, remainingEdgeTable ):
+ "Get the next edge index in the mesh carve."
+ for faceIndex in edge.faceIndexes:
+ face = faces[ faceIndex ]
+ for edgeIndex in face.edgeIndexes:
+ if edgeIndex in remainingEdgeTable:
+ return edgeIndex
+ return - 1
+
+def getOverhangDirection( belowOutsetLoops, segmentBegin, segmentEnd ):
+ "Add to span direction from the endpoint segments which overhang the layer below."
+ segment = segmentEnd - segmentBegin
+ normalizedSegment = euclidean.getNormalized( complex( segment.real, segment.imag ) )
+ segmentYMirror = complex( normalizedSegment.real, - normalizedSegment.imag )
+ segmentBegin = segmentYMirror * segmentBegin
+ segmentEnd = segmentYMirror * segmentEnd
+ solidXIntersectionList = []
+ y = segmentBegin.imag
+ solidXIntersectionList.append( euclidean.XIntersectionIndex( - 1.0, segmentBegin.real ) )
+ solidXIntersectionList.append( euclidean.XIntersectionIndex( - 1.0, segmentEnd.real ) )
+ for belowLoopIndex in xrange( len( belowOutsetLoops ) ):
+ belowLoop = belowOutsetLoops[ belowLoopIndex ]
+ rotatedOutset = euclidean.getPointsRoundZAxis( segmentYMirror, belowLoop )
+ euclidean.addXIntersectionIndexes( rotatedOutset, belowLoopIndex, solidXIntersectionList, y )
+ overhangingSegments = euclidean.getSegmentsFromXIntersectionIndexes( solidXIntersectionList, y )
+ overhangDirection = complex()
+ for overhangingSegment in overhangingSegments:
+ overhangDirection += getDoubledRoundZ( overhangingSegment, normalizedSegment )
+ return overhangDirection
+
+def getOverlapRatio( loop, pointTable ):
+ "Get the overlap ratio between the loop and the point table."
+ numberOfOverlaps = 0
+ for point in loop:
+ if point in pointTable:
+ numberOfOverlaps += 1
+ return float( numberOfOverlaps ) / float( len( loop ) )
+
+def getPath( edges, pathIndexes, loop, z ):
+ "Get the path from the edge intersections."
+ path = []
+ for pathIndexIndex in xrange( len( pathIndexes ) ):
+ pathIndex = pathIndexes[ pathIndexIndex ]
+ edge = edges[ pathIndex ]
+ carveIntersection = getCarveIntersectionFromEdge( edge, loop, z )
+ path.append( carveIntersection )
+ return path
+
+def getRemainingEdgeTable( edges, vertices, z ):
+ "Get the remaining edge hashtable."
+ remainingEdgeTable = {}
+ for edgeIndex in xrange( len( edges ) ):
+ edge = edges[ edgeIndex ]
+ if isZInEdge( edge, vertices, z ):
+ remainingEdgeTable[ edgeIndex ] = edge
+ return remainingEdgeTable
+
+def getSharedFace( firstEdge, faces, secondEdge ):
+ "Get the face which is shared by two edges."
+ for firstEdgeFaceIndex in firstEdge.faceIndexes:
+ for secondEdgeFaceIndex in secondEdge.faceIndexes:
+ if firstEdgeFaceIndex == secondEdgeFaceIndex:
+ return faces[ firstEdgeFaceIndex ]
+ return None
+
+def getTriangleMesh( fileName = '' ):
+ "Carve a GNU Triangulated Surface file. If no fileName is specified, carve the first GNU Triangulated Surface file in this folder."
+ if fileName == '':
unmodified = gcodec.getGNUTriangulatedSurfaceFiles()
if len( unmodified ) == 0:
print( "There are no GNU Triangulated Surface files in this folder." )
return None
- filename = unmodified[ 0 ]
- gnuTriangulatedSurfaceText = gcodec.getFileText( filename )
+ fileName = unmodified[ 0 ]
+ gnuTriangulatedSurfaceText = gcodec.getFileText( fileName )
if gnuTriangulatedSurfaceText == '':
return None
triangleMesh = TriangleMesh().getFromGNUTriangulatedSurfaceText( gnuTriangulatedSurfaceText )
return triangleMesh
+def isInline( beginComplex, centerComplex, endComplex ):
+ "Determine if the three complex points form a line."
+ centerBeginComplex = beginComplex - centerComplex
+ centerEndComplex = endComplex - centerComplex
+ centerBeginLength = abs( centerBeginComplex )
+ centerEndLength = abs( centerEndComplex )
+ if centerBeginLength <= 0.0 or centerEndLength <= 0.0:
+ return False
+ centerBeginComplex /= centerBeginLength
+ centerEndComplex /= centerEndLength
+ return euclidean.getDotProduct( centerBeginComplex, centerEndComplex ) < - 0.999
+
+def isPathAdded( edges, faces, loops, remainingEdgeTable, vertices, z ):
+ "Get the path indexes around a triangle mesh carve and add the path to the flat loops."
+ if len( remainingEdgeTable ) < 1:
+ return False
+ pathIndexes = []
+ remainingEdgeIndexKey = remainingEdgeTable.keys()[ 0 ]
+ pathIndexes.append( remainingEdgeIndexKey )
+ del remainingEdgeTable[ remainingEdgeIndexKey ]
+ nextEdgeIndexAroundZ = getNextEdgeIndexAroundZ( edges[ remainingEdgeIndexKey ], faces, remainingEdgeTable )
+ while nextEdgeIndexAroundZ != - 1:
+ pathIndexes.append( nextEdgeIndexAroundZ )
+ del remainingEdgeTable[ nextEdgeIndexAroundZ ]
+ nextEdgeIndexAroundZ = getNextEdgeIndexAroundZ( edges[ nextEdgeIndexAroundZ ], faces, remainingEdgeTable )
+ if len( pathIndexes ) < 3:
+ print( "Dangling edges, will use intersecting circles to get import layer at height " + z.toString() )
+ del loops[ : ]
+ return False
+ loops.append( getPath( edges, pathIndexes, vertices, z ) )
+ return True
+
+def isZInEdge( edge, vertices, z ):
+ "Determine if z is inside the edge."
+ vertex1ZHigher = vertices[ edge.vertexIndexes[ 0 ] ].z > z
+ vertex2ZHigher = vertices[ edge.vertexIndexes[ 1 ] ].z > z
+ return vertex1ZHigher != vertex2ZHigher
+
class Edge:
"An edge of a triangle mesh."
@@ -120,6 +404,7 @@ class EdgePair:
self.edges.append( edges[ edgeIndex ] )
return self
+
class Face:
"A face of a triangle mesh."
def __init__( self ):
@@ -169,6 +454,17 @@ class Face:
return self
+class LoopArea:
+ "Complex loop with an area."
+ def __init__( self, loop ):
+ self.area = abs( euclidean.getPolygonArea( loop ) )
+ self.loop = loop
+
+ def __repr__( self ):
+ "Get the string representation of this flat path."
+ return '%s, %s' % ( self.area, self.loop )
+
+
"""
Quoted from http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE
"All the lines beginning with GTS_COMMENTS (#!) are ignored. The first line contains three unsigned integers separated by spaces. The first integer is the number of vertices, nv, the second is the number of edges, ne and the third is the number of faces, nf.
@@ -182,14 +478,96 @@ class TriangleMesh:
"A triangle mesh."
def __init__( self ):
"Add empty lists."
+ self.belowLoops = None
+ self.bridgeLayerThickness = None
self.edges = []
self.faces = []
+ self.rotatedBoundaryLayers = []
self.vertices = []
def __repr__( self ):
"Get the string representation of this TriangleMesh."
return str( self.vertices ) + '\n' + str( self.edges ) + '\n' + str( self.faces )
+ def addToZoneArray( self, point, zoneArray, z ):
+ "Add a height to the zone array."
+ zoneLayer = int( round( ( point.z - z ) / self.zZoneInterval ) )
+ zoneAround = 2 * int( abs( zoneLayer ) )
+ if zoneLayer < 0:
+ zoneAround -= 1
+ if zoneAround < len( zoneArray ):
+ zoneArray[ zoneAround ] += 1
+
+ def getBridgeDirection( self, layerLoops ):
+ "Get span direction for the majority of the overhanging extrusion perimeter, if any."
+ if self.bridgeLayerThickness == None:
+ return None
+ if self.belowLoops == None:
+ return None
+ belowOutsetLoops = []
+ overhangInset = 1.25 * self.extrusionWidth
+ slightlyGreaterThanOverhang = 1.1 * overhangInset
+ muchGreaterThanOverhang = 2.5 * overhangInset
+ for loop in self.belowLoops:
+ centers = intercircle.getCentersFromLoopDirection( True, loop, slightlyGreaterThanOverhang )
+ for center in centers:
+ outset = intercircle.getSimplifiedInsetFromClockwiseLoop( center, overhangInset )
+ if euclidean.isLargeSameDirection( outset, center, muchGreaterThanOverhang ):
+ belowOutsetLoops.append( outset )
+ bridgeDirection = complex()
+ for loop in layerLoops:
+ for pointIndex in xrange( len( loop ) ):
+ previousIndex = ( pointIndex + len( loop ) - 1 ) % len( loop )
+ bridgeDirection += getOverhangDirection( belowOutsetLoops, loop[ previousIndex ], loop[ pointIndex ] )
+ if abs( bridgeDirection ) < 0.5 * self.extrusionWidth:
+ return None
+ else:
+ bridgeDirection /= abs( bridgeDirection )
+ return cmath.sqrt( bridgeDirection )
+
+ def getBridgeLoops( self, loop ):
+ "Get the inset bridge loops from the loop."
+ slightlyGreaterThanHalfWidth = 1.1 * self.extrusionWidth
+ muchGreaterThanHalfWIdth = 2.5 * self.extrusionWidth
+ extrudateLoops = []
+ circleNodes = intercircle.getCircleNodesFromLoop( loop, slightlyGreaterThanHalfWidth )
+ centers = intercircle.getCentersFromCircleNodes( circleNodes )
+ for center in centers:
+ extrudateLoop = intercircle.getSimplifiedInsetFromClockwiseLoop( center, self.extrusionWidth )
+ if euclidean.isLargeSameDirection( extrudateLoop, center, muchGreaterThanHalfWIdth ):
+ if euclidean.isPathInsideLoop( loop, extrudateLoop ) == euclidean.isWiddershins( loop ):
+ extrudateLoop.reverse()
+ extrudateLoops.append( extrudateLoop )
+ return extrudateLoops
+
+ def getCarveCornerMaximum( self ):
+ "Get the corner maximum of the vertices."
+ return self.cornerMaximum
+
+ def getCarveCornerMinimum( self ):
+ "Get the corner minimum of the vertices."
+ return self.cornerMinimum
+
+ def getCarveLayerThickness( self ):
+ "Get the layer thickness."
+ return self.layerThickness
+
+ def getCarveRotatedBoundaryLayers( self ):
+ "Get the rotated boundary layers."
+ self.cornerMaximum = Vector3( - 999999999.0, - 999999999.0, - 999999999.0 )
+ self.cornerMinimum = Vector3( 999999999.0, 999999999.0, 999999999.0 )
+ for point in self.vertices:
+ self.cornerMaximum = euclidean.getPointMaximum( self.cornerMaximum, point )
+ self.cornerMinimum = euclidean.getPointMinimum( self.cornerMinimum, point )
+ halfHeight = 0.5 * self.layerThickness
+ zZoneLayers = 99
+ self.zZoneInterval = self.layerThickness / zZoneLayers / 100.0
+ layerTop = self.cornerMaximum.z - halfHeight * 0.5
+ z = self.cornerMinimum.z + halfHeight
+ while z < layerTop:
+ z = self.getZAddExtruderPaths( z )
+ return self.rotatedBoundaryLayers
+
def getGNUTriangulatedSurfaceText( self ):
"Get this mesh in the GNU Triangulated Surface (.gts) format."
output = cStringIO.StringIO()
@@ -205,46 +583,71 @@ class TriangleMesh:
output.write( '%s\n' % face.getGNUTriangulatedSurfaceLine() )
return output.getvalue()
- def getFromGNUTriangulatedSurfaceText( self, gnuTriangulatedSurfaceText ):
- "Initialize from a GNU Triangulated Surface Text."
- if gnuTriangulatedSurfaceText == '':
- return None
- lines = gcodec.getTextLines( gnuTriangulatedSurfaceText )
- linesWithoutComments = []
- for line in lines:
- if len( line ) > 0:
- firstCharacter = line[ 0 ]
- if firstCharacter != '#' and firstCharacter != '!':
- linesWithoutComments.append( line )
- splitLine = linesWithoutComments[ 0 ].split()
- numberOfVertices = int( splitLine[ 0 ] )
- numberOfEdges = int( splitLine[ 1 ] )
- numberOfFaces = int( splitLine[ 2 ] )
- faceTriples = []
- for vertexIndex in xrange( numberOfVertices ):
- line = linesWithoutComments[ vertexIndex + 1 ]
- splitLine = line.split()
- vertex = Vector3( float( splitLine[ 0 ] ), float( splitLine[ 1 ] ), float( splitLine[ 2 ] ) )
- self.vertices.append( vertex )
- edgeStart = numberOfVertices + 1
- for edgeIndex in xrange( numberOfEdges ):
- line = linesWithoutComments[ edgeIndex + edgeStart ]
- splitLine = line.split()
- vertexIndexes = []
- for word in splitLine[ : 2 ]:
- vertexIndexes.append( int( word ) - 1 )
- edge = Edge().getFromVertexIndexes( edgeIndex, vertexIndexes )
- self.edges.append( edge )
- faceStart = edgeStart + numberOfEdges
- for faceIndex in xrange( numberOfFaces ):
- line = linesWithoutComments[ faceIndex + faceStart ]
- splitLine = line.split()
- edgeIndexes = []
- for word in splitLine[ : 3 ]:
- edgeIndexes.append( int( word ) - 1 )
- face = Face().getFromEdgeIndexes( edgeIndexes, self.edges, faceIndex )
- self.faces.append( face )
- return self
+ def getLoopsFromMesh( self, z ):
+ "Get loops from a carve of a mesh."
+ originalLoops = []
+ if self.isCorrectMesh:
+ originalLoops = getLoopsFromCorrectMesh( self.edges, self.faces, self.vertices, z )
+ if len( originalLoops ) < 1:
+ originalLoops = getLoopsFromUnprovenMesh( self.edges, self.extrusionWidth, self.faces, self.importCoarseness, self.vertices, z )
+ simplifiedLoops = []
+ for originalLoop in originalLoops:
+ simplifiedLoops.append( euclidean.getSimplifiedLoop( originalLoop, self.extrusionWidth ) )
+ loops = getLoopsInDescendingOrderOfArea( simplifiedLoops )
+ for loopIndex in xrange( len( loops ) ):
+ loop = loops[ loopIndex ]
+ leftPoint = euclidean.getLeftPoint( loop )
+ totalNumberOfIntersectionsToLeft = 0
+ for otherLoop in loops[ : loopIndex ] + loops[ loopIndex + 1 : ]:
+ totalNumberOfIntersectionsToLeft += euclidean.getNumberOfIntersectionsToLeft( leftPoint, otherLoop )
+ loopIsWiddershins = euclidean.isWiddershins( loop )
+ isEven = totalNumberOfIntersectionsToLeft % 2 == 0
+ if isEven != loopIsWiddershins:
+ loop.reverse()
+ return loops
+
+ def getZAddExtruderPaths( self, z ):
+ "Get next z and add extruder loops."
+ zoneArray = []
+ for point in self.vertices:
+ self.addToZoneArray( point, zoneArray, z )
+ lowestZoneIndex = getLowestZoneIndex( zoneArray, z )
+ halfAround = int( math.ceil( float( lowestZoneIndex ) / 2.0 ) )
+ zAround = float( halfAround ) * self.zZoneInterval
+ if lowestZoneIndex % 2 == 1:
+ zAround = - zAround
+ zPlusAround = z + zAround
+ rotatedBoundaryLayer = euclidean.RotatedLoopLayer( zPlusAround )
+ self.rotatedBoundaryLayers.append( rotatedBoundaryLayer )
+ rotatedBoundaryLayer.loops = self.getLoopsFromMesh( zPlusAround )
+ allExtrudateLoops = []
+ for loop in rotatedBoundaryLayer.loops:
+ allExtrudateLoops += self.getBridgeLoops( loop )
+ rotatedBoundaryLayer.rotation = self.getBridgeDirection( allExtrudateLoops )
+ self.belowLoops = allExtrudateLoops
+ if rotatedBoundaryLayer.rotation == None:
+ return z + self.layerThickness
+ return z + self.bridgeLayerThickness
+
+ def setCarveBridgeLayerThickness( self, bridgeLayerThickness ):
+ "Set the bridge layer thickness. If the infill is not in the direction of the bridge, the bridge layer thickness should be given as None or not set at all."
+ self.bridgeLayerThickness = bridgeLayerThickness
+
+ def setCarveLayerThickness( self, layerThickness ):
+ "Set the layer thickness."
+ self.layerThickness = layerThickness
+
+ def setCarveExtrusionWidth( self, extrusionWidth ):
+ "Set the extrusion width."
+ self.extrusionWidth = extrusionWidth
+
+ def setCarveImportCoarseness( self, importCoarseness ):
+ "Set the import coarseness."
+ self.importCoarseness = importCoarseness
+
+ def setCarveIsCorrectMesh( self, isCorrectMesh ):
+ "Set the is correct mesh flag."
+ self.isCorrectMesh = isCorrectMesh
def setEdgesForAllFaces( self ):
"Set the face edges of all the faces."
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/slice_shape.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/slice_shape.py
deleted file mode 100644
index 8e40b5c8..00000000
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/slice_shape.py
+++ /dev/null
@@ -1,929 +0,0 @@
-"""
-Slice shape is a script to slice a GNU Triangulated Surface file.
-
-Slice slices a GNU Triangulated Surface file into gcode extrusion layers. The 'Extrusion Diameter' is the diameter of the extrusion at the
-default extruder speed, this is the most important slice preference. The 'Extrusion Height over Diameter' is the ratio of the extrusion
-height over the extrusion diameter. The 'Extrusion Width over Diameter' ratio is the ratio of the extrusion width over the extrusion
-diameter. A ratio of one means the extrusion is a circle, a typical ratio of 1.5 means the extrusion is a wide oval. These values should
-be measured from a test extrusion line.
-
-The extrusion fill density ratio that is printed to the console, ( it is not a parameter ) is the area of the extrusion diameter over the
-extrusion width over the extrusion height. Assuming the extrusion diameter is correct, a high value means the filament will be packed
-tightly, and the object will be almost as dense as the filament. If the value is too high, there could be too little room for the filament,
-and the extruder will end up plowing through the extra filament. A low value means the filaments will be far away from each other, the
-object will be leaky and light. The value with the default extrusion preferences is around 0.82.
-
-Rarely changed preferences are Import Coarseness, Mesh Type, Infill Bridge Width Over Thickness & Infill in Direction
-of Bridges. When the triangle mesh has holes in it, slice switches over to a slow algorithm that spans gaps in the mesh. The higher the
-import coarseness, the wider the gaps in the mesh it will span. An import coarseness of one means it will span gaps the width of the
-extrusion. When the Mesh Type preference is correct, the mesh will be accurately sliced, and if a hole is found, slice will switch over to
-the algorithm that spans gaps. If the Mesh Type preference is Unproven, slice will use the gap spanning algorithm from the start. The
-problem with the gap spanning algothm is that it will span gaps, even if there actually is a gap in the model. Infill bridge width
-over thickness ratio is the ratio of the extrusion width over the layer thickness on a bridge layer. If the infill in direction of bridges
-preference is chosen, the infill will be in the direction of bridges across gaps, so that the fill will be able to span a bridge easier.
-
-If the "Start at Home" preference is selected, the G28 gcode will be added at the beginning of the file.
-
-When slice is generating the code, if there is a file start.txt, it will add that to the very beginning of the gcode. After it has added some
-initialization code and just before it adds the extrusion gcode, it will add the file endofthebeginning.txt if it exists. At the very end, it will
-add the file end.txt if it exists. Slice does not care if the text file names are capitalized, but some file systems do not handle file name
-cases properly, so to be on the safe side you should give them lower case names. It will first look for the file in the same directory as
-slice, if it does not find it it will look in ~/.skeinforge/gcode_scripts. To run slice, in a shell type:
-> python slice.py
-
-The following examples slice the GNU Triangulated Surface file Screw Holder Bottom.stl. The examples are run in a terminal in the
-folder which contains Screw Holder Bottom.stl and slice.py. The preferences can be set in the dialog or by changing the preferences file
-'slice.csv' with a text editor or a spreadsheet program set to separate tabs.
-
-
-> python slice.py
-This brings up the dialog, after clicking 'Slice', the following is printed:
-File Screw Holder Bottom.stl is being sliced.
-The sliced file is saved as Screw Holder Bottom_slice.gcode
-
-
->python
-Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
-[GCC 4.2.1 (SUSE Linux)] on linux2
-Type "help", "copyright", "credits" or "license" for more information.
->>> import slice
->>> slice.main()
-File Screw Holder Bottom.stl is being sliced.
-The sliced file is saved as Screw Holder Bottom_slice.gcode
-It took 3 seconds to slice the file.
-
-
->>> slice.writeOutput()
-File Screw Holder Bottom.gcode is being sliced.
-The sliced file is saved as Screw Holder Bottom_slice.gcode
-It took 3 seconds to slice the file.
-
-
->>> slice.getSliceGcode("
-54 162 108 Number of Vertices,Number of Edges,Number of Faces
--5.800000000000001 5.341893939393939 4.017841892579603 Vertex Coordinates XYZ
-5.800000000000001 5.341893939393939 4.017841892579603
-..
-many lines of GNU Triangulated Surface vertices, edges and faces
-..
-")
-
-"""
-
-from __future__ import absolute_import
-try:
- import psyco
- psyco.full()
-except:
- pass
-#Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
-import __init__
-
-from skeinforge_tools.skeinforge_utilities import euclidean
-from skeinforge_tools.skeinforge_utilities import gcodec
-from skeinforge_tools.skeinforge_utilities import intercircle
-from skeinforge_tools.skeinforge_utilities import preferences
-from skeinforge_tools.skeinforge_utilities import triangle_mesh
-from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
-from skeinforge_tools import polyfile
-import cmath
-import cStringIO
-import math
-import os
-import sys
-import time
-
-
-__author__ = "Enrique Perez (perez_enrique@yahoo.com)"
-__date__ = "$Date: 2008/02/05 $"
-__license__ = "GPL 3.0"
-
-def addAlreadyFilledArounds( alreadyFilledArounds, loop, radius ):
- "Add already filled loops around loop to alreadyFilledArounds."
- alreadyFilledLoop = []
- slightlyGreaterThanRadius = 1.01 * radius
- muchGreaterThanRadius = 2.5 * radius
- circleNodes = intercircle.getCircleNodesFromLoop( loop, slightlyGreaterThanRadius )
- centers = intercircle.getCentersFromCircleNodes( circleNodes )
- for center in centers:
- alreadyFilledInset = intercircle.getSimplifiedInsetFromClockwiseLoop( center, radius )
- if euclidean.getMaximumSpan( alreadyFilledInset ) > muchGreaterThanRadius or euclidean.isWiddershins( alreadyFilledInset ):
- alreadyFilledLoop.append( alreadyFilledInset )
- if len( alreadyFilledLoop ) > 0:
- alreadyFilledArounds.append( alreadyFilledLoop )
-
-def addEdgePair( edgePairTable, edges, faceEdgeIndex, remainingEdgeIndex, remainingEdgeTable ):
- "Add edge pair to the edge pair table."
- if faceEdgeIndex == remainingEdgeIndex:
- return
- if not faceEdgeIndex in remainingEdgeTable:
- return
- edgePair = triangle_mesh.EdgePair().getFromIndexesEdges( [ remainingEdgeIndex, faceEdgeIndex ], edges )
- edgePairTable[ str( edgePair ) ] = edgePair
-
-def addLoopToPointTable( loop, pointTable ):
- "Add the points in the loop to the point table."
- for point in loop:
- pointTable[ point ] = loop
-
-def addPointsAtZ( edgePair, points, radius, vertices, z ):
- "Add point complexes on the segment between the edge intersections with z."
- sliceIntersectionFirst = getSliceIntersectionFromEdge( edgePair.edges[ 0 ], vertices, z )
- sliceIntersectionSecond = getSliceIntersectionFromEdge( edgePair.edges[ 1 ], vertices, z )
- intercircle.addPointsFromSegment( points, radius, sliceIntersectionFirst, sliceIntersectionSecond, 0.3 )
-
-def addSegmentOutline( isThick, outlines, pointBegin, pointEnd, width ):
- "Add a diamond or hexagonal outline for a line segment."
- exclusionWidth = 0.6 * width
- slope = 0.3
- if isThick:
- slope = 3.0
- exclusionWidth = 0.8 * width
- segment = pointEnd - pointBegin
- segmentLength = abs( segment )
- if segmentLength == 0.0:
- return
- normalizedSegment = segment / segmentLength
- outline = []
- segmentYMirror = complex( normalizedSegment.real, - normalizedSegment.imag )
- pointBeginRotated = segmentYMirror * pointBegin
- pointEndRotated = segmentYMirror * pointEnd
- along = 0.01
- alongLength = along * segmentLength
- if alongLength > 0.1 * exclusionWidth:
- along *= 0.1 * exclusionWidth / alongLength
- alongEnd = 1.0 - along
- remainingToHalf = 0.5 - along
- alongToWidth = exclusionWidth / slope / segmentLength
- pointBeginIntermediate = euclidean.getIntermediateLocation( along, pointBeginRotated, pointEndRotated )
- pointEndIntermediate = euclidean.getIntermediateLocation( alongEnd, pointBeginRotated, pointEndRotated )
- outline.append( pointBeginIntermediate )
- verticalWidth = complex( 0.0, exclusionWidth )
- if alongToWidth > 0.9 * remainingToHalf:
- verticalWidth = complex( 0.0, slope * remainingToHalf )
- middle = ( pointBeginIntermediate + pointEndIntermediate ) * 0.5
- middleDown = middle - verticalWidth
- middleUp = middle + verticalWidth
- outline.append( middleUp )
- outline.append( pointEndIntermediate )
- outline.append( middleDown )
- else:
- alongOutsideBegin = along + alongToWidth
- alongOutsideEnd = alongEnd - alongToWidth
- outsideBeginCenter = euclidean.getIntermediateLocation( alongOutsideBegin, pointBeginRotated, pointEndRotated )
- outsideBeginCenterDown = outsideBeginCenter - verticalWidth
- outsideBeginCenterUp = outsideBeginCenter + verticalWidth
- outsideEndCenter = euclidean.getIntermediateLocation( alongOutsideEnd, pointBeginRotated, pointEndRotated )
- outsideEndCenterDown = outsideEndCenter - verticalWidth
- outsideEndCenterUp = outsideEndCenter + verticalWidth
- outline.append( outsideBeginCenterUp )
- outline.append( outsideEndCenterUp )
- outline.append( pointEndIntermediate )
- outline.append( outsideEndCenterDown )
- outline.append( outsideBeginCenterDown )
- outlines.append( euclidean.getPointsRoundZAxis( normalizedSegment, outline ) )
-
-def addWithLeastLength( loops, point, shortestAdditionalLength ):
- "Insert a point into a loop, at the index at which the loop would be shortest."
- shortestLoop = None
- shortestPointIndex = None
- for loop in loops:
- if len( loop ) > 2:
- for pointIndex in xrange( len( loop ) ):
- additionalLength = getAdditionalLoopLength( loop, point, pointIndex )
- if additionalLength < shortestAdditionalLength:
- shortestAdditionalLength = additionalLength
- shortestLoop = loop
- shortestPointIndex = pointIndex
- if shortestPointIndex != None:
- afterCenterComplex = shortestLoop[ shortestPointIndex ]
- afterEndComplex = shortestLoop[ ( shortestPointIndex + 1 ) % len( shortestLoop ) ]
- isInlineAfter = isInline( point, afterCenterComplex, afterEndComplex )
- beforeCenterComplex = shortestLoop[ ( shortestPointIndex + len( shortestLoop ) - 1 ) % len( shortestLoop ) ]
- beforeEndComplex = shortestLoop[ ( shortestPointIndex + len( shortestLoop ) - 2 ) % len( shortestLoop ) ]
- isInlineBefore = isInline( point, beforeCenterComplex, beforeEndComplex )
- if isInlineAfter or isInlineBefore:
- shortestLoop.insert( shortestPointIndex, point )
-
-def compareArea( loopArea, otherLoopArea ):
- "Get comparison in order to sort loop areas in descending order of area."
- if loopArea.area < otherLoopArea.area:
- return 1
- if loopArea.area > otherLoopArea.area:
- return - 1
- return 0
-
-def getAdditionalLoopLength( loop, point, pointIndex ):
- "Get the additional length added by inserting a point into a loop."
- afterPoint = loop[ pointIndex ]
- beforePoint = loop[ ( pointIndex + len( loop ) - 1 ) % len( loop ) ]
- return abs( point - beforePoint ) + abs( point - afterPoint ) - abs( afterPoint - beforePoint )
-
-def getCommonVertexIndex( edgeFirst, edgeSecond ):
- "Get the vertex index that both edges have in common."
- for edgeFirstVertexIndex in edgeFirst.vertexIndexes:
- if edgeFirstVertexIndex == edgeSecond.vertexIndexes[ 0 ] or edgeFirstVertexIndex == edgeSecond.vertexIndexes[ 1 ]:
- return edgeFirstVertexIndex
- print( "Inconsistent GNU Triangulated Surface" )
- print( edgeFirst )
- print( edgeSecond )
- return 0
-
-def getDoubledRoundZ( overhangingSegment, segmentRoundZ ):
- "Get doubled plane angle around z of the overhanging segment."
- endpoint = overhangingSegment[ 0 ]
- roundZ = endpoint.point - endpoint.otherEndpoint.point
- roundZ *= segmentRoundZ
- if abs( roundZ ) == 0.0:
- return complex()
- if roundZ.real < 0.0:
- roundZ *= - 1.0
- roundZLength = abs( roundZ )
- return roundZ * roundZ / roundZLength
-
-def getLoopsFromCorrectMesh( edges, faces, vertices, z ):
- "Get loops from a slice of a correct mesh."
- remainingEdgeTable = getRemainingEdgeTable( edges, vertices, z )
- remainingValues = remainingEdgeTable.values()
- for edge in remainingValues:
- if len( edge.faceIndexes ) < 2:
- print( 'This should never happen, there is a hole in the triangle mesh, each edge should have two faces.' )
- print( edge )
- print( "Something will still be printed, but there is no guarantee that it will be the correct shape." )
- print( 'Once the gcode is saved, you should check over the layer with a z of:' )
- print( z )
- return []
- loops = []
- while isPathAdded( edges, faces, loops, remainingEdgeTable, vertices, z ):
- pass
- return loops
-# untouchables = []
-# for boundingLoop in boundingLoops:
-# if not boundingLoop.isIntersectingList( untouchables ):
-# untouchables.append( boundingLoop )
-# if len( untouchables ) < len( boundingLoops ):
-# print( 'This should never happen, the slice layer intersects itself. Something will still be printed, but there is no guarantee that it will be the correct shape.' )
-# print( 'Once the gcode is saved, you should check over the layer with a z of:' )
-# print( z )
-# remainingLoops = []
-# for untouchable in untouchables:
-# remainingLoops.append( untouchable.loop )
-# return remainingLoops
-
-def getLoopsFromUnprovenMesh( edges, extrusionWidth, faces, vertices, slicePreferences, z ):
- "Get loops from a slice of an unproven mesh."
- edgePairTable = {}
- importRadius = slicePreferences.importCoarseness.value * extrusionWidth
- points = []
- pointTable = {}
- remainingEdgeTable = getRemainingEdgeTable( edges, vertices, z )
- remainingEdgeTableKeys = remainingEdgeTable.keys()
- for remainingEdgeIndexKey in remainingEdgeTable:
- edge = remainingEdgeTable[ remainingEdgeIndexKey ]
- sliceIntersection = getSliceIntersectionFromEdge( edge, vertices, z )
- points.append( sliceIntersection )
- for edgeFaceIndex in edge.faceIndexes:
- face = faces[ edgeFaceIndex ]
- for edgeIndex in face.edgeIndexes:
- addEdgePair( edgePairTable, edges, edgeIndex, remainingEdgeIndexKey, remainingEdgeTable )
- onlyPoints = points[ : ]
- for edgePairValue in edgePairTable.values():
- addPointsAtZ( edgePairValue, points, importRadius, vertices, z )
- circleNodes = intercircle.getCircleNodesFromPoints( points, importRadius )
- centers = intercircle.getCentersFromCircleNodes( circleNodes )
- loops = intercircle.getLoopsFromLoopsDirection( True, centers )
- for loop in loops:
- addLoopToPointTable( loop, pointTable )
- clockwiseLoops = getLoopsInDescendingOrderOfArea( intercircle.getLoopsFromLoopsDirection( False, centers ) )
- clockwiseLoops.reverse()
- for clockwiseLoop in clockwiseLoops:
- if len( clockwiseLoop ) > 2 and euclidean.getMaximumSpan( clockwiseLoop ) > 2.5 * importRadius:
- if getOverlapRatio( clockwiseLoop, pointTable ) < 0.45:
- loops.append( clockwiseLoop )
- addLoopToPointTable( clockwiseLoop, pointTable )
- shortestAdditionalLength = 0.85 * importRadius
- for onlyPoint in onlyPoints:
- if onlyPoint not in pointTable:
- addWithLeastLength( loops, onlyPoint, shortestAdditionalLength )
- return loops
-
-def getLoopsInDescendingOrderOfArea( loops ):
- "Get the lowest zone index."
- loopAreas = []
- for loop in loops:
- loopArea = LoopArea( loop )
- loopAreas.append( loopArea )
- loopAreas.sort( compareArea )
- loopsInDescendingOrderOfArea = []
- for loopArea in loopAreas:
- loopsInDescendingOrderOfArea.append( loopArea.loop )
- return loopsInDescendingOrderOfArea
-
-def getLowestZoneIndex( zoneArray, z ):
- "Get the lowest zone index."
- lowestZoneIndex = 0
- lowestZone = 99999999.0
- for zoneIndex in xrange( len( zoneArray ) ):
- zone = zoneArray[ zoneIndex ]
- if zone < lowestZone:
- lowestZone = zone
- lowestZoneIndex = zoneIndex
- return lowestZoneIndex
-
-def getNextEdgeIndexAroundZ( edge, faces, remainingEdgeTable ):
- "Get the next edge index in the mesh slice."
- for faceIndex in edge.faceIndexes:
- face = faces[ faceIndex ]
- for edgeIndex in face.edgeIndexes:
- if edgeIndex in remainingEdgeTable:
- return edgeIndex
- return - 1
-
-def getOverhangDirection( belowOutsetLoops, segmentBegin, segmentEnd ):
- "Add to span direction from the endpoint segments which overhang the layer below."
- segment = segmentEnd - segmentBegin
- normalizedSegment = euclidean.getNormalized( complex( segment.real, segment.imag ) )
- segmentYMirror = complex( normalizedSegment.real, - normalizedSegment.imag )
- segmentBegin = segmentYMirror * segmentBegin
- segmentEnd = segmentYMirror * segmentEnd
- solidXIntersectionList = []
- y = segmentBegin.imag
- solidXIntersectionList.append( euclidean.XIntersectionIndex( - 1.0, segmentBegin.real ) )
- solidXIntersectionList.append( euclidean.XIntersectionIndex( - 1.0, segmentEnd.real ) )
- for belowLoopIndex in xrange( len( belowOutsetLoops ) ):
- belowLoop = belowOutsetLoops[ belowLoopIndex ]
- rotatedOutset = euclidean.getPointsRoundZAxis( segmentYMirror, belowLoop )
- euclidean.addXIntersectionIndexes( rotatedOutset, belowLoopIndex, solidXIntersectionList, y )
- overhangingSegments = euclidean.getSegmentsFromXIntersectionIndexes( solidXIntersectionList, y )
- overhangDirection = complex()
- for overhangingSegment in overhangingSegments:
- overhangDirection += getDoubledRoundZ( overhangingSegment, normalizedSegment )
- return overhangDirection
-
-def getOverlapRatio( loop, pointTable ):
- "Get the overlap ratio between the loop and the point table."
- numberOfOverlaps = 0
- for point in loop:
- if point in pointTable:
- numberOfOverlaps += 1
- return float( numberOfOverlaps ) / float( len( loop ) )
-
-def getPath( edges, pathIndexes, loop, z ):
- "Get the path from the edge intersections."
- path = []
- for pathIndexIndex in xrange( len( pathIndexes ) ):
- pathIndex = pathIndexes[ pathIndexIndex ]
- edge = edges[ pathIndex ]
- sliceIntersection = getSliceIntersectionFromEdge( edge, loop, z )
- path.append( sliceIntersection )
- return path
-
-def getRemainingEdgeTable( edges, vertices, z ):
- "Get the remaining edge hashtable."
- remainingEdgeTable = {}
- for edgeIndex in xrange( len( edges ) ):
- edge = edges[ edgeIndex ]
- if isZInEdge( edge, vertices, z ):
- remainingEdgeTable[ edgeIndex ] = edge
- return remainingEdgeTable
-
-def getSegmentsFromPoints( aroundLists, loopLists, pointBegin, pointEnd ):
- "Get endpoint segments from the beginning and end of a line segment."
- normalizedSegment = pointEnd - pointBegin
- normalizedSegmentLength = abs( normalizedSegment )
- if normalizedSegmentLength == 0.0:
- return
- normalizedSegment /= normalizedSegmentLength
- segmentYMirror = complex( normalizedSegment.real, - normalizedSegment.imag )
- pointBeginRotated = segmentYMirror * pointBegin
- pointEndRotated = segmentYMirror * pointEnd
- rotatedLoopLists = []
- for loopList in loopLists:
- rotatedLoopList = []
- rotatedLoopLists.append( rotatedLoopList )
- for loop in loopList:
- rotatedLoop = euclidean.getPointsRoundZAxis( segmentYMirror, loop )
- rotatedLoopList.append( rotatedLoop )
- xIntersectionIndexList = []
- xIntersectionIndexList.append( euclidean.XIntersectionIndex( - 1, pointBeginRotated.real ) )
- xIntersectionIndexList.append( euclidean.XIntersectionIndex( - 1, pointEndRotated.real ) )
- euclidean.addXIntersectionIndexesFromLoopLists( rotatedLoopLists, xIntersectionIndexList, pointBeginRotated.imag )
- segments = euclidean.getSegmentsFromXIntersectionIndexes( xIntersectionIndexList, pointBeginRotated.imag )
- insideSegments = []
- for segment in segments:
- endpointBegin = segment[ 0 ]
- endpointBegin.point = normalizedSegment * endpointBegin.point
- endpointEnd = segment[ 1 ]
- endpointEnd.point = normalizedSegment * endpointEnd.point
- if len( aroundLists ) < 1:
- insideSegments.append( segment )
- elif isSegmentInsideAround( aroundLists, segment ):
- insideSegments.append( segment )
- return insideSegments
-
-def getSharedFace( firstEdge, faces, secondEdge ):
- "Get the face which is shared by two edges."
- for firstEdgeFaceIndex in firstEdge.faceIndexes:
- for secondEdgeFaceIndex in secondEdge.faceIndexes:
- if firstEdgeFaceIndex == secondEdgeFaceIndex:
- return faces[ firstEdgeFaceIndex ]
- return None
-
-def getSliceGcode( filename, slicePreferences = None ):
- "Slice a shape file."
- triangleMesh = None
- if filename[ - 4 : ].lower() == '.gts':
- triangleMesh = triangle_mesh.TriangleMesh().getFromGNUTriangulatedSurfaceText( gcodec.getFileText( filename ) )
- else:
- triangleMesh = import_translator.getTriangleMesh( filename )
- if triangleMesh == None:
- return ''
- if slicePreferences == None:
- slicePreferences = SlicePreferences()
- preferences.readPreferences( slicePreferences )
- skein = SliceSkein()
- skein.parseTriangleMesh( slicePreferences, triangleMesh )
- return skein.output.getvalue()
-
-def getSliceIntersectionFromEdge( edge, vertices, z ):
- "Get the complex where the slice intersects the edge."
- firstVertex = vertices[ edge.vertexIndexes[ 0 ] ]
- firstVertexComplex = firstVertex.dropAxis( 2 )
- secondVertex = vertices[ edge.vertexIndexes[ 1 ] ]
- secondVertexComplex = secondVertex.dropAxis( 2 )
- zMinusFirst = z - firstVertex.z
- up = secondVertex.z - firstVertex.z
- return zMinusFirst * ( secondVertexComplex - firstVertexComplex ) / up + firstVertexComplex
-
-def isCloseToLast( paths, point, radius ):
- "Determine if the point is close to the last point of the last path."
- if len( paths ) < 1:
- return False
- lastPath = paths[ - 1 ]
- return abs( lastPath[ - 1 ] - point ) < radius
-
-def isInline( beginComplex, centerComplex, endComplex ):
- "Determine if the three complex points form a line."
- centerBeginComplex = beginComplex - centerComplex
- centerEndComplex = endComplex - centerComplex
- centerBeginLength = abs( centerBeginComplex )
- centerEndLength = abs( centerEndComplex )
- if centerBeginLength <= 0.0 or centerEndLength <= 0.0:
- return False
- centerBeginComplex /= centerBeginLength
- centerEndComplex /= centerEndLength
- return euclidean.getDotProduct( centerBeginComplex, centerEndComplex ) < - 0.999
-
-def isIntersectingWithinList( loop, loopList ):
- "Determine if the loop is intersecting or is within the loop list."
- if euclidean.isLoopIntersectingLoops( loop, loopList ):
- return True
- totalNumberOfIntersections = 0
- for otherLoop in loopList:
- leftPoint = euclidean.getLeftPoint( otherLoop )
- totalNumberOfIntersections += euclidean.getNumberOfIntersectionsToLeft( leftPoint, loop )
- return totalNumberOfIntersections % 2 == 1
-
-def isIntersectingWithinLists( loop, loopLists ):
- "Determine if the loop is intersecting or is within the loop lists."
- for loopList in loopLists:
- if isIntersectingWithinList( loop, loopList ):
- return True
- return False
-
-def isIntersectingItself( loop, width ):
- "Determine if the loop is intersecting itself."
- outlines = []
- for pointIndex in xrange( len( loop ) ):
- pointBegin = loop[ pointIndex ]
- pointEnd = loop[ ( pointIndex + 1 ) % len( loop ) ]
- if euclidean.isLineIntersectingLoops( outlines, pointBegin, pointEnd ):
- return True
- addSegmentOutline( False, outlines, pointBegin, pointEnd, width )
- return False
-
-def isPathAdded( edges, faces, loops, remainingEdgeTable, vertices, z ):
- "Get the path indexes around a triangle mesh slice and add the path to the flat loops."
- if len( remainingEdgeTable ) < 1:
- return False
- pathIndexes = []
- remainingEdgeIndexKey = remainingEdgeTable.keys()[ 0 ]
- pathIndexes.append( remainingEdgeIndexKey )
- del remainingEdgeTable[ remainingEdgeIndexKey ]
- nextEdgeIndexAroundZ = getNextEdgeIndexAroundZ( edges[ remainingEdgeIndexKey ], faces, remainingEdgeTable )
- while nextEdgeIndexAroundZ != - 1:
- pathIndexes.append( nextEdgeIndexAroundZ )
- del remainingEdgeTable[ nextEdgeIndexAroundZ ]
- nextEdgeIndexAroundZ = getNextEdgeIndexAroundZ( edges[ nextEdgeIndexAroundZ ], faces, remainingEdgeTable )
- if len( pathIndexes ) < 3:
- print( "Dangling edges, will use intersecting circles to get import layer at height " + z.toString() )
- del loops[ : ]
- return False
- loops.append( getPath( edges, pathIndexes, vertices, z ) )
- return True
-
-def isSegmentInsideAround( aroundLists, segment ):
- "Determine if the segment is inside an around."
- midpoint = 0.5 * ( segment[ 0 ].point + segment[ 1 ].point )
- for aroundList in aroundLists:
- for around in aroundList:
- if euclidean.isPointInsideLoop( around, midpoint ):
- return True
- return False
-
-def isZInEdge( edge, vertices, z ):
- "Determine if z is inside the edge."
- vertex1ZHigher = vertices[ edge.vertexIndexes[ 0 ] ].z > z
- vertex2ZHigher = vertices[ edge.vertexIndexes[ 1 ] ].z > z
- return vertex1ZHigher != vertex2ZHigher
-
-def writeOutput( filename = '' ):
- "Slice a GNU Triangulated Surface file. If no filename is specified, slice the first GNU Triangulated Surface file in this folder."
- if filename == '':
- unmodified = gcodec.getFilesWithFileTypesWithoutWords( import_translator.getGNUTranslatorFileTypes() )
- if len( unmodified ) == 0:
- print( "There are no GNU Triangulated Surface files in this folder." )
- return
- filename = unmodified[ 0 ]
- startTime = time.time()
- slicePreferences = SlicePreferences()
- preferences.readPreferences( slicePreferences )
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being sliced.' )
- sliceGcode = getSliceGcode( filename, slicePreferences )
- if sliceGcode == '':
- return
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_slice.gcode'
- gcodec.writeFileText( suffixFilename, sliceGcode )
- print( 'The sliced file is saved as ' + gcodec.getSummarizedFilename( suffixFilename ) )
- analyze.writeOutput( suffixFilename, sliceGcode )
- print( 'It took ' + str( int( round( time.time() - startTime ) ) ) + ' seconds to slice the file.' )
-
-
-class LoopArea:
- "Complex loop with an area."
- def __init__( self, loop ):
- self.area = abs( euclidean.getPolygonArea( loop ) )
- self.loop = loop
-
- def __repr__( self ):
- "Get the string representation of this flat path."
- return '%s, %s' % ( self.area, self.loop )
-
-
-class SlicePreferences:
- "A class to handle the slice preferences."
- def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
- #Set the default preferences.
- self.archive = []
- self.extrusionDiameter = preferences.FloatPreference().getFromValue( 'Extrusion Diameter (mm):', 0.5 )
- self.archive.append( self.extrusionDiameter )
- self.extrusionDiameterOverPrecision = preferences.FloatPreference().getFromValue( 'Extrusion Diameter Over Precision (ratio):', 10.0 )
- self.archive.append( self.extrusionDiameterOverPrecision )
- self.extrusionHeightOverDiameter = preferences.FloatPreference().getFromValue( 'Extrusion Height Over Diameter (ratio):', 0.8 )
- self.archive.append( self.extrusionHeightOverDiameter )
- self.extrusionPerimeterWidthOverDiameter = preferences.FloatPreference().getFromValue( 'Extrusion Perimeter Width Over Diameter (ratio):', 1.44 )
- self.archive.append( self.extrusionPerimeterWidthOverDiameter )
- self.extrusionWidthOverDiameter = preferences.FloatPreference().getFromValue( 'Extrusion Width Over Diameter (ratio):', 1.2 )
- self.archive.append( self.extrusionWidthOverDiameter )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorFileTypeTuples(), 'Open File to be Sliced', '' )
- self.archive.append( self.filenameInput )
- self.importCoarseness = preferences.FloatPreference().getFromValue( 'Import Coarseness (ratio):', 1.0 )
- self.archive.append( self.importCoarseness )
- self.meshTypeLabel = preferences.LabelDisplay().getFromName( 'Mesh Type: ' )
- self.archive.append( self.meshTypeLabel )
- importRadio = []
- self.correct = preferences.Radio().getFromRadio( 'Correct Mesh', importRadio, True )
- self.archive.append( self.correct )
- self.unproven = preferences.Radio().getFromRadio( 'Unproven Mesh', importRadio, False )
- self.archive.append( self.unproven )
- self.infillBridgeWidthOverDiameter = preferences.FloatPreference().getFromValue( 'Infill Bridge Width Over Thickness (ratio):', 1.2 )
- self.archive.append( self.infillBridgeWidthOverDiameter )
- self.infillDirectionBridge = preferences.BooleanPreference().getFromValue( 'Infill in Direction of Bridges', True )
- self.archive.append( self.infillDirectionBridge )
- self.infillPerimeterOverlap = preferences.FloatPreference().getFromValue( 'Infill Perimeter Overlap (ratio):', 0.05 )
- self.archive.append( self.infillPerimeterOverlap )
- self.infillPerimeterOverlapMethodOfCalculationLabel = preferences.LabelDisplay().getFromName( 'Infill Perimeter Overlap Method of Calculation: ' )
- self.archive.append( self.infillPerimeterOverlapMethodOfCalculationLabel )
- infillRadio = []
- self.perimeterInfillPreference = preferences.Radio().getFromRadio( 'Calculate Overlap from Perimeter and Infill', infillRadio, True )
- self.archive.append( self.perimeterInfillPreference )
- self.perimeterPreference = preferences.Radio().getFromRadio( 'Calculate Overlap from Perimeter Only', infillRadio, False )
- self.archive.append( self.perimeterPreference )
- self.startAtHome = preferences.BooleanPreference().getFromValue( 'Start at Home', True )
- self.archive.append( self.startAtHome )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
- self.executeTitle = 'Slice'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'slice_shape.csv' )
- self.filenameHelp = 'skeinforge_tools.slice_shape.html'
- self.saveTitle = 'Save Preferences'
- self.title = 'Slice Preferences'
-
- def execute( self ):
- "Slice button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypes( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
-
-
-class SliceSkein:
- "A class to slice a GNU Triangulated Surface."
- def __init__( self ):
- self.belowLoops = None
- self.output = cStringIO.StringIO()
-
- def addFromFile( self, filename ):
- "Add lines of text from the filename."
- fileLines = gcodec.getTextLines( gcodec.getFileText( filename ) )
- for line in fileLines:
- self.addLine( line )
-
- def addFromUpperLowerFile( self, filename ):
- "Add lines of text from the filename or the lowercase filename, if there is no file by the original filename in the directory."
- directory = os.listdir( os.getcwd() )
- if filename in directory:
- self.addFromFile( filename )
- return
- lowerFilename = filename.lower()
- if lowerFilename in directory:
- self.addFromFile( lowerFilename )
- return
- gcodeDirectoryPath = os.path.join( preferences.getPreferencesDirectoryPath(), 'gcode_scripts' )
- try:
- os.mkdir( gcodeDirectoryPath )
- except OSError:
- pass
- directory = os.listdir( gcodeDirectoryPath )
- if filename in directory:
- self.addFromFile( os.path.join( gcodeDirectoryPath, filename ) )
- return
- if lowerFilename in directory:
- self.addFromFile( os.path.join( gcodeDirectoryPath, filename.lower() ) )
-
- def addGcodeFromPerimeterPaths( self, isIntersectingSelf, loop, loopLists, radius, z ):
- "Add the perimeter paths to the output."
- segments = []
- outlines = []
- thickOutlines = []
- allLoopLists = loopLists[ : ] + [ thickOutlines ]
- for pointIndex in xrange( len( loop ) ):
- pointBegin = loop[ pointIndex ]
- pointEnd = loop[ ( pointIndex + 1 ) % len( loop ) ]
- if isIntersectingSelf:
- if euclidean.isLineIntersectingLoops( outlines, pointBegin, pointEnd ):
- segments += getSegmentsFromPoints( loopLists, allLoopLists, pointBegin, pointEnd )
- else:
- segments += getSegmentsFromPoints( loopLists, loopLists, pointBegin, pointEnd )
- addSegmentOutline( False, outlines, pointBegin, pointEnd, self.extrusionWidth )
- addSegmentOutline( True, thickOutlines, pointBegin, pointEnd, self.extrusionWidth )
- else:
- segments += getSegmentsFromPoints( loopLists, loopLists, pointBegin, pointEnd )
- perimeterPaths = []
- path = []
- muchSmallerThanRadius = 0.1 * radius
- for segment in segments:
- pointBegin = segment[ 0 ].point
- if not isCloseToLast( perimeterPaths, pointBegin, muchSmallerThanRadius ):
- path = [ pointBegin ]
- perimeterPaths.append( path )
- path.append( segment[ 1 ].point )
- if len( perimeterPaths ) > 1:
- firstPath = perimeterPaths[ 0 ]
- lastPath = perimeterPaths[ - 1 ]
- if abs( lastPath[ - 1 ] - firstPath[ 0 ] ) < 0.1 * muchSmallerThanRadius:
- connectedBeginning = lastPath[ : - 1 ] + firstPath
- perimeterPaths[ 0 ] = connectedBeginning
- perimeterPaths.remove( lastPath )
- for perimeterPath in perimeterPaths:
- self.addGcodeFromThreadZ( perimeterPath, z )
-
- def addGcodeFromRemainingLoop( self, loop, loopLists, radius, z ):
- "Add the remainder of the loop which does not overlap the alreadyFilledArounds loops."
- euclidean.addSurroundingLoopBeginning( loop, self, z )
- isIntersectingSelf = isIntersectingItself( loop, self.extrusionWidth )
- if isIntersectingWithinLists( loop, loopLists ) or isIntersectingSelf:
- self.addGcodeFromPerimeterPaths( isIntersectingSelf, loop, loopLists, radius, z )
- else:
- self.addLine( '(<perimeter> )' ) # Indicate that a perimeter is beginning.
- self.addGcodeFromThreadZ( loop + [ loop[ 0 ] ], z )
- self.addLine( '(</surroundingLoop> )' )
-
- def addGcodeFromThreadZ( self, thread, z ):
- "Add a thread to the output."
- if len( thread ) > 0:
- self.addGcodeMovementZ( thread[ 0 ], z )
- else:
- print( "zero length vertex positions array which was skipped over, this should never happen" )
- if len( thread ) < 2:
- return
- self.addLine( "M101" ) # Turn extruder on.
- for point in thread[ 1 : ]:
- self.addGcodeMovementZ( point, z )
- self.addLine( "M103" ) # Turn extruder off.
-
- def addGcodeMovementZ( self, point, z ):
- "Add a movement to the output."
- self.addLine( "G1 X%s Y%s Z%s" % ( self.getRounded( point.real ), self.getRounded( point.imag ), self.getRounded( z ) ) )
-
- def addInitializationToOutput( self ):
- "Add initialization gcode to the output."
- # From http://www.ahha.com/VarsAndMacros.doc
- # If you wish to run macros using comments in parentheses, the comment character must be changed from a semi-colon to a left parenthesis.
- # Note: the original closing single quotation mark was not ascii, so I replaced it with an apostrophe.
- # To do this, the following line should be placed at the beginning of the G-Code file that calls the macro:
-# self.addLine( "(*CMST '('*)" ) # Gcode to convert the comment character to '('.
- self.addFromUpperLowerFile( 'Start.txt' ) # Add a start file if it exists.
- self.addLine( '(<creator> skeinforge May 28, 2008 )' ) # GCode formatted comment
- self.addLine( 'M110' ) # GCode for compatibility with Nophead's code.
- self.addLine( '(<extruderInitialization> )' ) # GCode formatted comment
- self.addLine( 'G21' ) # Set units to mm.
- self.addLine( 'G90' ) # Set positioning to absolute.
- if self.slicePreferences.startAtHome.value:
- self.addLine( 'G28' ) # Start at home.
- self.addLine( 'M103' ) # Turn extruder off.
- self.addLine( 'M105' ) # Custom code for temperature reading.
- self.addFromUpperLowerFile( 'EndOfTheBeginning.txt' ) # Add a second start file if it exists.
- self.addLine( '(<decimalPlacesCarried> ' + str( self.decimalPlacesCarried ) + ' )' ) # Set decimal places carried.
- self.addLine( '(<extrusionDiameter> ' + self.getRounded( self.extrusionDiameter ) + ' )' ) # Set extrusion diameter.
- self.addLine( '(<extrusionHeight> ' + self.getRounded( self.extrusionHeight ) + ' )' ) # Set layer thickness.
- self.addLine( '(<extrusionPerimeterWidth> ' + self.getRounded( self.extrusionPerimeterWidth ) + ' )' ) # Set extrusion perimeter width.
- self.addLine( '(<extrusionWidth> ' + self.getRounded( self.extrusionWidth ) + ' )' ) # Set extrusion width.
- self.addLine( '(<fillInset> ' + str( self.fillInset ) + ' )' ) # Set fill inset.
- # Set bridge extrusion width over solid extrusion width.
- self.addLine( '(<bridgeExtrusionWidthOverSolid> ' + euclidean.getRoundedToThreePlaces( self.bridgeExtrusionWidth / self.extrusionWidth ) + ' )' )
- self.addLine( '(<procedureDone> slice_shape )' ) # The skein has been sliced.
- self.addLine( '(<extrusionStart> )' ) # Initialization is finished, extrusion is starting.
- circleArea = self.extrusionDiameter * self.extrusionDiameter * math.pi / 4.0
- print( 'The extrusion fill density ratio is ' + euclidean.getRoundedToThreePlaces( circleArea / self.extrusionWidth / self.extrusionHeight ) )
-
- def addLine( self, line ):
- "Add a line of text and a newline to the output."
- self.output.write( line + "\n" )
-
- def addShutdownToOutput( self ):
- "Add shutdown gcode to the output."
- self.addLine( '(</extrusionStart> )' ) # GCode formatted comment
- self.addLine( 'M103' ) # Turn extruder motor off.
- self.addLine( 'M104 S0' ) # Turn extruder heater off.
-# self.addLine( 'M30' ) # End gcode program.
- self.addFromUpperLowerFile( 'End.txt' ) # Add an end file if it exists.
-
- def addToZoneArray( self, point, zoneArray, z ):
- "Add a height to the zone array."
- zoneLayer = int( round( ( point.z - z ) / self.zZoneInterval ) )
- zoneAround = 2 * int( abs( zoneLayer ) )
- if zoneLayer < 0:
- zoneAround -= 1
- if zoneAround < len( zoneArray ):
- zoneArray[ zoneAround ] += 1
-
- def getBridgeDirection( self, layerLoops ):
- "Get span direction for the majority of the overhanging extrusion perimeter, if any."
- if not self.slicePreferences.infillDirectionBridge.value:
- return None
- if self.belowLoops == None:
- return None
- belowOutsetLoops = []
- overhangInset = 1.25 * self.extrusionPerimeterWidth
- slightlyGreaterThanOverhang = 1.1 * overhangInset
- muchGreaterThanOverhang = 2.5 * overhangInset
- for loop in self.belowLoops:
- centers = intercircle.getCentersFromLoopDirection( True, loop, slightlyGreaterThanOverhang )
- for center in centers:
- outset = intercircle.getSimplifiedInsetFromClockwiseLoop( center, overhangInset )
- if euclidean.isLargeSameDirection( outset, center, muchGreaterThanOverhang ):
- belowOutsetLoops.append( outset )
- bridgeDirection = complex()
- for loop in layerLoops:
- for pointIndex in xrange( len( loop ) ):
- previousIndex = ( pointIndex + len( loop ) - 1 ) % len( loop )
- bridgeDirection += getOverhangDirection( belowOutsetLoops, loop[ previousIndex ], loop[ pointIndex ] )
- if abs( bridgeDirection ) < self.halfExtrusionPerimeterWidth:
- return None
- else:
- bridgeDirection /= abs( bridgeDirection )
- return cmath.sqrt( bridgeDirection )
-
- def getExtrudateLoops( self, halfWidth, loop ):
- "Get the inset extrudate loops from the loop."
- slightlyGreaterThanHalfWidth = 1.1 * halfWidth
- muchGreaterThanHalfWIdth = 2.5 * halfWidth
- extrudateLoops = []
- circleNodes = intercircle.getCircleNodesFromLoop( loop, slightlyGreaterThanHalfWidth )
- centers = intercircle.getCentersFromCircleNodes( circleNodes )
- for center in centers:
- extrudateLoop = intercircle.getSimplifiedInsetFromClockwiseLoop( center, halfWidth )
- if euclidean.isLargeSameDirection( extrudateLoop, center, muchGreaterThanHalfWIdth ):
- if euclidean.isPathInsideLoop( loop, extrudateLoop ) == euclidean.isWiddershins( loop ):
- extrudateLoop.reverse()
- extrudateLoops.append( extrudateLoop )
- return extrudateLoops
-
- def getLoopsFromMesh( self, z ):
- "Get loops from a slice of a mesh."
- originalLoops = []
- if self.slicePreferences.correct.value:
- originalLoops = getLoopsFromCorrectMesh( self.triangleMesh.edges, self.triangleMesh.faces, self.triangleMesh.vertices, z )
- if len( originalLoops ) < 1:
- originalLoops = getLoopsFromUnprovenMesh( self.triangleMesh.edges, self.extrusionPerimeterWidth, self.triangleMesh.faces, self.triangleMesh.vertices, self.slicePreferences, z )
- simplifiedLoops = []
- for originalLoop in originalLoops:
- simplifiedLoops.append( euclidean.getSimplifiedLoop( originalLoop, self.extrusionWidth ) )
- loops = getLoopsInDescendingOrderOfArea( simplifiedLoops )
- for loopIndex in xrange( len( loops ) ):
- loop = loops[ loopIndex ]
- leftPoint = euclidean.getLeftPoint( loop )
- totalNumberOfIntersectionsToLeft = 0
- for otherLoop in loops[ : loopIndex ] + loops[ loopIndex + 1 : ]:
- totalNumberOfIntersectionsToLeft += euclidean.getNumberOfIntersectionsToLeft( leftPoint, otherLoop )
- loopIsWiddershins = euclidean.isWiddershins( loop )
- isEven = totalNumberOfIntersectionsToLeft % 2 == 0
- if isEven != loopIsWiddershins:
- loop.reverse()
- return loops
-
- def getRounded( self, number ):
- "Get number rounded to the number of carried decimal places as a string."
- return euclidean.getRoundedToDecimalPlaces( self.decimalPlacesCarried, number )
-
- def getZAddExtruderPaths( self, z ):
- "Get next z and add extruder loops."
- alreadyFilledArounds = []
- zoneArray = []
- for point in self.triangleMesh.vertices:
- self.addToZoneArray( point, zoneArray, z )
- lowestZoneIndex = getLowestZoneIndex( zoneArray, z )
- halfAround = int( math.ceil( float( lowestZoneIndex ) / 2.0 ) )
- zAround = float( halfAround ) * self.zZoneInterval
- if lowestZoneIndex % 2 == 1:
- zAround = - zAround
- loops = self.getLoopsFromMesh( z + zAround )
- centers = []
- extruderPaths = []
- halfWidth = self.halfExtrusionPerimeterWidth
- slightlyGreaterThanExtrusionWIdth = 1.1 * halfWidth
- muchGreaterThanExtrusionWidth = 2.5 * halfWidth
- allExtrudateLoops = []
- for loop in loops:
- allExtrudateLoops += self.getExtrudateLoops( halfWidth, loop )
- bridgeDirection = self.getBridgeDirection( allExtrudateLoops )
- self.addLine( '(<layerStart> ' + self.getRounded( z ) + ' )' ) # Indicate that a new layer is starting.
- halfBridgeMinusLayer = 0.0
- if bridgeDirection != None:
- halfWidth *= self.bridgeExtrusionWidth / self.extrusionWidth
- slightlyGreaterThanExtrusionWIdth *= self.bridgeExtrusionWidth / self.extrusionWidth
- self.addLine( '(<bridgeDirection> ' + str( bridgeDirection ) + ' )' ) # Indicate the bridge direction.
- halfBridgeMinusLayer = 0.5 * ( self.bridgeExtrusionHeight - self.extrusionHeight )
- zPlusBridge = z + halfBridgeMinusLayer
- for loop in loops:
- extrudateLoops = self.getExtrudateLoops( halfWidth, loop )
- for extrudateLoop in extrudateLoops:
- self.addGcodeFromRemainingLoop( extrudateLoop, alreadyFilledArounds, halfWidth, zPlusBridge )
- addAlreadyFilledArounds( alreadyFilledArounds, extrudateLoop, self.fillInset )
- self.belowLoops = allExtrudateLoops
- if bridgeDirection == None:
- return z + self.extrusionHeight
- return z + self.bridgeExtrusionHeight
-
- def parseTriangleMesh( self, slicePreferences, triangleMesh ):
- "Parse gnu triangulated surface text and store the sliced gcode."
- self.slicePreferences = slicePreferences
- self.triangleMesh = triangleMesh
- self.extrusionDiameter = slicePreferences.extrusionDiameter.value
- self.decimalPlacesCarried = int( max( 0.0, math.ceil( 1.0 - math.log10( self.extrusionDiameter / slicePreferences.extrusionDiameterOverPrecision.value ) ) ) )
- self.bridgeExtrusionWidth = slicePreferences.infillBridgeWidthOverDiameter.value * self.extrusionDiameter
- self.extrusionHeight = slicePreferences.extrusionHeightOverDiameter.value * self.extrusionDiameter
- self.extrusionPerimeterWidth = slicePreferences.extrusionPerimeterWidthOverDiameter.value * self.extrusionDiameter
- self.extrusionWidth = slicePreferences.extrusionWidthOverDiameter.value * self.extrusionDiameter
- self.halfExtrusionPerimeterWidth = 0.5 * self.extrusionPerimeterWidth
- self.fillInset = self.extrusionPerimeterWidth - self.extrusionPerimeterWidth * slicePreferences.infillPerimeterOverlap.value
- if slicePreferences.perimeterInfillPreference.value:
- self.fillInset = self.halfExtrusionPerimeterWidth + 0.5 * self.extrusionWidth - self.extrusionWidth * slicePreferences.infillPerimeterOverlap.value
- self.bridgeExtrusionHeight = self.extrusionHeight * slicePreferences.extrusionWidthOverDiameter.value / slicePreferences.infillBridgeWidthOverDiameter.value
- self.halfThickness = 0.5 * self.extrusionHeight
- self.zZoneLayers = 99
- self.zZoneInterval = self.extrusionHeight / self.zZoneLayers / 100.0
- self.bottom = 999999999.0
- self.top = - self.bottom
- for point in self.triangleMesh.vertices:
- self.bottom = min( self.bottom, point.z )
- self.top = max( self.top, point.z )
- self.layerBottom = self.bottom + self.halfThickness
- self.layerTop = self.top - self.halfThickness * 0.5
- self.addInitializationToOutput()
- z = self.layerBottom
- while z < self.layerTop:
- z = self.getZAddExtruderPaths( z )
- self.addShutdownToOutput()
-
-
-def main():
- "Display the slice dialog."
- if len( sys.argv ) > 1:
- writeOutput( ' '.join( sys.argv[ 1 : ] ) )
- else:
- preferences.displayDialog( SlicePreferences() )
-
-if __name__ == "__main__":
- main()
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/speed.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/speed.py
index dd6aecb7..0afcb01b 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/speed.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/speed.py
@@ -13,6 +13,18 @@ In the "Flowrate Choice" radio button group, if "Do Not Add Flowrate" is selecte
output. If "Metric" is selected, the flowrate in cubic millimeters per second will be added to the output. If "PWM Setting" is
selected, the value in the "Flowrate PWM Setting" field will be added to the output.
+The 'Perimeter Feedrate over Operating Feedrate' is the ratio of the feedrate of the perimeter over the feedrate of the infill. With
+the default of 1.0, the perimeter feedrate will be the same as the infill feedrate. The 'Perimeter Flowrate over Operating Flowrate'
+is the ratio of the flowrate of the perimeter over the flowrate of the infill. With the default of 1.0, the perimeter flow rate will be
+the same as the infill flow rate. To have higher build quality on the outside at the expense of slower build speed, a typical
+setting for the 'Perimeter Feedrate over Operating Feedrate' would be 0.5. To go along with that, if you are using a speed
+controlled extruder, the 'Perimeter Flowrate over Operating Flowrate' should also be 0.5. If you are using Pulse Width Modulation
+to control the speed, then you'll probably need a slightly higher ratio because there is a minimum voltage 'Flowrate PWM Setting'
+required for the extruder motor to turn. The flow rate PWM ratio would be determined by trial and error, with the first trial being:
+Perimeter Flowrate over Operating Flowrate ~
+Perimeter Feedrate over Operating Feedrate * ( Flowrate PWM Setting - Minimum Flowrate PWM Setting )
++ Minimum Flowrate PWM Setting
+
The following examples speed the files Screw Holder Bottom.gcode & Screw Holder Bottom.stl. The examples are run in a terminal in the
folder which contains Screw Holder Bottom.gcode, Screw Holder Bottom.stl and speed.py. The speed function will speed if "Activate
Speed" is true, which can be set in the dialog or by changing the preferences file 'speed.csv' with a text editor or a spreadsheet
@@ -43,7 +55,7 @@ The speeded file is saved as Screw Holder Bottom_speed.gcode
>>> speed.getSpeedGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -52,7 +64,7 @@ many lines of gcode
>>> speed.getSpeedChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -70,7 +82,7 @@ from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import material
from skeinforge_tools import multiply
from skeinforge_tools import polyfile
@@ -85,11 +97,11 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getSpeedChainGcode( filename, gcodeText, speedPreferences = None ):
+def getSpeedChainGcode( fileName, gcodeText, speedPreferences = None ):
"Speed a gcode linear move text. Chain speed the gcode if it is not already speeded."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'multiply' ):
- gcodeText = multiply.getMultiplyChainGcode( filename, gcodeText )
+ gcodeText = multiply.getMultiplyChainGcode( fileName, gcodeText )
return getSpeedGcode( gcodeText, speedPreferences )
def getSpeedGcode( gcodeText, speedPreferences = None ):
@@ -107,21 +119,21 @@ def getSpeedGcode( gcodeText, speedPreferences = None ):
skein.parseGcode( gcodeText, speedPreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
+def writeOutput( fileName = '' ):
"""Speed a gcode linear move file. Chain speed the gcode if it is not already speeded.
- If no filename is specified, speed the first unmodified gcode file in this folder."""
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ If no fileName is specified, speed the first unmodified gcode file in this folder."""
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
speedPreferences = SpeedPreferences()
preferences.readPreferences( speedPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain speeded.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_speed.gcode'
- speedGcode = getSpeedChainGcode( filename, '', speedPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain speeded.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_speed.gcode'
+ speedGcode = getSpeedChainGcode( fileName, '', speedPreferences )
if speedGcode == '':
return
gcodec.writeFileText( suffixFilename, speedGcode )
@@ -133,15 +145,15 @@ def writeOutput( filename = '' ):
class SpeedPreferences:
"A class to handle the speed preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateSpeed = preferences.BooleanPreference().getFromValue( 'Activate Speed:', True )
self.archive.append( self.activateSpeed )
self.feedrateSecond = preferences.FloatPreference().getFromValue( 'Feedrate (mm/s):', 16.0 )
self.archive.append( self.feedrateSecond )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Speeded', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Speeded', '' )
+ self.archive.append( self.fileNameInput )
flowrateRadio = []
self.flowrateChoiceLabel = preferences.LabelDisplay().getFromName( 'Flowrate Choice: ' )
self.archive.append( self.flowrateChoiceLabel )
@@ -159,18 +171,18 @@ class SpeedPreferences:
self.archive.append( self.perimeterFeedrateOverOperatingFeedrate )
self.perimeterFlowrateOverOperatingFlowrate = preferences.FloatPreference().getFromValue( 'Perimeter Flowrate over Operating Flowrate (ratio):', 1.0 )
self.archive.append( self.perimeterFlowrateOverOperatingFlowrate )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Speed'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'speed.csv' )
- self.filenameHelp = 'skeinforge_tools.speed.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'speed.csv' )
+ self.fileNameHelp = 'skeinforge_tools.speed.html'
self.saveTitle = 'Save Preferences'
self.title = 'Speed Preferences'
def execute( self ):
"Speed button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class SpeedSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/stretch.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/stretch.py
index 0c50c3c8..4c691347 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/stretch.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/stretch.py
@@ -53,7 +53,7 @@ The stretched file is saved as Screw Holder Bottom_stretch.gcode
>>> stretch.getStretchGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -62,7 +62,7 @@ many lines of gcode
>>> stretch.getStretchChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -82,7 +82,7 @@ from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
from skeinforge_tools import cool
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
import cStringIO
import sys
@@ -95,11 +95,11 @@ __license__ = "GPL 3.0"
#maybe speed up feedrate option
-def getStretchChainGcode( filename, gcodeText, stretchPreferences = None ):
+def getStretchChainGcode( fileName, gcodeText, stretchPreferences = None ):
"Stretch a gcode linear move text. Chain stretch the gcode if it is not already stretched."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'cool' ):
- gcodeText = cool.getCoolChainGcode( filename, gcodeText )
+ gcodeText = cool.getCoolChainGcode( fileName, gcodeText )
return getStretchGcode( gcodeText, stretchPreferences )
def getStretchGcode( gcodeText, stretchPreferences = None ):
@@ -117,20 +117,20 @@ def getStretchGcode( gcodeText, stretchPreferences = None ):
skein.parseGcode( gcodeText, stretchPreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
- "Stretch a gcode linear move file. Chain stretch the gcode if it is not already stretched. If no filename is specified, stretch the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Stretch a gcode linear move file. Chain stretch the gcode if it is not already stretched. If no fileName is specified, stretch the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
stretchPreferences = StretchPreferences()
preferences.readPreferences( stretchPreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain stretched.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_stretch.gcode'
- stretchGcode = getStretchChainGcode( filename, '', stretchPreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain stretched.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_stretch.gcode'
+ stretchGcode = getStretchChainGcode( fileName, '', stretchPreferences )
if stretchGcode == '':
return
gcodec.writeFileText( suffixFilename, stretchGcode )
@@ -247,7 +247,7 @@ class LineIteratorForward:
class StretchPreferences:
"A class to handle the stretch preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateStretch = preferences.BooleanPreference().getFromValue( 'Activate Stretch', False )
@@ -256,24 +256,24 @@ class StretchPreferences:
self.archive.append( self.loopStretchOverExtrusionWidth )
self.pathStretchOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Path Stretch Over Extrusion Width (ratio):', 0.0 )
self.archive.append( self.pathStretchOverExtrusionWidth )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Stretched', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Stretched', '' )
+ self.archive.append( self.fileNameInput )
self.stretchFromDistanceOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Stretch From Distance Over Extrusion Width (ratio):', 2.0 )
self.archive.append( self.stretchFromDistanceOverExtrusionWidth )
self.perimeterStretchOverExtrusionWidth = preferences.FloatPreference().getFromValue( 'Perimeter Maximum Stretch Over Extrusion Width (ratio):', 0.3 )
self.archive.append( self.perimeterStretchOverExtrusionWidth )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Stretch'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'stretch.csv' )
- self.filenameHelp = 'skeinforge_tools.stretch.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'stretch.csv' )
+ self.fileNameHelp = 'skeinforge_tools.stretch.html'
self.saveTitle = 'Save Preferences'
self.title = 'Stretch Preferences'
def execute( self ):
"Stretch button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class StretchSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/tower.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/tower.py
index cf7e0f40..2f550304 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/tower.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/tower.py
@@ -53,7 +53,7 @@ The towered file is saved as Screw Holder Bottom_tower.gcode
>>> tower.getTowerGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -62,7 +62,7 @@ many lines of gcode
>>> tower.getTowerChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
@@ -81,7 +81,7 @@ from skeinforge_tools.skeinforge_utilities import gcodec
from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
from skeinforge_tools import raft
import cStringIO
@@ -94,11 +94,11 @@ __author__ = "Enrique Perez (perez_enrique@yahoo.com)"
__date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getTowerChainGcode( filename, gcodeText, towerPreferences = None ):
+def getTowerChainGcode( fileName, gcodeText, towerPreferences = None ):
"Tower a gcode linear move text. Chain tower the gcode if it is not already towered."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'raft' ):
- gcodeText = raft.getRaftChainGcode( filename, gcodeText )
+ gcodeText = raft.getRaftChainGcode( fileName, gcodeText )
return getTowerGcode( gcodeText, towerPreferences )
def getTowerGcode( gcodeText, towerPreferences = None ):
@@ -127,22 +127,22 @@ def transferFillLoopsToSurroundingLoops( fillLoops, surroundingLoops ):
for surroundingLoop in surroundingLoops:
transferFillLoops( fillLoops, surroundingLoop )
-def writeOutput( filename = '' ):
+def writeOutput( fileName = '' ):
"""Tower a gcode linear move file. Chain tower the gcode if it is not already towered.
- If no filename is specified, tower the first unmodified gcode file in this folder."""
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+ If no fileName is specified, tower the first unmodified gcode file in this folder."""
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
towerPreferences = TowerPreferences()
preferences.readPreferences( towerPreferences )
startTime = time.time()
- print( filename )
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain towered.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_tower.gcode'
- towerGcode = getTowerChainGcode( filename, '', towerPreferences )
+ print( fileName )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain towered.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_tower.gcode'
+ towerGcode = getTowerChainGcode( fileName, '', towerPreferences )
if towerGcode == '':
return
gcodec.writeFileText( suffixFilename, towerGcode )
@@ -168,31 +168,31 @@ class ThreadLayer:
class TowerPreferences:
"A class to handle the tower preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateTower = preferences.BooleanPreference().getFromValue( 'Activate Tower', True )
self.archive.append( self.activateTower )
self.extruderPossibleCollisionConeAngle = preferences.FloatPreference().getFromValue( 'Extruder Possible Collision Cone Angle (degrees):', 60.0 )
self.archive.append( self.extruderPossibleCollisionConeAngle )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Towered', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Towered', '' )
+ self.archive.append( self.fileNameInput )
self.maximumTowerHeight = preferences.IntPreference().getFromValue( 'Maximum Tower Height (layers):', 0 )
self.archive.append( self.maximumTowerHeight )
self.towerStartLayer = preferences.IntPreference().getFromValue( 'Tower Start Layer (integer):', 1 )
self.archive.append( self.towerStartLayer )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Tower'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'tower.csv' )
- self.filenameHelp = 'skeinforge_tools.tower.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'tower.csv' )
+ self.fileNameHelp = 'skeinforge_tools.tower.html'
self.saveTitle = 'Save Preferences'
self.title = 'Tower Preferences'
def execute( self ):
"Tower button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class TowerSkein:
@@ -204,7 +204,7 @@ class TowerSkein:
self.extrusionWidth = 0.6
self.feedrateMinute = 959.0
self.feedrateTable = {}
- self.halfExtrusionHeight = 0.4
+ self.halfLayerThickness = 0.4
self.islandLayers = []
self.isLoop = False
self.isPerimeter = False
@@ -233,7 +233,7 @@ class TowerSkein:
"Add a gcode thread to the output."
if len( thread ) > 0:
firstPoint = thread[ 0 ]
- if z + self.halfExtrusionHeight < self.oldZ:
+ if z + self.halfLayerThickness < self.oldZ:
highPoint = complex( firstPoint.real, firstPoint.imag )
if self.oldLocation != None:
oldLocationComplex = self.oldLocation.dropAxis( 2 )
@@ -413,8 +413,8 @@ class TowerSkein:
return
if firstWord == '(<decimalPlacesCarried>':
self.decimalPlacesCarried = int( splitLine[ 1 ] )
- elif firstWord == '(<extrusionHeight>':
- self.halfExtrusionHeight = 0.5 * float( splitLine[ 1 ] )
+ elif firstWord == '(<layerThickness>':
+ self.halfLayerThickness = 0.5 * float( splitLine[ 1 ] )
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float( splitLine[ 1 ] )
self.addLine( line )
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/unpause.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/unpause.py
index 40134a77..5fba934d 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/unpause.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/unpause.py
@@ -54,7 +54,7 @@ from skeinforge_tools.skeinforge_utilities import intercircle
from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools import analyze
from skeinforge_tools import fillet
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
import cStringIO
import os
@@ -67,11 +67,11 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getUnpauseChainGcode( filename, gcodeText, unpausePreferences = None ):
+def getUnpauseChainGcode( fileName, gcodeText, unpausePreferences = None ):
"Unpause a gcode linear move text. Chain unpause the gcode if it is not already unpaused."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'fillet' ):
- gcodeText = fillet.getFilletChainGcode( filename, gcodeText )
+ gcodeText = fillet.getFilletChainGcode( fileName, gcodeText )
return getUnpauseGcode( gcodeText, unpausePreferences )
def getUnpauseGcode( gcodeText, unpausePreferences = None ):
@@ -96,20 +96,20 @@ def getSelectedPlugin( unpausePreferences ):
return plugin
return None
-def writeOutput( filename = '' ):
- "Unpause a gcode linear move file. Chain unpause the gcode if it is not already unpaused. If no filename is specified, unpause the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Unpause a gcode linear move file. Chain unpause the gcode if it is not already unpaused. If no fileName is specified, unpause the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
+ fileName = unmodified[ 0 ]
unpausePreferences = UnpausePreferences()
preferences.readPreferences( unpausePreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain unpaused.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_unpause.gcode'
- unpauseGcode = getUnpauseChainGcode( filename, '', unpausePreferences )
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain unpaused.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_unpause.gcode'
+ unpauseGcode = getUnpauseChainGcode( fileName, '', unpausePreferences )
if unpauseGcode == '':
return
gcodec.writeFileText( suffixFilename, unpauseGcode )
@@ -121,29 +121,29 @@ def writeOutput( filename = '' ):
class UnpausePreferences:
"A class to handle the unpause preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
self.activateUnpause = preferences.BooleanPreference().getFromValue( 'Activate Unpause', False )
self.archive.append( self.activateUnpause )
self.delay = preferences.FloatPreference().getFromValue( 'Delay (milliseconds):', 28.0 )
self.archive.append( self.delay )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Unpaused', '' )
- self.archive.append( self.filenameInput )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Unpaused', '' )
+ self.archive.append( self.fileNameInput )
self.maximumSpeed = preferences.FloatPreference().getFromValue( 'Maximum Speed (ratio):', 1.5 )
self.archive.append( self.maximumSpeed )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
self.executeTitle = 'Unpause'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'unpause.csv' )
- self.filenameHelp = 'skeinforge_tools.unpause.html'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'unpause.csv' )
+ self.fileNameHelp = 'skeinforge_tools.unpause.html'
self.saveTitle = 'Save Preferences'
self.title = 'Unpause Preferences'
def execute( self ):
"Unpause button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
class UnpauseSkein:
diff --git a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/nozzle_wipe.py b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/wipe.py
index 93c408fd..0b417b47 100644
--- a/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/nozzle_wipe.py
+++ b/trunk/reprap/miscellaneous/python-beanshell-scripts/skeinforge_tools/wipe.py
@@ -1,71 +1,72 @@
"""
-Nozzle wipe is a script to wipe the nozzle.
+Wipe is a script to wipe the nozzle.
-At the beginning of a layer, depending on the preferences nozzle, wipe will move the nozzle with the extruder off to the arrival point,
+At the beginning of a layer, depending on the preferences, wipe will move the nozzle with the extruder off to the arrival point,
then to the wipe point, then to the departure point, then back to the layer.
-The default 'Activate Nozzle Wipe' checkbox is on. When it is on, the functions described below will work, when it is off, the functions
+The default 'Activate Wipe' checkbox is on. When it is on, the functions described below will work, when it is off, the functions
will not be called.
The "Location Arrival X" preference, is the x coordinate of the arrival location. The "Location Arrival Y" and "Location Arrival Z"
-preferences are the y & z coordinates of the location. The equivalent "Location Wipe.." and "Location Departure.." preferences are for
-the wipe and departure locations.
+preferences are the y & z coordinates of the location. The equivalent "Location Wipe.." and "Location Departure.." preferences
+are for the wipe and departure locations.
-The "Nozzle Wipe Period (layers)" preference is the number of layers between nozzle wipes. Nozzle wipe will always wipe just before
-the first layer, afterwards it will wipe every "Nozzle Wipe Period" layers. With the default of three, nozzle wipe will wipe just before
-the zeroth layer, the third layer, sixth layer and so on.
+The "Wipe Period (layers)" preference is the number of layers between wipes. Wipe will always wipe just before the first layer,
+afterwards it will wipe every "Wipe Period" layers. With the default of three, wipe will wipe just before the zeroth layer, the
+third layer, sixth layer and so on.
-To run nozzle wipe, in a shell which nozzle wipe is in type:
-> python nozzle_wipe.py
+To run wipe, in a shell which wipe is in type:
+> python wipe.py
-The following examples nozzle wipes the files Screw Holder Bottom.gcode & Screw Holder Bottom.stl. The examples are run in a terminal in the
-folder which contains Screw Holder Bottom.gcode, Screw Holder Bottom.stl and nozzle_wipe.py. The nozzle wipe function will nozzle wipe if the
-'Activate Nozzle Wipe' checkbox is on. The functions writeOutput and getNozzleWipeChainGcode check to see if the text has been
-nozzle wiped, if not they call the getHopChainGcode in hop.py to hop the text; once they have the hopped text, then they nozzle wipe.
+The following examples wipes the files Screw Holder Bottom.gcode & Screw Holder Bottom.stl. The examples are run in a
+terminal in the folder which contains Screw Holder Bottom.gcode, Screw Holder Bottom.stl and wipe.py. The wipe function
+will wipe if the 'Activate Wipe' checkbox is on. The functions writeOutput and getWipeChainGcode check to see if the text
+has been wiped, if not they call the getHopChainGcode in hop.py to hop the text; once they have the hopped text, then they
+wipe.
-> python nozzle_wipe.py
-This brings up the dialog, after clicking 'Nozzle Wipe', the following is printed:
-File Screw Holder Bottom.stl is being chain nozzle wiped.
-The nozzle wiped file is saved as Screw Holder Bottom_nozzle_wipe.gcode
+> python wipe.py
+This brings up the dialog, after clicking 'Wipe', the following is printed:
+File Screw Holder Bottom.stl is being chain wiped.
+The wiped file is saved as Screw Holder Bottom_wipe.gcode
-> python nozzle_wipe.py Screw Holder Bottom.stl
-File Screw Holder Bottom.stl is being chain nozzle wiped.
-The nozzle wiped file is saved as Screw Holder Bottom_nozzle_wipe.gcode
+> python wipe.py Screw Holder Bottom.stl
+File Screw Holder Bottom.stl is being chain wiped.
+The wiped file is saved as Screw Holder Bottom_wipe.gcode
> python
Python 2.5.1 (r251:54863, Sep 22 2007, 01:43:31)
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
->>> import nozzle_wipe
->>> nozzle_wipe.main()
-This brings up the nozzle wipe dialog.
+>>> import wipe
+>>> wipe.main()
+This brings up the wipe dialog.
->>> nozzle_wipe.writeOutput()
-File Screw Holder Bottom.stl is being chain nozzle wiped.
-The nozzle wiped file is saved as Screw Holder Bottom_nozzle_wipe.gcode
+>>> wipe.writeOutput()
+File Screw Holder Bottom.stl is being chain wiped.
+The wiped file is saved as Screw Holder Bottom_wipe.gcode
->>> nozzle_wipe.getNozzleWipeGcode("
-( GCode generated by May 8, 2008 slice.py )
+>>> wipe.getWipeGcode("
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
..
")
-Many line of nozzle wiped gcode.
+Many line of wiped gcode.
->>> nozzle_wipe.getNozzleWipeChainGcode("
-( GCode generated by May 8, 2008 slice.py )
+>>> wipe.getWipeChainGcode("
+( GCode generated by May 8, 2008 carve.py )
( Extruder Initialization )
..
many lines of gcode
..
")
-Many line of nozzle wiped gcode.
+Many line of wiped gcode.
"""
@@ -79,7 +80,7 @@ from skeinforge_tools.skeinforge_utilities import preferences
from skeinforge_tools.skeinforge_utilities.vector3 import Vector3
from skeinforge_tools import analyze
from skeinforge_tools import hop
-from skeinforge_tools import import_translator
+from skeinforge_tools.skeinforge_utilities import interpret
from skeinforge_tools import polyfile
import cStringIO
import math
@@ -92,60 +93,60 @@ __date__ = "$Date: 2008/21/04 $"
__license__ = "GPL 3.0"
-def getNozzleWipeChainGcode( filename, gcodeText, nozzleWipePreferences = None ):
- "Nozzle wipe a gcode linear move text. Chain nozzle wipe the gcode if it is not already nozzle wiped."
- gcodeText = gcodec.getGcodeFileText( filename, gcodeText )
+def getWipeChainGcode( fileName, gcodeText, wipePreferences = None ):
+ "Wipe a gcode linear move text. Chain wipe the gcode if it is not already wiped."
+ gcodeText = gcodec.getGcodeFileText( fileName, gcodeText )
if not gcodec.isProcedureDone( gcodeText, 'hop' ):
- gcodeText = hop.getHopChainGcode( filename, gcodeText )
- return getNozzleWipeGcode( gcodeText, nozzleWipePreferences )
+ gcodeText = hop.getHopChainGcode( fileName, gcodeText )
+ return getWipeGcode( gcodeText, wipePreferences )
-def getNozzleWipeGcode( gcodeText, nozzleWipePreferences = None ):
- "Nozzle wipe a gcode linear move text."
+def getWipeGcode( gcodeText, wipePreferences = None ):
+ "Wipe a gcode linear move text."
if gcodeText == '':
return ''
- if gcodec.isProcedureDone( gcodeText, 'nozzle_wipe' ):
+ if gcodec.isProcedureDone( gcodeText, 'wipe' ):
return gcodeText
- if nozzleWipePreferences == None:
- nozzleWipePreferences = NozzleWipePreferences()
- preferences.readPreferences( nozzleWipePreferences )
- if not nozzleWipePreferences.activateNozzleWipe.value:
+ if wipePreferences == None:
+ wipePreferences = WipePreferences()
+ preferences.readPreferences( wipePreferences )
+ if not wipePreferences.activateWipe.value:
return gcodeText
- skein = NozzleWipeSkein()
- skein.parseGcode( gcodeText, nozzleWipePreferences )
+ skein = WipeSkein()
+ skein.parseGcode( gcodeText, wipePreferences )
return skein.output.getvalue()
-def writeOutput( filename = '' ):
- "Nozzle wipe a gcode linear move file. Chain nozzle wipe the gcode if it is not already nozzle wiped. If no filename is specified, nozzle wipe the first unmodified gcode file in this folder."
- if filename == '':
- unmodified = import_translator.getGNUTranslatorFilesUnmodified()
+def writeOutput( fileName = '' ):
+ "Wipe a gcode linear move file. Chain wipe the gcode if it is not already wiped. If no fileName is specified, wipe the first unmodified gcode file in this folder."
+ if fileName == '':
+ unmodified = interpret.getGNUTranslatorFilesUnmodified()
if len( unmodified ) == 0:
print( "There are no unmodified gcode files in this folder." )
return
- filename = unmodified[ 0 ]
- nozzleWipePreferences = NozzleWipePreferences()
- preferences.readPreferences( nozzleWipePreferences )
+ fileName = unmodified[ 0 ]
+ wipePreferences = WipePreferences()
+ preferences.readPreferences( wipePreferences )
startTime = time.time()
- print( 'File ' + gcodec.getSummarizedFilename( filename ) + ' is being chain nozzle wiped.' )
- suffixFilename = filename[ : filename.rfind( '.' ) ] + '_nozzle_wipe.gcode'
- nozzleWipeGcode = getNozzleWipeChainGcode( filename, '', nozzleWipePreferences )
- if nozzleWipeGcode == '':
+ print( 'File ' + gcodec.getSummarizedFilename( fileName ) + ' is being chain wiped.' )
+ suffixFilename = fileName[ : fileName.rfind( '.' ) ] + '_wipe.gcode'
+ wipeGcode = getWipeChainGcode( fileName, '', wipePreferences )
+ if wipeGcode == '':
return
- gcodec.writeFileText( suffixFilename, nozzleWipeGcode )
- print( 'The nozzle wiped file is saved as ' + gcodec.getSummarizedFilename( suffixFilename ) )
- analyze.writeOutput( suffixFilename, nozzleWipeGcode )
- print( 'It took ' + str( int( round( time.time() - startTime ) ) ) + ' seconds to nozzle wipe the file.' )
+ gcodec.writeFileText( suffixFilename, wipeGcode )
+ print( 'The wiped file is saved as ' + gcodec.getSummarizedFilename( suffixFilename ) )
+ analyze.writeOutput( suffixFilename, wipeGcode )
+ print( 'It took ' + str( int( round( time.time() - startTime ) ) ) + ' seconds to wipe the file.' )
-class NozzleWipePreferences:
- "A class to handle the nozzle wipe preferences."
+class WipePreferences:
+ "A class to handle the wipe preferences."
def __init__( self ):
- "Set the default preferences, execute title & preferences filename."
+ "Set the default preferences, execute title & preferences fileName."
#Set the default preferences.
self.archive = []
- self.activateNozzleWipe = preferences.BooleanPreference().getFromValue( 'Activate Nozzle Wipe', False )
- self.archive.append( self.activateNozzleWipe )
- self.filenameInput = preferences.Filename().getFromFilename( import_translator.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Nozzle Wiped', '' )
- self.archive.append( self.filenameInput )
+ self.activateWipe = preferences.BooleanPreference().getFromValue( 'Activate Wipe', False )
+ self.archive.append( self.activateWipe )
+ self.fileNameInput = preferences.Filename().getFromFilename( interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Wiped', '' )
+ self.archive.append( self.fileNameInput )
self.locationArrivalX = preferences.FloatPreference().getFromValue( 'Location Arrival X (mm):', - 70.0 )
self.archive.append( self.locationArrivalX )
self.locationArrivalY = preferences.FloatPreference().getFromValue( 'Location Arrival Y (mm):', - 50.0 )
@@ -164,24 +165,24 @@ class NozzleWipePreferences:
self.archive.append( self.locationWipeY )
self.locationWipeZ = preferences.FloatPreference().getFromValue( 'Location Wipe Z (mm):', 50.0 )
self.archive.append( self.locationWipeZ )
- self.nozzleWipePeriod = preferences.IntPreference().getFromValue( 'Nozzle Wipe Period (layers):', 3 )
- self.archive.append( self.nozzleWipePeriod )
- #Create the archive, title of the execute button, title of the dialog & preferences filename.
- self.executeTitle = 'Nozzle Wipe'
- self.filenamePreferences = preferences.getPreferencesFilePath( 'nozzle_wipe.csv' )
- self.filenameHelp = 'skeinforge_tools.nozzle_wipe.html'
+ self.wipePeriod = preferences.IntPreference().getFromValue( 'Wipe Period (layers):', 3 )
+ self.archive.append( self.wipePeriod )
+ #Create the archive, title of the execute button, title of the dialog & preferences fileName.
+ self.executeTitle = 'Wipe'
+ self.fileNamePreferences = preferences.getPreferencesFilePath( 'wipe.csv' )
+ self.fileNameHelp = 'skeinforge_tools.wipe.html'
self.saveTitle = 'Save Preferences'
- self.title = 'Nozzle Wipe Preferences'
+ self.title = 'Wipe Preferences'
def execute( self ):
- "Nozzle wipe button has been clicked."
- filenames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.filenameInput.value, import_translator.getGNUTranslatorFileTypes(), self.filenameInput.wasCancelled )
- for filename in filenames:
- writeOutput( filename )
+ "Wipe button has been clicked."
+ fileNames = polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, interpret.getImportPluginFilenames(), self.fileNameInput.wasCancelled )
+ for fileName in fileNames:
+ writeOutput( fileName )
-class NozzleWipeSkein:
- "A class to nozzle wipe a skein of extrusions."
+class WipeSkein:
+ "A class to wipe a skein of extrusions."
def __init__( self ):
self.decimalPlacesCarried = 3
self.extruderActive = False
@@ -238,19 +239,19 @@ class NozzleWipeSkein:
"Get number rounded to the number of carried decimal places as a string."
return euclidean.getRoundedToDecimalPlaces( self.decimalPlacesCarried, number )
- def parseGcode( self, gcodeText, nozzleWipePreferences ):
- "Parse gcode text and store the nozzle wipe gcode."
+ def parseGcode( self, gcodeText, wipePreferences ):
+ "Parse gcode text and store the wipe gcode."
self.lines = gcodec.getTextLines( gcodeText )
- self.nozzleWipePeriod = nozzleWipePreferences.nozzleWipePeriod.value
- self.parseInitialization( nozzleWipePreferences )
- self.locationArrival = Vector3( nozzleWipePreferences.locationArrivalX.value, nozzleWipePreferences.locationArrivalY.value, nozzleWipePreferences.locationArrivalZ.value )
- self.locationDeparture = Vector3( nozzleWipePreferences.locationDepartureX.value, nozzleWipePreferences.locationDepartureY.value, nozzleWipePreferences.locationDepartureZ.value )
- self.locationWipe = Vector3( nozzleWipePreferences.locationWipeX.value, nozzleWipePreferences.locationWipeY.value, nozzleWipePreferences.locationWipeZ.value )
+ self.wipePeriod = wipePreferences.wipePeriod.value
+ self.parseInitialization( wipePreferences )
+ self.locationArrival = Vector3( wipePreferences.locationArrivalX.value, wipePreferences.locationArrivalY.value, wipePreferences.locationArrivalZ.value )
+ self.locationDeparture = Vector3( wipePreferences.locationDepartureX.value, wipePreferences.locationDepartureY.value, wipePreferences.locationDepartureZ.value )
+ self.locationWipe = Vector3( wipePreferences.locationWipeX.value, wipePreferences.locationWipeY.value, wipePreferences.locationWipeZ.value )
for self.lineIndex in xrange( self.lineIndex, len( self.lines ) ):
line = self.lines[ self.lineIndex ]
self.parseLine( line )
- def parseInitialization( self, nozzleWipePreferences ):
+ def parseInitialization( self, wipePreferences ):
"Parse gcode initialization and store the parameters."
for self.lineIndex in xrange( len( self.lines ) ):
line = self.lines[ self.lineIndex ]
@@ -259,7 +260,7 @@ class NozzleWipeSkein:
if firstWord == '(<decimalPlacesCarried>':
self.decimalPlacesCarried = int( splitLine[ 1 ] )
elif firstWord == '(<extrusionStart>':
- self.addLine( '(<procedureDone> nozzle_wipe )' )
+ self.addLine( '(<procedureDone> wipe )' )
return
elif firstWord == '(<extrusionWidth>':
self.extrusionWidth = float( splitLine[ 1 ] )
@@ -276,7 +277,7 @@ class NozzleWipeSkein:
self.oldLocation = gcodec.getLocationFromSplitLine( self.oldLocation, splitLine )
elif firstWord == '(<layerStart>':
self.layerIndex += 1
- if self.layerIndex % self.nozzleWipePeriod == 0:
+ if self.layerIndex % self.wipePeriod == 0:
self.shouldWipe = True
elif firstWord == 'M101':
self.extruderActive = True
@@ -286,11 +287,11 @@ class NozzleWipeSkein:
def main( hashtable = None ):
- "Display the nozzle wipe dialog."
+ "Display the wipe dialog."
if len( sys.argv ) > 1:
writeOutput( ' '.join( sys.argv[ 1 : ] ) )
else:
- preferences.displayDialog( NozzleWipePreferences() )
+ preferences.displayDialog( WipePreferences() )
if __name__ == "__main__":
main()