diff --git a/ReplicatorG/build/classes/META-INF/MANIFEST.MF b/ReplicatorG/build/classes/META-INF/MANIFEST.MF deleted file mode 100644 index c102e69..0000000 --- a/ReplicatorG/build/classes/META-INF/MANIFEST.MF +++ /dev/null @@ -1,4 +0,0 @@ -Manifest-Version: 1.0 -Ant-Version: Apache Ant 1.7.1 -Created-By: 11.3-b02 (Sun Microsystems Inc.) -SplashScreen-Image: images/splash.png diff --git a/ReplicatorG/build/classes/images/about.jpg b/ReplicatorG/build/classes/images/about.jpg deleted file mode 100644 index 017e8b3..0000000 Binary files a/ReplicatorG/build/classes/images/about.jpg and /dev/null differ diff --git a/ReplicatorG/build/classes/images/about.png b/ReplicatorG/build/classes/images/about.png deleted file mode 100644 index bc4645f..0000000 Binary files a/ReplicatorG/build/classes/images/about.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/align-with-floor.png b/ReplicatorG/build/classes/images/align-with-floor.png deleted file mode 100644 index 933482c..0000000 Binary files a/ReplicatorG/build/classes/images/align-with-floor.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-build.png b/ReplicatorG/build/classes/images/button-build.png deleted file mode 100644 index 6289b7d..0000000 Binary files a/ReplicatorG/build/classes/images/button-build.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-connect.png b/ReplicatorG/build/classes/images/button-connect.png deleted file mode 100644 index 08ee589..0000000 Binary files a/ReplicatorG/build/classes/images/button-connect.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-control-panel.png b/ReplicatorG/build/classes/images/button-control-panel.png deleted file mode 100644 index c093618..0000000 Binary files a/ReplicatorG/build/classes/images/button-control-panel.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-disconnect.png b/ReplicatorG/build/classes/images/button-disconnect.png deleted file mode 100644 index f333cac..0000000 Binary files a/ReplicatorG/build/classes/images/button-disconnect.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-go-home.png b/ReplicatorG/build/classes/images/button-go-home.png deleted file mode 100644 index 9f9129a..0000000 Binary files a/ReplicatorG/build/classes/images/button-go-home.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-panic.png b/ReplicatorG/build/classes/images/button-panic.png deleted file mode 100644 index 629d337..0000000 Binary files a/ReplicatorG/build/classes/images/button-panic.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-pause.png b/ReplicatorG/build/classes/images/button-pause.png deleted file mode 100644 index d8a2ffe..0000000 Binary files a/ReplicatorG/build/classes/images/button-pause.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-playback.png b/ReplicatorG/build/classes/images/button-playback.png deleted file mode 100644 index b3837e1..0000000 Binary files a/ReplicatorG/build/classes/images/button-playback.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-realtime-panel.png b/ReplicatorG/build/classes/images/button-realtime-panel.png deleted file mode 100644 index d71f308..0000000 Binary files a/ReplicatorG/build/classes/images/button-realtime-panel.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-reset.png b/ReplicatorG/build/classes/images/button-reset.png deleted file mode 100644 index a79016a..0000000 Binary files a/ReplicatorG/build/classes/images/button-reset.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-set-home.png b/ReplicatorG/build/classes/images/button-set-home.png deleted file mode 100644 index 2fd238b..0000000 Binary files a/ReplicatorG/build/classes/images/button-set-home.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-simulate.png b/ReplicatorG/build/classes/images/button-simulate.png deleted file mode 100644 index 55fbe50..0000000 Binary files a/ReplicatorG/build/classes/images/button-simulate.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-stop.png b/ReplicatorG/build/classes/images/button-stop.png deleted file mode 100644 index 54335bd..0000000 Binary files a/ReplicatorG/build/classes/images/button-stop.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-to-file.png b/ReplicatorG/build/classes/images/button-to-file.png deleted file mode 100644 index 3f8139a..0000000 Binary files a/ReplicatorG/build/classes/images/button-to-file.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/button-upload.png b/ReplicatorG/build/classes/images/button-upload.png deleted file mode 100644 index 0bccbbd..0000000 Binary files a/ReplicatorG/build/classes/images/button-upload.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/buttons.png b/ReplicatorG/build/classes/images/buttons.png deleted file mode 100644 index 3d34b2e..0000000 Binary files a/ReplicatorG/build/classes/images/buttons.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/center-object.png b/ReplicatorG/build/classes/images/center-object.png deleted file mode 100644 index 2ab19b5..0000000 Binary files a/ReplicatorG/build/classes/images/center-object.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/flip-object.png b/ReplicatorG/build/classes/images/flip-object.png deleted file mode 100644 index cf13777..0000000 Binary files a/ReplicatorG/build/classes/images/flip-object.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon-board.png b/ReplicatorG/build/classes/images/icon-board.png deleted file mode 100644 index 953ef51..0000000 Binary files a/ReplicatorG/build/classes/images/icon-board.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon-collapsed.png b/ReplicatorG/build/classes/images/icon-collapsed.png deleted file mode 100644 index 4d72eac..0000000 Binary files a/ReplicatorG/build/classes/images/icon-collapsed.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon-ec36.png b/ReplicatorG/build/classes/images/icon-ec36.png deleted file mode 100644 index a21178d..0000000 Binary files a/ReplicatorG/build/classes/images/icon-ec36.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon-expanded.png b/ReplicatorG/build/classes/images/icon-expanded.png deleted file mode 100644 index 00d0095..0000000 Binary files a/ReplicatorG/build/classes/images/icon-expanded.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon-large.gif b/ReplicatorG/build/classes/images/icon-large.gif deleted file mode 100644 index b53cade..0000000 Binary files a/ReplicatorG/build/classes/images/icon-large.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon-mb24.png b/ReplicatorG/build/classes/images/icon-mb24.png deleted file mode 100644 index fbf12f6..0000000 Binary files a/ReplicatorG/build/classes/images/icon-mb24.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon-small.gif b/ReplicatorG/build/classes/images/icon-small.gif deleted file mode 100644 index fa60aad..0000000 Binary files a/ReplicatorG/build/classes/images/icon-small.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/icon.gif b/ReplicatorG/build/classes/images/icon.gif deleted file mode 100644 index 9a32eef..0000000 Binary files a/ReplicatorG/build/classes/images/icon.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/CCW.png b/ReplicatorG/build/classes/images/jog/CCW.png deleted file mode 100644 index 359a8a0..0000000 Binary files a/ReplicatorG/build/classes/images/jog/CCW.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/CCWDown.png b/ReplicatorG/build/classes/images/jog/CCWDown.png deleted file mode 100644 index e0a380e..0000000 Binary files a/ReplicatorG/build/classes/images/jog/CCWDown.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/CCWOver.png b/ReplicatorG/build/classes/images/jog/CCWOver.png deleted file mode 100644 index 69d01c6..0000000 Binary files a/ReplicatorG/build/classes/images/jog/CCWOver.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/CW.png b/ReplicatorG/build/classes/images/jog/CW.png deleted file mode 100644 index 8838e0c..0000000 Binary files a/ReplicatorG/build/classes/images/jog/CW.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/CWDown.png b/ReplicatorG/build/classes/images/jog/CWDown.png deleted file mode 100644 index 8a4ae2e..0000000 Binary files a/ReplicatorG/build/classes/images/jog/CWDown.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/CWOver.png b/ReplicatorG/build/classes/images/jog/CWOver.png deleted file mode 100644 index ae2b647..0000000 Binary files a/ReplicatorG/build/classes/images/jog/CWOver.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/X+.png b/ReplicatorG/build/classes/images/jog/X+.png deleted file mode 100644 index 820ddcb..0000000 Binary files a/ReplicatorG/build/classes/images/jog/X+.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/X+Down.png b/ReplicatorG/build/classes/images/jog/X+Down.png deleted file mode 100644 index ef38d2d..0000000 Binary files a/ReplicatorG/build/classes/images/jog/X+Down.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/X+Over.png b/ReplicatorG/build/classes/images/jog/X+Over.png deleted file mode 100644 index 4aaf4e1..0000000 Binary files a/ReplicatorG/build/classes/images/jog/X+Over.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/X-.png b/ReplicatorG/build/classes/images/jog/X-.png deleted file mode 100644 index c1bc958..0000000 Binary files a/ReplicatorG/build/classes/images/jog/X-.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/X-Down.png b/ReplicatorG/build/classes/images/jog/X-Down.png deleted file mode 100644 index 2107a4a..0000000 Binary files a/ReplicatorG/build/classes/images/jog/X-Down.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/X-Over.png b/ReplicatorG/build/classes/images/jog/X-Over.png deleted file mode 100644 index 04734b3..0000000 Binary files a/ReplicatorG/build/classes/images/jog/X-Over.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Y+.png b/ReplicatorG/build/classes/images/jog/Y+.png deleted file mode 100644 index 0b1ebc0..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Y+.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Y+Down.png b/ReplicatorG/build/classes/images/jog/Y+Down.png deleted file mode 100644 index a8680a5..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Y+Down.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Y+Over.png b/ReplicatorG/build/classes/images/jog/Y+Over.png deleted file mode 100644 index 2b0964e..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Y+Over.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Y-.png b/ReplicatorG/build/classes/images/jog/Y-.png deleted file mode 100644 index 4e59176..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Y-.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Y-Down.png b/ReplicatorG/build/classes/images/jog/Y-Down.png deleted file mode 100644 index 7e3e573..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Y-Down.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Y-Over.png b/ReplicatorG/build/classes/images/jog/Y-Over.png deleted file mode 100644 index 47b1d4e..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Y-Over.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Z+.png b/ReplicatorG/build/classes/images/jog/Z+.png deleted file mode 100644 index 430715b..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Z+.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Z+Down.png b/ReplicatorG/build/classes/images/jog/Z+Down.png deleted file mode 100644 index 0c70811..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Z+Down.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Z+Over.png b/ReplicatorG/build/classes/images/jog/Z+Over.png deleted file mode 100644 index 7fd8220..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Z+Over.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Z-.png b/ReplicatorG/build/classes/images/jog/Z-.png deleted file mode 100644 index 575ef0e..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Z-.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Z-Down.png b/ReplicatorG/build/classes/images/jog/Z-Down.png deleted file mode 100644 index 9354bbf..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Z-Down.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/Z-Over.png b/ReplicatorG/build/classes/images/jog/Z-Over.png deleted file mode 100644 index bba5cc3..0000000 Binary files a/ReplicatorG/build/classes/images/jog/Z-Over.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/dummy.png b/ReplicatorG/build/classes/images/jog/dummy.png deleted file mode 100644 index 4a9d774..0000000 Binary files a/ReplicatorG/build/classes/images/jog/dummy.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/dummyDown.png b/ReplicatorG/build/classes/images/jog/dummyDown.png deleted file mode 100644 index 4a9d774..0000000 Binary files a/ReplicatorG/build/classes/images/jog/dummyDown.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/dummyOver.png b/ReplicatorG/build/classes/images/jog/dummyOver.png deleted file mode 100644 index 4a9d774..0000000 Binary files a/ReplicatorG/build/classes/images/jog/dummyOver.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/panic.png b/ReplicatorG/build/classes/images/jog/panic.png deleted file mode 100644 index e1afd47..0000000 Binary files a/ReplicatorG/build/classes/images/jog/panic.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/jog/panicOver.png b/ReplicatorG/build/classes/images/jog/panicOver.png deleted file mode 100644 index f5ddccb..0000000 Binary files a/ReplicatorG/build/classes/images/jog/panicOver.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/look-at-object.png b/ReplicatorG/build/classes/images/look-at-object.png deleted file mode 100644 index 54df148..0000000 Binary files a/ReplicatorG/build/classes/images/look-at-object.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/model-to-gcode.png b/ReplicatorG/build/classes/images/model-to-gcode.png deleted file mode 100644 index d899bbf..0000000 Binary files a/ReplicatorG/build/classes/images/model-to-gcode.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/resize.gif b/ReplicatorG/build/classes/images/resize.gif deleted file mode 100644 index 486e7eb..0000000 Binary files a/ReplicatorG/build/classes/images/resize.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/slicing-icon.gif b/ReplicatorG/build/classes/images/slicing-icon.gif deleted file mode 100644 index 28357cf..0000000 Binary files a/ReplicatorG/build/classes/images/slicing-icon.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/splash.png b/ReplicatorG/build/classes/images/splash.png deleted file mode 100644 index c564873..0000000 Binary files a/ReplicatorG/build/classes/images/splash.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-regular.png b/ReplicatorG/build/classes/images/tab-regular.png deleted file mode 100644 index af77f13..0000000 Binary files a/ReplicatorG/build/classes/images/tab-regular.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-sel-left.gif b/ReplicatorG/build/classes/images/tab-sel-left.gif deleted file mode 100644 index 2754b19..0000000 Binary files a/ReplicatorG/build/classes/images/tab-sel-left.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-sel-menu.gif b/ReplicatorG/build/classes/images/tab-sel-menu.gif deleted file mode 100644 index 97ef10b..0000000 Binary files a/ReplicatorG/build/classes/images/tab-sel-menu.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-sel-mid.gif b/ReplicatorG/build/classes/images/tab-sel-mid.gif deleted file mode 100644 index c2da958..0000000 Binary files a/ReplicatorG/build/classes/images/tab-sel-mid.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-sel-right.gif b/ReplicatorG/build/classes/images/tab-sel-right.gif deleted file mode 100644 index f6641c3..0000000 Binary files a/ReplicatorG/build/classes/images/tab-sel-right.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-selected.png b/ReplicatorG/build/classes/images/tab-selected.png deleted file mode 100644 index c977ed7..0000000 Binary files a/ReplicatorG/build/classes/images/tab-selected.png and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-unsel-left.gif b/ReplicatorG/build/classes/images/tab-unsel-left.gif deleted file mode 100644 index 448e3e5..0000000 Binary files a/ReplicatorG/build/classes/images/tab-unsel-left.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-unsel-menu.gif b/ReplicatorG/build/classes/images/tab-unsel-menu.gif deleted file mode 100644 index 033b33e..0000000 Binary files a/ReplicatorG/build/classes/images/tab-unsel-menu.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-unsel-mid.gif b/ReplicatorG/build/classes/images/tab-unsel-mid.gif deleted file mode 100644 index f86a5aa..0000000 Binary files a/ReplicatorG/build/classes/images/tab-unsel-mid.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/images/tab-unsel-right.gif b/ReplicatorG/build/classes/images/tab-unsel-right.gif deleted file mode 100644 index e114484..0000000 Binary files a/ReplicatorG/build/classes/images/tab-unsel-right.gif and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/collada/ColladaParser$FloatArray.class b/ReplicatorG/build/classes/org/j3d/loaders/collada/ColladaParser$FloatArray.class deleted file mode 100644 index 25425ae..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/collada/ColladaParser$FloatArray.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/collada/ColladaParser.class b/ReplicatorG/build/classes/org/j3d/loaders/collada/ColladaParser.class deleted file mode 100644 index bdd06c8..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/collada/ColladaParser.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/stl/LittleEndianConverter.class b/ReplicatorG/build/classes/org/j3d/loaders/stl/LittleEndianConverter.class deleted file mode 100644 index 7e608a4..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/stl/LittleEndianConverter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser.class b/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser.class deleted file mode 100644 index 268b63e..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser2$ObjectStats.class b/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser2$ObjectStats.class deleted file mode 100644 index d0bd1a2..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser2$ObjectStats.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser2.class b/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser2.class deleted file mode 100644 index 48bce79..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLASCIIParser2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLBinaryParser.class b/ReplicatorG/build/classes/org/j3d/loaders/stl/STLBinaryParser.class deleted file mode 100644 index 0c11fd2..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLBinaryParser.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLFileReader.class b/ReplicatorG/build/classes/org/j3d/loaders/stl/STLFileReader.class deleted file mode 100644 index 21d8440..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLFileReader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLParser.class b/ReplicatorG/build/classes/org/j3d/loaders/stl/STLParser.class deleted file mode 100644 index 805b07e..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/loaders/stl/STLParser.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/ColladaLoader.class b/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/ColladaLoader.class deleted file mode 100644 index 98c26e1..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/ColladaLoader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/GTSLoader.class b/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/GTSLoader.class deleted file mode 100644 index 544d83f..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/GTSLoader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/ObjLoader.class b/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/ObjLoader.class deleted file mode 100644 index 43ecedc..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/ObjLoader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/STLLoader.class b/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/STLLoader.class deleted file mode 100644 index af8b3e8..0000000 Binary files a/ReplicatorG/build/classes/org/j3d/renderer/java3d/loaders/STLLoader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/Base$1.class b/ReplicatorG/build/classes/replicatorg/app/Base$1.class deleted file mode 100644 index 46bb825..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/Base$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/Base$2$1.class b/ReplicatorG/build/classes/replicatorg/app/Base$2$1.class deleted file mode 100644 index cc00a27..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/Base$2$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/Base$2.class b/ReplicatorG/build/classes/replicatorg/app/Base$2.class deleted file mode 100644 index 4e0c50c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/Base$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/Base$InitialOpenBehavior.class b/ReplicatorG/build/classes/replicatorg/app/Base$InitialOpenBehavior.class deleted file mode 100644 index f588506..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/Base$InitialOpenBehavior.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/Base$Platform.class b/ReplicatorG/build/classes/replicatorg/app/Base$Platform.class deleted file mode 100644 index 50711e5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/Base$Platform.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/Base.class b/ReplicatorG/build/classes/replicatorg/app/Base.class deleted file mode 100644 index 3376c9a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/Base.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/DataCapture.class b/ReplicatorG/build/classes/replicatorg/app/DataCapture.class deleted file mode 100644 index ece7da7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/DataCapture.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/GCode$gCodeParameter.class b/ReplicatorG/build/classes/replicatorg/app/GCode$gCodeParameter.class deleted file mode 100644 index 70e33e5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/GCode$gCodeParameter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/GCode.class b/ReplicatorG/build/classes/replicatorg/app/GCode.class deleted file mode 100644 index 42fcfbd..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/GCode.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/GCodeEnumeration$1.class b/ReplicatorG/build/classes/replicatorg/app/GCodeEnumeration$1.class deleted file mode 100644 index 8182deb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/GCodeEnumeration$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/GCodeEnumeration.class b/ReplicatorG/build/classes/replicatorg/app/GCodeEnumeration.class deleted file mode 100644 index 207b8b2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/GCodeEnumeration.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/GCodeParser$1.class b/ReplicatorG/build/classes/replicatorg/app/GCodeParser$1.class deleted file mode 100644 index 5e5d611..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/GCodeParser$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/GCodeParser$DrillCycle.class b/ReplicatorG/build/classes/replicatorg/app/GCodeParser$DrillCycle.class deleted file mode 100644 index 505ee6c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/GCodeParser$DrillCycle.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/GCodeParser.class b/ReplicatorG/build/classes/replicatorg/app/GCodeParser.class deleted file mode 100644 index eb1b21c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/GCodeParser.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/MRUList.class b/ReplicatorG/build/classes/replicatorg/app/MRUList.class deleted file mode 100644 index 42a5c2a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/MRUList.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/Tweet.class b/ReplicatorG/build/classes/replicatorg/app/Tweet.class deleted file mode 100644 index 8038154..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/Tweet.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/TwitterBot.class b/ReplicatorG/build/classes/replicatorg/app/TwitterBot.class deleted file mode 100644 index 7131215..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/TwitterBot.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/UpdateChecker$1.class b/ReplicatorG/build/classes/replicatorg/app/UpdateChecker$1.class deleted file mode 100644 index 1dbc767..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/UpdateChecker$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/UpdateChecker$2.class b/ReplicatorG/build/classes/replicatorg/app/UpdateChecker$2.class deleted file mode 100644 index 30e7589..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/UpdateChecker$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/UpdateChecker.class b/ReplicatorG/build/classes/replicatorg/app/UpdateChecker.class deleted file mode 100644 index 9501e7c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/UpdateChecker.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/exceptions/BuildFailureException.class b/ReplicatorG/build/classes/replicatorg/app/exceptions/BuildFailureException.class deleted file mode 100644 index 95fef7c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/exceptions/BuildFailureException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/exceptions/GCodeException.class b/ReplicatorG/build/classes/replicatorg/app/exceptions/GCodeException.class deleted file mode 100644 index c2d776b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/exceptions/GCodeException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/exceptions/SerialException.class b/ReplicatorG/build/classes/replicatorg/app/exceptions/SerialException.class deleted file mode 100644 index 75cfe8f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/exceptions/SerialException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/exceptions/TimeoutException.class b/ReplicatorG/build/classes/replicatorg/app/exceptions/TimeoutException.class deleted file mode 100644 index 9455511..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/exceptions/TimeoutException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/exceptions/UnknownSerialPortException.class b/ReplicatorG/build/classes/replicatorg/app/exceptions/UnknownSerialPortException.class deleted file mode 100644 index 94bdf1f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/exceptions/UnknownSerialPortException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/CTokenMarker.class b/ReplicatorG/build/classes/replicatorg/app/syntax/CTokenMarker.class deleted file mode 100644 index f10a9da..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/CTokenMarker.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/DefaultInputHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/DefaultInputHandler.class deleted file mode 100644 index 4f88086..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/DefaultInputHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$MacroRecorder.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$MacroRecorder.class deleted file mode 100644 index 2abc923..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$MacroRecorder.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$NonRecordable.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$NonRecordable.class deleted file mode 100644 index bb1db9c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$NonRecordable.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$NonRepeatable.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$NonRepeatable.class deleted file mode 100644 index 3634ca2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$NonRepeatable.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$Wrapper.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$Wrapper.class deleted file mode 100644 index 45bd62c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$Wrapper.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$backspace.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$backspace.class deleted file mode 100644 index b0c59c5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$backspace.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$backspace_word.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$backspace_word.class deleted file mode 100644 index ad47d79..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$backspace_word.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$delete.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$delete.class deleted file mode 100644 index 0bdfd43..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$delete.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$delete_word.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$delete_word.class deleted file mode 100644 index e09fa9e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$delete_word.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$document_end.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$document_end.class deleted file mode 100644 index 28b1ecb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$document_end.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$document_home.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$document_home.class deleted file mode 100644 index cb22fc3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$document_home.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$end.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$end.class deleted file mode 100644 index 5a05249..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$end.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$home.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$home.class deleted file mode 100644 index 1d7e2c3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$home.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_break.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_break.class deleted file mode 100644 index a3a093c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_break.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_char.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_char.class deleted file mode 100644 index cb5e344..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_char.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_tab.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_tab.class deleted file mode 100644 index 7cabca9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$insert_tab.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_char.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_char.class deleted file mode 100644 index babe699..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_char.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_line.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_line.class deleted file mode 100644 index 28a1c51..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_line.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_page.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_page.class deleted file mode 100644 index 836bd7c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_page.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_word.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_word.class deleted file mode 100644 index 08aa259..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$next_word.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$overwrite.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$overwrite.class deleted file mode 100644 index f9d2418..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$overwrite.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_char.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_char.class deleted file mode 100644 index 8923124..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_char.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_line.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_line.class deleted file mode 100644 index f30fbb5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_line.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_page.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_page.class deleted file mode 100644 index 71f2eee..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_page.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_word.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_word.class deleted file mode 100644 index 2ac6afc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$prev_word.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$repeat.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$repeat.class deleted file mode 100644 index dd9d41e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$repeat.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$toggle_rect.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$toggle_rect.class deleted file mode 100644 index a218c89..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler$toggle_rect.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler.class deleted file mode 100644 index 12e0626..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/InputHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$1.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$1.class deleted file mode 100644 index dc1411d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$AdjustHandler$1.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$AdjustHandler$1.class deleted file mode 100644 index 3b7d541..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$AdjustHandler$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$AdjustHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$AdjustHandler.class deleted file mode 100644 index 98c334d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$AdjustHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$CaretBlinker.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$CaretBlinker.class deleted file mode 100644 index c16643a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$CaretBlinker.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$CaretUndo.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$CaretUndo.class deleted file mode 100644 index f3b9304..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$CaretUndo.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$ComponentHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$ComponentHandler.class deleted file mode 100644 index fbf8ce5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$ComponentHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$DocumentHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$DocumentHandler.class deleted file mode 100644 index 6c43928..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$DocumentHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$DragHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$DragHandler.class deleted file mode 100644 index bd6aba0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$DragHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$FocusHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$FocusHandler.class deleted file mode 100644 index 22fd165..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$FocusHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$MouseHandler.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$MouseHandler.class deleted file mode 100644 index fc16600..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$MouseHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$MutableCaretEvent.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$MutableCaretEvent.class deleted file mode 100644 index d5ad9f1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$MutableCaretEvent.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$ScrollLayout.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$ScrollLayout.class deleted file mode 100644 index 8413e88..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea$ScrollLayout.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea.class b/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea.class deleted file mode 100644 index 5a18ed9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/JEditTextArea.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/KeywordMap$Keyword.class b/ReplicatorG/build/classes/replicatorg/app/syntax/KeywordMap$Keyword.class deleted file mode 100644 index a226219..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/KeywordMap$Keyword.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/KeywordMap.class b/ReplicatorG/build/classes/replicatorg/app/syntax/KeywordMap.class deleted file mode 100644 index 3969fe5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/KeywordMap.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/PdeKeywords.class b/ReplicatorG/build/classes/replicatorg/app/syntax/PdeKeywords.class deleted file mode 100644 index ff9803e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/PdeKeywords.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/PdeTextAreaDefaults.class b/ReplicatorG/build/classes/replicatorg/app/syntax/PdeTextAreaDefaults.class deleted file mode 100644 index 3b15ace..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/PdeTextAreaDefaults.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxDocument.class b/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxDocument.class deleted file mode 100644 index 4b85210..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxDocument.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxStyle.class b/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxStyle.class deleted file mode 100644 index 361050d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxStyle.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxUtilities.class b/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxUtilities.class deleted file mode 100644 index 393ba1f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/SyntaxUtilities.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaDefaults.class b/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaDefaults.class deleted file mode 100644 index efbf31d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaDefaults.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaPainter$Highlight.class b/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaPainter$Highlight.class deleted file mode 100644 index 9a5d795..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaPainter$Highlight.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaPainter.class b/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaPainter.class deleted file mode 100644 index 30d04e3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/TextAreaPainter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/TextUtilities.class b/ReplicatorG/build/classes/replicatorg/app/syntax/TextUtilities.class deleted file mode 100644 index 46bccb0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/TextUtilities.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/Token.class b/ReplicatorG/build/classes/replicatorg/app/syntax/Token.class deleted file mode 100644 index c65cac8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/Token.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/TokenMarker$LineInfo.class b/ReplicatorG/build/classes/replicatorg/app/syntax/TokenMarker$LineInfo.class deleted file mode 100644 index e7a7fa5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/TokenMarker$LineInfo.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/syntax/TokenMarker.class b/ReplicatorG/build/classes/replicatorg/app/syntax/TokenMarker.class deleted file mode 100644 index 43af414..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/syntax/TokenMarker.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/tools/IButtonCrc.class b/ReplicatorG/build/classes/replicatorg/app/tools/IButtonCrc.class deleted file mode 100644 index b97a13c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/tools/IButtonCrc.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/tools/XML.class b/ReplicatorG/build/classes/replicatorg/app/tools/XML.class deleted file mode 100644 index 5682606..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/tools/XML.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField$NotifyingKeyListener.class b/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField$NotifyingKeyListener.class deleted file mode 100644 index dce7a80..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField$NotifyingKeyListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField$StoringFocusListener.class b/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField$StoringFocusListener.class deleted file mode 100644 index e3921eb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField$StoringFocusListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField.class b/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField.class deleted file mode 100644 index b4ab26c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ActionTextField.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/AdvancedPrefs$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/AdvancedPrefs$1.class deleted file mode 100644 index 7d13a97..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/AdvancedPrefs$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/AdvancedPrefs.class b/ReplicatorG/build/classes/replicatorg/app/ui/AdvancedPrefs.class deleted file mode 100644 index ee9a5c8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/AdvancedPrefs.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BGPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/BGPanel.class deleted file mode 100644 index 2ce5ca5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BGPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BufferedStyledDocument.class b/ReplicatorG/build/classes/replicatorg/app/ui/BufferedStyledDocument.class deleted file mode 100644 index c78ea55..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BufferedStyledDocument.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog$1.class deleted file mode 100644 index ea9864a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog$2.class deleted file mode 100644 index de1408e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog.class b/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog.class deleted file mode 100644 index 6d335dd..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BuildNamingDialog.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$1.class deleted file mode 100644 index b9a27f9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$2.class deleted file mode 100644 index e131270..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$3.class deleted file mode 100644 index 928608a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog.class b/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog.class deleted file mode 100644 index 1a4cf02..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/BuildSelectionDialog.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CallbackTextField.class b/ReplicatorG/build/classes/replicatorg/app/ui/CallbackTextField.class deleted file mode 100644 index 8cc96ed..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CallbackTextField.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CollapsableContainer$Header.class b/ReplicatorG/build/classes/replicatorg/app/ui/CollapsableContainer$Header.class deleted file mode 100644 index 2c726d2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CollapsableContainer$Header.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CollapsableContainer.class b/ReplicatorG/build/classes/replicatorg/app/ui/CollapsableContainer.class deleted file mode 100644 index 378aa0a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CollapsableContainer.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$1.class deleted file mode 100644 index bae2f5e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$2.class deleted file mode 100644 index 47199c5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$3.class deleted file mode 100644 index 860ee14..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$4.class deleted file mode 100644 index 1420808..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$5.class b/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$5.class deleted file mode 100644 index ba04f47..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow.class deleted file mode 100644 index 6997d39..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/CombineWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$1.class deleted file mode 100644 index 56762cb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$2.class deleted file mode 100644 index 677d60d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$3.class deleted file mode 100644 index 7d41fdb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$4.class deleted file mode 100644 index 9aa7429..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$5.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$5.class deleted file mode 100644 index 8e1dd20..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$6.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$6.class deleted file mode 100644 index c4807d9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$7.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$7.class deleted file mode 100644 index b2d0939..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow$7.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow.class deleted file mode 100644 index 366f0fe..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/DualStrusionWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$1.class deleted file mode 100644 index 471693b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$TabButton.class b/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$TabButton.class deleted file mode 100644 index d2c5b80..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$TabButton.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$TabButtonUI.class b/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$TabButtonUI.class deleted file mode 100644 index 08f7d5f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader$TabButtonUI.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader.class b/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader.class deleted file mode 100644 index 7555bca..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/EditorHeader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$1.class deleted file mode 100644 index e64d876..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$2.class deleted file mode 100644 index 93b09eb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$BackoffPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$BackoffPanel.class deleted file mode 100644 index de05553..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$BackoffPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$Commitable.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$Commitable.class deleted file mode 100644 index a1272c1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$Commitable.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$ExtraFeaturesPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$ExtraFeaturesPanel.class deleted file mode 100644 index 262bd4c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$ExtraFeaturesPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$PIDPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$PIDPanel.class deleted file mode 100644 index 813a3fa..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$PIDPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$RegulatedCoolingFan.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$RegulatedCoolingFan.class deleted file mode 100644 index 4b8928f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$RegulatedCoolingFan.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$ThermistorTablePanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$ThermistorTablePanel.class deleted file mode 100644 index 4d15bfb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters$ThermistorTablePanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters.class b/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters.class deleted file mode 100644 index 3de89aa..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ExtruderOnboardParameters.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$1.class deleted file mode 100644 index 14afb02..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$2.class deleted file mode 100644 index cc78ee8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$3.class deleted file mode 100644 index 608f2af..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$4.class deleted file mode 100644 index 59e001f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace.class b/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace.class deleted file mode 100644 index 548b247..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/FindReplace.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/GcodeSaveWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/GcodeSaveWindow.class deleted file mode 100644 index 32f0669..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/GcodeSaveWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/GcodeSelectWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/GcodeSelectWindow.class deleted file mode 100644 index f212919..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/GcodeSelectWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/GuiConstants.class b/ReplicatorG/build/classes/replicatorg/app/ui/GuiConstants.class deleted file mode 100644 index 8fb15b8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/GuiConstants.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/InfoPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/InfoPanel.class deleted file mode 100644 index 9a86234..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/InfoPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$1.class deleted file mode 100644 index e859179..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$2.class deleted file mode 100644 index 7d44509..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$3.class deleted file mode 100644 index 355b75d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters.class deleted file mode 100644 index 051527b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineOnboardParameters.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$1.class deleted file mode 100644 index 283923b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$2.class deleted file mode 100644 index 1bd7a07..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$3.class deleted file mode 100644 index 1dd48d7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$4.class deleted file mode 100644 index 55ede5e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel.class deleted file mode 100644 index 1dfc48e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MachineStatusPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel$1.class deleted file mode 100644 index 4d60171..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel$MainButton.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel$MainButton.class deleted file mode 100644 index 6632aef..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel$MainButton.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel.class deleted file mode 100644 index ddfced5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainButtonPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$1.class deleted file mode 100644 index c9f0aa1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$10.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$10.class deleted file mode 100644 index 8c8780f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$10.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$11.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$11.class deleted file mode 100644 index ff42491..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$11.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$12.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$12.class deleted file mode 100644 index 262a2f8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$12.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$13.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$13.class deleted file mode 100644 index 29338d5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$13.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$14.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$14.class deleted file mode 100644 index 0874363..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$14.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$15.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$15.class deleted file mode 100644 index 8e06e9a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$15.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$16.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$16.class deleted file mode 100644 index 4b2cf61..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$16.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$17.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$17.class deleted file mode 100644 index e433740..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$17.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$18.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$18.class deleted file mode 100644 index 1a1cf59..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$18.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$19.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$19.class deleted file mode 100644 index 5b2852f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$19.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$2.class deleted file mode 100644 index c2075bb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$20.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$20.class deleted file mode 100644 index 1110452..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$20.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$21.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$21.class deleted file mode 100644 index 5d2b2de..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$21.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$22.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$22.class deleted file mode 100644 index 5f22e3a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$22.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$23.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$23.class deleted file mode 100644 index 406fade..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$23.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$24.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$24.class deleted file mode 100644 index c28d460..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$24.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$25.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$25.class deleted file mode 100644 index f76abd6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$25.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$26.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$26.class deleted file mode 100644 index 78b360f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$26.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$27.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$27.class deleted file mode 100644 index 31bc3f3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$27.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$28.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$28.class deleted file mode 100644 index ef34820..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$28.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$29.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$29.class deleted file mode 100644 index e1d8078..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$29.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$3.class deleted file mode 100644 index 6f9b900..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$30.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$30.class deleted file mode 100644 index 22d8d8d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$30.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$31.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$31.class deleted file mode 100644 index 5d8564b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$31.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$32.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$32.class deleted file mode 100644 index 553052d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$32.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$33.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$33.class deleted file mode 100644 index 888e948..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$33.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$34.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$34.class deleted file mode 100644 index 779b53b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$34.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$35.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$35.class deleted file mode 100644 index c37e577..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$35.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$36.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$36.class deleted file mode 100644 index 59b8051..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$36.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$37.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$37.class deleted file mode 100644 index e207e15..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$37.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$38.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$38.class deleted file mode 100644 index 6987158..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$38.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$39.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$39.class deleted file mode 100644 index 6d16ead..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$39.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$4.class deleted file mode 100644 index 4752abf..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$40.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$40.class deleted file mode 100644 index fed091d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$40.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$41.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$41.class deleted file mode 100644 index 58e2671..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$41.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$42.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$42.class deleted file mode 100644 index e1231d6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$42.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$43.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$43.class deleted file mode 100644 index 51ffb26..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$43.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$44.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$44.class deleted file mode 100644 index cbf3a69..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$44.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$45.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$45.class deleted file mode 100644 index c4af1fb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$45.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$46.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$46.class deleted file mode 100644 index 167958b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$46.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$47.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$47.class deleted file mode 100644 index b498cac..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$47.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$5.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$5.class deleted file mode 100644 index 5fdfb96..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$6.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$6.class deleted file mode 100644 index e8f3ad2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$7.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$7.class deleted file mode 100644 index 11d9dc0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$7.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$8.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$8.class deleted file mode 100644 index b135398..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$8.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$9.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$9.class deleted file mode 100644 index f44b3b5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$9.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$EstimationThread.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$EstimationThread.class deleted file mode 100644 index b499d31..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$EstimationThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$ExtensionFilter.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$ExtensionFilter.class deleted file mode 100644 index af63967..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$ExtensionFilter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$FileOpenActionListener.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$FileOpenActionListener.class deleted file mode 100644 index a3b4562..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$FileOpenActionListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$MachineMenuListener.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$MachineMenuListener.class deleted file mode 100644 index 5b48c13..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$MachineMenuListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$RedoAction.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$RedoAction.class deleted file mode 100644 index f7770a4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$RedoAction.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SerialMenuListener.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SerialMenuListener.class deleted file mode 100644 index ae5c8aa..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SerialMenuListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SimulationThread$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SimulationThread$1.class deleted file mode 100644 index 4c68932..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SimulationThread$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SimulationThread.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SimulationThread.class deleted file mode 100644 index 2efbd33..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$SimulationThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$1.class deleted file mode 100644 index 9b3d8b5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$2.class deleted file mode 100644 index 866041e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$3.class deleted file mode 100644 index a6a26db..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$4.class deleted file mode 100644 index 8844f71..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup.class deleted file mode 100644 index 9ad7a47..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$TextAreaPopup.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$UndoAction.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$UndoAction.class deleted file mode 100644 index b5259fc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow$UndoAction.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow.class deleted file mode 100644 index 965b755..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MainWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel$1.class deleted file mode 100644 index 4eb3ef1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel$2.class deleted file mode 100644 index 246f6c1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel.class deleted file mode 100644 index 1a93f61..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/MessagePanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$1.class deleted file mode 100644 index 3c1bab6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$BaseNotificationHandler.class b/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$BaseNotificationHandler.class deleted file mode 100644 index 1e3c01b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$BaseNotificationHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$Factory.class b/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$Factory.class deleted file mode 100644 index bafda06..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$Factory.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$JOptionPaneNotificationHandler.class b/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$JOptionPaneNotificationHandler.class deleted file mode 100644 index 9e40c15..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$JOptionPaneNotificationHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$SystemTrayNotifactionHandler$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$SystemTrayNotifactionHandler$1.class deleted file mode 100644 index a9fe9b3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$SystemTrayNotifactionHandler$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$SystemTrayNotifactionHandler.class b/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$SystemTrayNotifactionHandler.class deleted file mode 100644 index 327b8c4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler$SystemTrayNotifactionHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler.class b/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler.class deleted file mode 100644 index e4796b7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/NotificationHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$1.class deleted file mode 100644 index 7a67771..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$10.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$10.class deleted file mode 100644 index a12ff95..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$10.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$11.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$11.class deleted file mode 100644 index be71c9f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$11.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$12.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$12.class deleted file mode 100644 index d0e5e44..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$12.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$13.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$13.class deleted file mode 100644 index a678df3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$13.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$14.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$14.class deleted file mode 100644 index 2123a1c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$14.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$1RadioAction.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$1RadioAction.class deleted file mode 100644 index 782628d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$1RadioAction.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$2.class deleted file mode 100644 index 26eb894..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$3.class deleted file mode 100644 index 3786efc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$4.class deleted file mode 100644 index 4dcec56..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$5.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$5.class deleted file mode 100644 index 7bdf277..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$6.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$6.class deleted file mode 100644 index d062972..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$7.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$7.class deleted file mode 100644 index f611505..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$7.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$8.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$8.class deleted file mode 100644 index 32dffa3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$8.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$9.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$9.class deleted file mode 100644 index 352efbd..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow$9.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow.class deleted file mode 100644 index 4ea261a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/PreferencesWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$1.class deleted file mode 100644 index 762c027..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$ControlSlider.class b/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$ControlSlider.class deleted file mode 100644 index 80ca3c8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$ControlSlider.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$SpeedLimit.class b/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$SpeedLimit.class deleted file mode 100644 index 25544b4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel$SpeedLimit.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel.class deleted file mode 100644 index ce59f45..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/RealtimePanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SavingTextField.class b/ReplicatorG/build/classes/replicatorg/app/ui/SavingTextField.class deleted file mode 100644 index 6aeb064..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SavingTextField.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow.class deleted file mode 100644 index 6cc9967..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$BuildView.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$BuildView.class deleted file mode 100644 index 2ce6bb3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$BuildView.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$GenericRuler$IncrementInfo.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$GenericRuler$IncrementInfo.class deleted file mode 100644 index c6e22bf..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$GenericRuler$IncrementInfo.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$GenericRuler.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$GenericRuler.class deleted file mode 100644 index c5b1df3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$GenericRuler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$HorizontalRuler.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$HorizontalRuler.class deleted file mode 100644 index 8bd85ba..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$HorizontalRuler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$MyComponent.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$MyComponent.class deleted file mode 100644 index 8539e96..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$MyComponent.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$VerticalRuler.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$VerticalRuler.class deleted file mode 100644 index 962927a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D$VerticalRuler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D.class b/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D.class deleted file mode 100644 index 6471bd3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SimulationWindow2D.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$1.class deleted file mode 100644 index 832a490..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$2.class deleted file mode 100644 index 306746b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$3.class deleted file mode 100644 index 887aa52..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen.class b/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen.class deleted file mode 100644 index e9cafdb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/SplashScreen.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer$1.class deleted file mode 100644 index a25bc22..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer$2.class deleted file mode 100644 index 15ece1b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer.class b/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer.class deleted file mode 100644 index f98bac2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/ToolheadIndexer.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$1.class deleted file mode 100644 index 4b1b728..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$2.class deleted file mode 100644 index d02e4e0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$3.class deleted file mode 100644 index 8a37761..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$4.class deleted file mode 100644 index 48a26b0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$5.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$5.class deleted file mode 100644 index 42d9eb0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$PollThread.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$PollThread.class deleted file mode 100644 index a210909..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$PollThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$UpdateThread.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$UpdateThread.class deleted file mode 100644 index 9a96684..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow$UpdateThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow.class deleted file mode 100644 index 0cd78e0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ControlPanelWindow.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ExtruderPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ExtruderPanel.class deleted file mode 100644 index 8bf93a1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/ExtruderPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$1.class deleted file mode 100644 index 2940093..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$FeedrateControl.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$FeedrateControl.class deleted file mode 100644 index 4f94f9f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$FeedrateControl.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$JogButton.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$JogButton.class deleted file mode 100644 index 0803be9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel$JogButton.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel.class deleted file mode 100644 index 2f171b4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/controlpanel/JogPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/EditingModel$ReferenceFrame.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/EditingModel$ReferenceFrame.class deleted file mode 100644 index 5e59b72..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/EditingModel$ReferenceFrame.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/EditingModel.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/EditingModel.class deleted file mode 100644 index d35d1cf..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/EditingModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$1.class deleted file mode 100644 index 0af1dd9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$2.class deleted file mode 100644 index ca04194..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$3.class deleted file mode 100644 index d561b20..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool.class deleted file mode 100644 index 9bc05c4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MirrorTool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$1.class deleted file mode 100644 index 3bf9526..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$2.class deleted file mode 100644 index 2d6c5b1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$3.class deleted file mode 100644 index f8a4028..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$4.class deleted file mode 100644 index c1e8385..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$5.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$5.class deleted file mode 100644 index 5fdab36..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$6.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$6.class deleted file mode 100644 index 26f3843..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$7.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$7.class deleted file mode 100644 index 1d3c836..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$7.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$8.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$8.class deleted file mode 100644 index fdfc2ea..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$8.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$9.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$9.class deleted file mode 100644 index 9aca527..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool$9.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool.class deleted file mode 100644 index 20ce526..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/MoveTool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$1.class deleted file mode 100644 index ce4c1e4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$2.class deleted file mode 100644 index cb3e8db..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$DragMode.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$DragMode.class deleted file mode 100644 index 86b1b84..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel$DragMode.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel.class deleted file mode 100644 index eec6a12..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/PreviewPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$1.class deleted file mode 100644 index c4a9288..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$2.class deleted file mode 100644 index e31e02a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$3.class deleted file mode 100644 index 3446937..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$4.class deleted file mode 100644 index 367fafc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$5.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$5.class deleted file mode 100644 index 8ee0e34..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$6.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$6.class deleted file mode 100644 index cec385c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$7.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$7.class deleted file mode 100644 index af3afc0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$7.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$8.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$8.class deleted file mode 100644 index 0f741e0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool$8.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool.class deleted file mode 100644 index 6c73a1c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/RotationTool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$1.class deleted file mode 100644 index 4742c9c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$2.class deleted file mode 100644 index 0a847a2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$3.class deleted file mode 100644 index b637ddc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$4.class deleted file mode 100644 index 4d48a38..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool.class deleted file mode 100644 index 55622f4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ScalingTool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$1.class deleted file mode 100644 index 3c8fd18..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$AxisControl.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$AxisControl.class deleted file mode 100644 index cf00b5f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$AxisControl.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$CoordinateControl.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$CoordinateControl.class deleted file mode 100644 index 0d948cc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool$CoordinateControl.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool.class deleted file mode 100644 index a9c518c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/Tool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel$1.class deleted file mode 100644 index b1d99ff..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel$2.class deleted file mode 100644 index 6c8f201..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel.class deleted file mode 100644 index 92c9e6c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ToolPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$1.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$1.class deleted file mode 100644 index bdb6d1a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$2.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$2.class deleted file mode 100644 index 33b31b2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$3.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$3.class deleted file mode 100644 index e7337a8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$4.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$4.class deleted file mode 100644 index c74c103..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool.class b/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool.class deleted file mode 100644 index a343fec..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/modeling/ViewTool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/ui/myFileFilter.class b/ReplicatorG/build/classes/replicatorg/app/ui/myFileFilter.class deleted file mode 100644 index 74400fd..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/ui/myFileFilter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$1.class b/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$1.class deleted file mode 100644 index 178e40e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$Selector.class b/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$Selector.class deleted file mode 100644 index 84c0d21..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$Selector.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$Version.class b/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$Version.class deleted file mode 100644 index 936b1e6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils$Version.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils.class b/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils.class deleted file mode 100644 index 7eebf52..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/PythonUtils.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/StreamLoggerThread.class b/ReplicatorG/build/classes/replicatorg/app/util/StreamLoggerThread.class deleted file mode 100644 index db7ede4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/StreamLoggerThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$1.class b/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$1.class deleted file mode 100644 index 6ce8f5c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$2.class b/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$2.class deleted file mode 100644 index 19958dc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$3.class b/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$3.class deleted file mode 100644 index 39b915c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector.class b/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector.class deleted file mode 100644 index c8388d1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/SwingPythonSelector.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/serial/ByteFifo.class b/ReplicatorG/build/classes/replicatorg/app/util/serial/ByteFifo.class deleted file mode 100644 index f92112a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/serial/ByteFifo.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/serial/Name.class b/ReplicatorG/build/classes/replicatorg/app/util/serial/Name.class deleted file mode 100644 index 822d82c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/serial/Name.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/serial/Serial.class b/ReplicatorG/build/classes/replicatorg/app/util/serial/Serial.class deleted file mode 100644 index be52d79..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/serial/Serial.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/app/util/serial/SerialFifoEventListener.class b/ReplicatorG/build/classes/replicatorg/app/util/serial/SerialFifoEventListener.class deleted file mode 100644 index b7ea8a1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/app/util/serial/SerialFifoEventListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/BadFirmwareVersionException.class b/ReplicatorG/build/classes/replicatorg/drivers/BadFirmwareVersionException.class deleted file mode 100644 index a2ff963..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/BadFirmwareVersionException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/Driver.class b/ReplicatorG/build/classes/replicatorg/drivers/Driver.class deleted file mode 100644 index a521b80..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/Driver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/DriverBaseImplementation.class b/ReplicatorG/build/classes/replicatorg/drivers/DriverBaseImplementation.class deleted file mode 100644 index 57caa83..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/DriverBaseImplementation.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/DriverError.class b/ReplicatorG/build/classes/replicatorg/drivers/DriverError.class deleted file mode 100644 index 8b2cc0c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/DriverError.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/DriverFactory.class b/ReplicatorG/build/classes/replicatorg/drivers/DriverFactory.class deleted file mode 100644 index a37752c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/DriverFactory.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/DriverQueryInterface.class b/ReplicatorG/build/classes/replicatorg/drivers/DriverQueryInterface.class deleted file mode 100644 index ec81179..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/DriverQueryInterface.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/EstimationDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/EstimationDriver.class deleted file mode 100644 index e048d45..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/EstimationDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/MultiTool.class b/ReplicatorG/build/classes/replicatorg/drivers/MultiTool.class deleted file mode 100644 index 87fca96..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/MultiTool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/NullDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/NullDriver.class deleted file mode 100644 index b7e3805..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/NullDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$BackoffParameters.class b/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$BackoffParameters.class deleted file mode 100644 index 2089a2a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$BackoffParameters.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$CommunicationStatistics.class b/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$CommunicationStatistics.class deleted file mode 100644 index 9a10ac5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$CommunicationStatistics.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$EndstopType.class b/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$EndstopType.class deleted file mode 100644 index f0ee9dd..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$EndstopType.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$EstopType.class b/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$EstopType.class deleted file mode 100644 index fe247f7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$EstopType.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$ExtraFeatures.class b/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$ExtraFeatures.class deleted file mode 100644 index ced31ea..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$ExtraFeatures.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$PIDParameters.class b/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$PIDParameters.class deleted file mode 100644 index 3c12c4e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters$PIDParameters.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters.class b/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters.class deleted file mode 100644 index 65ee8bb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/OnboardParameters.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/PenPlotter.class b/ReplicatorG/build/classes/replicatorg/drivers/PenPlotter.class deleted file mode 100644 index 772fba7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/PenPlotter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/RealtimeControl.class b/ReplicatorG/build/classes/replicatorg/drivers/RealtimeControl.class deleted file mode 100644 index 46d1784..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/RealtimeControl.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/RetryException.class b/ReplicatorG/build/classes/replicatorg/drivers/RetryException.class deleted file mode 100644 index a349480..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/RetryException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/SDCardCapture$ResponseCode.class b/ReplicatorG/build/classes/replicatorg/drivers/SDCardCapture$ResponseCode.class deleted file mode 100644 index 3ee4371..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/SDCardCapture$ResponseCode.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/SDCardCapture.class b/ReplicatorG/build/classes/replicatorg/drivers/SDCardCapture.class deleted file mode 100644 index 44b2208..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/SDCardCapture.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/SerialDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/SerialDriver.class deleted file mode 100644 index 670bf07..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/SerialDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/SerialPassthroughDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/SerialPassthroughDriver.class deleted file mode 100644 index 8f38b26..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/SerialPassthroughDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/SimulationDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/SimulationDriver.class deleted file mode 100644 index 4654ce6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/SimulationDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/StopException$StopType.class b/ReplicatorG/build/classes/replicatorg/drivers/StopException$StopType.class deleted file mode 100644 index ff1fa82..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/StopException$StopType.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/StopException.class b/ReplicatorG/build/classes/replicatorg/drivers/StopException.class deleted file mode 100644 index 95ffd72..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/StopException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/UpdatableFirmware.class b/ReplicatorG/build/classes/replicatorg/drivers/UpdatableFirmware.class deleted file mode 100644 index e568c48..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/UpdatableFirmware.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/UsesSerial.class b/ReplicatorG/build/classes/replicatorg/drivers/UsesSerial.class deleted file mode 100644 index c892e0a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/UsesSerial.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/Version.class b/ReplicatorG/build/classes/replicatorg/drivers/Version.class deleted file mode 100644 index 6b2fea6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/Version.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/VersionException.class b/ReplicatorG/build/classes/replicatorg/drivers/VersionException.class deleted file mode 100644 index fa10e86..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/VersionException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/VirtualPrinter.class b/ReplicatorG/build/classes/replicatorg/drivers/VirtualPrinter.class deleted file mode 100644 index dd0cc24..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/VirtualPrinter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/AssessState.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/AssessState.class deleted file mode 100644 index ed30db5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/AssessState.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/ChangeGearRatio.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/ChangeGearRatio.class deleted file mode 100644 index 7a13a18..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/ChangeGearRatio.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseClamp.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseClamp.class deleted file mode 100644 index c3c129c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseClamp.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseCollet.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseCollet.class deleted file mode 100644 index 48117c9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseCollet.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseValve.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseValve.class deleted file mode 100644 index cef2798..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/CloseValve.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DataCaptureNote.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DataCaptureNote.class deleted file mode 100644 index 34a9058..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DataCaptureNote.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/Delay.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/Delay.class deleted file mode 100644 index d9e77a4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/Delay.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableAxes.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableAxes.class deleted file mode 100644 index d666e1e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableAxes.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableDrives.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableDrives.class deleted file mode 100644 index ce3466b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableDrives.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableFan.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableFan.class deleted file mode 100644 index bffa6df..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableFan.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableFloodCoolant.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableFloodCoolant.class deleted file mode 100644 index 4856f7a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableFloodCoolant.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableMistCoolant.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableMistCoolant.class deleted file mode 100644 index 5db6453..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableMistCoolant.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableMotor.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableMotor.class deleted file mode 100644 index f7ef2d1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableMotor.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableSpindle.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableSpindle.class deleted file mode 100644 index 53f6320..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DisableSpindle.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand$AxialDirection.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand$AxialDirection.class deleted file mode 100644 index 8451870..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand$AxialDirection.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand$LinearDirection.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand$LinearDirection.class deleted file mode 100644 index b854103..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand$LinearDirection.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand.class deleted file mode 100644 index 96ea4e1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/DriverCommand.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableAxes.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableAxes.class deleted file mode 100644 index 9e274db..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableAxes.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableDrives.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableDrives.class deleted file mode 100644 index a00c06f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableDrives.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableFan.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableFan.class deleted file mode 100644 index 3cfc071..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableFan.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableFloodCoolant.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableFloodCoolant.class deleted file mode 100644 index 2742620..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableFloodCoolant.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableMistCoolant.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableMistCoolant.class deleted file mode 100644 index ab5dec2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableMistCoolant.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableMotor.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableMotor.class deleted file mode 100644 index 912ce23..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableMotor.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableSpindle.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableSpindle.class deleted file mode 100644 index 14c9d32..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/EnableSpindle.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/GCodePassthrough.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/GCodePassthrough.class deleted file mode 100644 index dc57e24..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/GCodePassthrough.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/GetPosition.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/GetPosition.class deleted file mode 100644 index e05124b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/GetPosition.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/HomeAxes.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/HomeAxes.class deleted file mode 100644 index 3511d7b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/HomeAxes.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/Initialize.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/Initialize.class deleted file mode 100644 index 790d18b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/Initialize.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/InvalidatePosition.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/InvalidatePosition.class deleted file mode 100644 index a8cfa58..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/InvalidatePosition.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenClamp.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenClamp.class deleted file mode 100644 index 1dc910f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenClamp.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenCollet.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenCollet.class deleted file mode 100644 index 15d8f94..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenCollet.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenValve.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenValve.class deleted file mode 100644 index 14afe64..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/OpenValve.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/OptionalHalt.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/OptionalHalt.class deleted file mode 100644 index 08d8fd3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/OptionalHalt.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/ProgramEnd.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/ProgramEnd.class deleted file mode 100644 index 350b039..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/ProgramEnd.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/ProgramRewind.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/ProgramRewind.class deleted file mode 100644 index 5b1558d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/ProgramRewind.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/QueuePoint.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/QueuePoint.class deleted file mode 100644 index 32d2ee9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/QueuePoint.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/ReadTemperature.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/ReadTemperature.class deleted file mode 100644 index 993bb51..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/ReadTemperature.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/RecallHomePositions.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/RecallHomePositions.class deleted file mode 100644 index 6b95e4d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/RecallHomePositions.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/RequestToolChange.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/RequestToolChange.class deleted file mode 100644 index 36fd5fa..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/RequestToolChange.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SelectTool.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SelectTool.class deleted file mode 100644 index 7475cd3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SelectTool.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetAxisOffset$1.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetAxisOffset$1.class deleted file mode 100644 index cf1a2a9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetAxisOffset$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetAxisOffset.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetAxisOffset.class deleted file mode 100644 index 611cf5b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetAxisOffset.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetChamberTemperature.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetChamberTemperature.class deleted file mode 100644 index 6c0cdc9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetChamberTemperature.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetCurrentPosition.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetCurrentPosition.class deleted file mode 100644 index a9d6d5f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetCurrentPosition.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetFeedrate.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetFeedrate.class deleted file mode 100644 index 6de5c49..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetFeedrate.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorDirection.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorDirection.class deleted file mode 100644 index bcd76bc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorDirection.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorSpeedPWM.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorSpeedPWM.class deleted file mode 100644 index 6298fb6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorSpeedPWM.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorSpeedRPM.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorSpeedRPM.class deleted file mode 100644 index c0463da..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetMotorSpeedRPM.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetPlatformTemperature.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetPlatformTemperature.class deleted file mode 100644 index fe86081..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetPlatformTemperature.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetServo.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetServo.class deleted file mode 100644 index ddcffb4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetServo.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetSpindleDirection.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetSpindleDirection.class deleted file mode 100644 index 8248864..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetSpindleDirection.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetSpindleRPM.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetSpindleRPM.class deleted file mode 100644 index 3439c2c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetSpindleRPM.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetTemperature.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/SetTemperature.class deleted file mode 100644 index e5ddf55..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/SetTemperature.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/StartDataCapture.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/StartDataCapture.class deleted file mode 100644 index 658598e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/StartDataCapture.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/StopDataCapture.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/StopDataCapture.class deleted file mode 100644 index b2634c1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/StopDataCapture.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/StoreHomePositions.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/StoreHomePositions.class deleted file mode 100644 index ffa5c87..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/StoreHomePositions.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/ToggleAutomatedBuildPlatform.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/ToggleAutomatedBuildPlatform.class deleted file mode 100644 index da22a17..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/ToggleAutomatedBuildPlatform.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/UnconditionalHalt.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/UnconditionalHalt.class deleted file mode 100644 index 53fea3b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/UnconditionalHalt.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/UpdateManualControl.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/UpdateManualControl.class deleted file mode 100644 index 8da9887..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/UpdateManualControl.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/commands/WaitUntilBufferEmpty.class b/ReplicatorG/build/classes/replicatorg/drivers/commands/WaitUntilBufferEmpty.class deleted file mode 100644 index b1fffe9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/commands/WaitUntilBufferEmpty.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Makerbot4GAlternateDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Makerbot4GAlternateDriver.class deleted file mode 100644 index 3d4165a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Makerbot4GAlternateDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Makerbot4GDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Makerbot4GDriver.class deleted file mode 100644 index e5ea2e2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Makerbot4GDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/MotherboardCommandCode.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/MotherboardCommandCode.class deleted file mode 100644 index 175442f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/MotherboardCommandCode.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketBuilder.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketBuilder.class deleted file mode 100644 index c4baa32..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketBuilder.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketConstants.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketConstants.class deleted file mode 100644 index 9d65436..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketConstants.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$1.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$1.class deleted file mode 100644 index 851d66d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$CRCException.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$CRCException.class deleted file mode 100644 index 6b5c6f6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$CRCException.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$PacketState.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$PacketState.class deleted file mode 100644 index 4ac90e6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor$PacketState.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor.class deleted file mode 100644 index dc3f3db..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketProcessor.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketResponse$ResponseCode.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketResponse$ResponseCode.class deleted file mode 100644 index 91e2115..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketResponse$ResponseCode.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketResponse.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketResponse.class deleted file mode 100644 index 1d68e46..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/PacketResponse.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$1ThermistorConverter.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$1ThermistorConverter.class deleted file mode 100644 index 2990abc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$1ThermistorConverter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$CoolingFanOffsets.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$CoolingFanOffsets.class deleted file mode 100644 index fb034d1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$CoolingFanOffsets.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$ECBackoffOffsets.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$ECBackoffOffsets.class deleted file mode 100644 index 0fbebe3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$ECBackoffOffsets.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$ECThermistorOffsets.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$ECThermistorOffsets.class deleted file mode 100644 index 7283c7f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$ECThermistorOffsets.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$PIDOffsets.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$PIDOffsets.class deleted file mode 100644 index fd87d74..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver$PIDOffsets.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver.class deleted file mode 100644 index 1fa28a5..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/Sanguino3GDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/gen3/ToolCommandCode.class b/ReplicatorG/build/classes/replicatorg/drivers/gen3/ToolCommandCode.class deleted file mode 100644 index 93a2f35..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/gen3/ToolCommandCode.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/reprap/ExtrusionUpdater$Direction.class b/ReplicatorG/build/classes/replicatorg/drivers/reprap/ExtrusionUpdater$Direction.class deleted file mode 100644 index 16012cc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/reprap/ExtrusionUpdater$Direction.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/reprap/ExtrusionUpdater.class b/ReplicatorG/build/classes/replicatorg/drivers/reprap/ExtrusionUpdater.class deleted file mode 100644 index 24a6407..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/reprap/ExtrusionUpdater.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/reprap/RepRap5DDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/reprap/RepRap5DDriver.class deleted file mode 100644 index 9bd7cb6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/reprap/RepRap5DDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/drivers/reprap/SimpleRepRap5DDriver.class b/ReplicatorG/build/classes/replicatorg/drivers/reprap/SimpleRepRap5DDriver.class deleted file mode 100644 index 8cf87d9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/drivers/reprap/SimpleRepRap5DDriver.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/dualstrusion/CodeCombination.class b/ReplicatorG/build/classes/replicatorg/dualstrusion/CodeCombination.class deleted file mode 100644 index 8b47e01..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/dualstrusion/CodeCombination.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/dualstrusion/DualStrusionConstruction.class b/ReplicatorG/build/classes/replicatorg/dualstrusion/DualStrusionConstruction.class deleted file mode 100644 index 9110478..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/dualstrusion/DualStrusionConstruction.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/dualstrusion/DualStrusionWorker.class b/ReplicatorG/build/classes/replicatorg/dualstrusion/DualStrusionWorker.class deleted file mode 100644 index a8902ca..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/dualstrusion/DualStrusionWorker.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/dualstrusion/Layer.class b/ReplicatorG/build/classes/replicatorg/dualstrusion/Layer.class deleted file mode 100644 index 2461280..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/dualstrusion/Layer.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/dualstrusion/LayerHelper.class b/ReplicatorG/build/classes/replicatorg/dualstrusion/LayerHelper.class deleted file mode 100644 index 156ed03..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/dualstrusion/LayerHelper.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/dualstrusion/Toolheads.class b/ReplicatorG/build/classes/replicatorg/dualstrusion/Toolheads.class deleted file mode 100644 index 51b345e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/dualstrusion/Toolheads.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/Machine$JobTarget.class b/ReplicatorG/build/classes/replicatorg/machine/Machine$JobTarget.class deleted file mode 100644 index bcbba6a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/Machine$JobTarget.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/Machine$RequestType.class b/ReplicatorG/build/classes/replicatorg/machine/Machine$RequestType.class deleted file mode 100644 index 00476bf..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/Machine$RequestType.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/Machine.class b/ReplicatorG/build/classes/replicatorg/machine/Machine.class deleted file mode 100644 index 99d1eae..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/Machine.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineCallbackHandler.class b/ReplicatorG/build/classes/replicatorg/machine/MachineCallbackHandler.class deleted file mode 100644 index 3350eea..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineCallbackHandler.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineCommand.class b/ReplicatorG/build/classes/replicatorg/machine/MachineCommand.class deleted file mode 100644 index ff4e2db..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineCommand.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineFactory$MachineMap.class b/ReplicatorG/build/classes/replicatorg/machine/MachineFactory$MachineMap.class deleted file mode 100644 index 8266110..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineFactory$MachineMap.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineFactory.class b/ReplicatorG/build/classes/replicatorg/machine/MachineFactory.class deleted file mode 100644 index f4f4435..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineFactory.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineInterface.class b/ReplicatorG/build/classes/replicatorg/machine/MachineInterface.class deleted file mode 100644 index c644051..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineInterface.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineListener.class b/ReplicatorG/build/classes/replicatorg/machine/MachineListener.class deleted file mode 100644 index 694ad4d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineLoader.class b/ReplicatorG/build/classes/replicatorg/machine/MachineLoader.class deleted file mode 100644 index 3537121..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineLoader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineProgressEvent.class b/ReplicatorG/build/classes/replicatorg/machine/MachineProgressEvent.class deleted file mode 100644 index ac37b2a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineProgressEvent.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineState$State.class b/ReplicatorG/build/classes/replicatorg/machine/MachineState$State.class deleted file mode 100644 index c48f08d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineState$State.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineState.class b/ReplicatorG/build/classes/replicatorg/machine/MachineState.class deleted file mode 100644 index 40b07b4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineState.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineStateChangeEvent.class b/ReplicatorG/build/classes/replicatorg/machine/MachineStateChangeEvent.class deleted file mode 100644 index 5492e86..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineStateChangeEvent.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineThread$1.class b/ReplicatorG/build/classes/replicatorg/machine/MachineThread$1.class deleted file mode 100644 index 7970758..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineThread$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineThread$AssessStatusThread.class b/ReplicatorG/build/classes/replicatorg/machine/MachineThread$AssessStatusThread.class deleted file mode 100644 index ca7d71e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineThread$AssessStatusThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineThread$Timer.class b/ReplicatorG/build/classes/replicatorg/machine/MachineThread$Timer.class deleted file mode 100644 index e44d25b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineThread$Timer.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineThread.class b/ReplicatorG/build/classes/replicatorg/machine/MachineThread.class deleted file mode 100644 index 5f7dee2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/MachineToolStatusEvent.class b/ReplicatorG/build/classes/replicatorg/machine/MachineToolStatusEvent.class deleted file mode 100644 index af3d1fb..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/MachineToolStatusEvent.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/builder/Direct$1.class b/ReplicatorG/build/classes/replicatorg/machine/builder/Direct$1.class deleted file mode 100644 index 105f155..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/builder/Direct$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/builder/Direct$State.class b/ReplicatorG/build/classes/replicatorg/machine/builder/Direct$State.class deleted file mode 100644 index f154304..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/builder/Direct$State.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/builder/Direct.class b/ReplicatorG/build/classes/replicatorg/machine/builder/Direct.class deleted file mode 100644 index 395e142..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/builder/Direct.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/builder/MachineBuilder.class b/ReplicatorG/build/classes/replicatorg/machine/builder/MachineBuilder.class deleted file mode 100644 index cba6b53..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/builder/MachineBuilder.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/builder/ToLocalFile.class b/ReplicatorG/build/classes/replicatorg/machine/builder/ToLocalFile.class deleted file mode 100644 index 7b6481f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/builder/ToLocalFile.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/builder/ToRemoteFile.class b/ReplicatorG/build/classes/replicatorg/machine/builder/ToRemoteFile.class deleted file mode 100644 index 23aed27..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/builder/ToRemoteFile.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/builder/UsingRemoteFile.class b/ReplicatorG/build/classes/replicatorg/machine/builder/UsingRemoteFile.class deleted file mode 100644 index 58ca904..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/builder/UsingRemoteFile.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/AxisId.class b/ReplicatorG/build/classes/replicatorg/machine/model/AxisId.class deleted file mode 100644 index 42545b7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/AxisId.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/BuildVolume.class b/ReplicatorG/build/classes/replicatorg/machine/model/BuildVolume.class deleted file mode 100644 index 1127145..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/BuildVolume.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/ClampModel.class b/ReplicatorG/build/classes/replicatorg/machine/model/ClampModel.class deleted file mode 100644 index e75382b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/ClampModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/Endstops.class b/ReplicatorG/build/classes/replicatorg/machine/model/Endstops.class deleted file mode 100644 index b802ad8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/Endstops.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/ExclusionBox.class b/ReplicatorG/build/classes/replicatorg/machine/model/ExclusionBox.class deleted file mode 100644 index a1d8b02..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/ExclusionBox.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/ExclusionZoneModel.class b/ReplicatorG/build/classes/replicatorg/machine/model/ExclusionZoneModel.class deleted file mode 100644 index 76f8f35..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/ExclusionZoneModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/MachineModel.class b/ReplicatorG/build/classes/replicatorg/machine/model/MachineModel.class deleted file mode 100644 index 7324b8a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/MachineModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/ToolModel.class b/ReplicatorG/build/classes/replicatorg/machine/model/ToolModel.class deleted file mode 100644 index 46c003a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/ToolModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/WipeBoundary.class b/ReplicatorG/build/classes/replicatorg/machine/model/WipeBoundary.class deleted file mode 100644 index 4202703..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/WipeBoundary.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/machine/model/WipeModel.class b/ReplicatorG/build/classes/replicatorg/machine/model/WipeModel.class deleted file mode 100644 index d61f00d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/machine/model/WipeModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/Build.class b/ReplicatorG/build/classes/replicatorg/model/Build.class deleted file mode 100644 index ed907b3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/Build.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/BuildCode.class b/ReplicatorG/build/classes/replicatorg/model/BuildCode.class deleted file mode 100644 index 6853dd6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/BuildCode.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/BuildElement$Listener.class b/ReplicatorG/build/classes/replicatorg/model/BuildElement$Listener.class deleted file mode 100644 index 071e044..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/BuildElement$Listener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/BuildElement$Type.class b/ReplicatorG/build/classes/replicatorg/model/BuildElement$Type.class deleted file mode 100644 index 62b68d3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/BuildElement$Type.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/BuildElement.class b/ReplicatorG/build/classes/replicatorg/model/BuildElement.class deleted file mode 100644 index b3bb387..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/BuildElement.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/BuildModel$UndoEntry.class b/ReplicatorG/build/classes/replicatorg/model/BuildModel$UndoEntry.class deleted file mode 100644 index b474073..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/BuildModel$UndoEntry.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/BuildModel.class b/ReplicatorG/build/classes/replicatorg/model/BuildModel.class deleted file mode 100644 index 397bd3a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/BuildModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/GCodeSource.class b/ReplicatorG/build/classes/replicatorg/model/GCodeSource.class deleted file mode 100644 index 33f3c0a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/GCodeSource.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/GCodeSourceCollection$GCodeSourceCollectionIterator.class b/ReplicatorG/build/classes/replicatorg/model/GCodeSourceCollection$GCodeSourceCollectionIterator.class deleted file mode 100644 index 23d873b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/GCodeSourceCollection$GCodeSourceCollectionIterator.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/GCodeSourceCollection.class b/ReplicatorG/build/classes/replicatorg/model/GCodeSourceCollection.class deleted file mode 100644 index 85aa574..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/GCodeSourceCollection.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/JEditTextAreaSource$1.class b/ReplicatorG/build/classes/replicatorg/model/JEditTextAreaSource$1.class deleted file mode 100644 index f712829..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/JEditTextAreaSource$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/JEditTextAreaSource.class b/ReplicatorG/build/classes/replicatorg/model/JEditTextAreaSource.class deleted file mode 100644 index 5785fd0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/JEditTextAreaSource.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/StringListSource.class b/ReplicatorG/build/classes/replicatorg/model/StringListSource.class deleted file mode 100644 index b1aae8b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/StringListSource.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/j3d/ModelWriter.class b/ReplicatorG/build/classes/replicatorg/model/j3d/ModelWriter.class deleted file mode 100644 index edbada1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/j3d/ModelWriter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/model/j3d/StlAsciiWriter.class b/ReplicatorG/build/classes/replicatorg/model/j3d/StlAsciiWriter.class deleted file mode 100644 index 1d362b1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/model/j3d/StlAsciiWriter.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/MCodePlugin.class b/ReplicatorG/build/classes/replicatorg/plugin/MCodePlugin.class deleted file mode 100644 index 340ac3d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/MCodePlugin.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/PluginEngine$GCodeIterator.class b/ReplicatorG/build/classes/replicatorg/plugin/PluginEngine$GCodeIterator.class deleted file mode 100644 index 4d159f1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/PluginEngine$GCodeIterator.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/PluginEngine.class b/ReplicatorG/build/classes/replicatorg/plugin/PluginEngine.class deleted file mode 100644 index b9d58e2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/PluginEngine.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/PluginEntry.class b/ReplicatorG/build/classes/replicatorg/plugin/PluginEntry.class deleted file mode 100644 index 02493b2..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/PluginEntry.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/PluginLoader.class b/ReplicatorG/build/classes/replicatorg/plugin/PluginLoader.class deleted file mode 100644 index af04399..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/PluginLoader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/TwitterBotPlugin.class b/ReplicatorG/build/classes/replicatorg/plugin/TwitterBotPlugin.class deleted file mode 100644 index 3c0ff68..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/TwitterBotPlugin.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$1.class deleted file mode 100644 index 1599812..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$2.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$2.class deleted file mode 100644 index b588335..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$3.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$3.class deleted file mode 100644 index 9afec7d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog.class deleted file mode 100644 index 5d3b080..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ProgressDialog.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/SkeinStep.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/SkeinStep.class deleted file mode 100644 index f567d7d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/SkeinStep.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator$GeneratorListener$Completion.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator$GeneratorListener$Completion.class deleted file mode 100644 index b0625ac..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator$GeneratorListener$Completion.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator$GeneratorListener.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator$GeneratorListener.class deleted file mode 100644 index 0130ab8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator$GeneratorListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator.class deleted file mode 100644 index 238b37b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGenerator.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge31.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge31.class deleted file mode 100644 index 82673e3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge31.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge35.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge35.class deleted file mode 100644 index 1d71ae1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge35.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge40.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge40.class deleted file mode 100644 index a9420d7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge40.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge44.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge44.class deleted file mode 100644 index dcb90dc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge44.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge6.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge6.class deleted file mode 100644 index 42c20cd..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$1Skeinforge6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$ToolpathGeneratorDescriptor.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$ToolpathGeneratorDescriptor.class deleted file mode 100644 index 325ccb7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory$ToolpathGeneratorDescriptor.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory.class deleted file mode 100644 index f136548..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorFactory.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread$1.class deleted file mode 100644 index 088ff66..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread$2.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread$2.class deleted file mode 100644 index 41509a8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread.class deleted file mode 100644 index cad2162..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/ToolpathGeneratorThread.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$1.class deleted file mode 100644 index 2d24162..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$2.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$2.class deleted file mode 100644 index bfb0725..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$3.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$3.class deleted file mode 100644 index b236e97..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$4.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$4.class deleted file mode 100644 index bba3596..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog.class deleted file mode 100644 index e511e7d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ConfigurationDialog.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$1.class deleted file mode 100644 index 8a4ceb7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$2.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$2.class deleted file mode 100644 index e361047..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$3.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$3.class deleted file mode 100644 index 35e7346..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$4.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$4.class deleted file mode 100644 index 2910fa1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$5.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$5.class deleted file mode 100644 index 374bc55..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$6.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$6.class deleted file mode 100644 index 2dc9f23..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$7.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$7.class deleted file mode 100644 index 7044b56..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$7.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$8.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$8.class deleted file mode 100644 index 90a8ed4..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog$8.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog.class deleted file mode 100644 index 91f6e07..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/EditProfileDialog.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic$1.class deleted file mode 100644 index c2ae01c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic$ComboListener.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic$ComboListener.class deleted file mode 100644 index 2304960..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic$ComboListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic.class deleted file mode 100644 index 140bf7a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D$1.class deleted file mode 100644 index 2006e34..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D$ComboListener.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D$ComboListener.class deleted file mode 100644 index 1be471f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D$ComboListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D.class deleted file mode 100644 index 0e9903e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/PrintOMatic5D.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ProfileUtils.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ProfileUtils.class deleted file mode 100644 index f66ad0c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/ProfileUtils.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$1.class deleted file mode 100644 index ad891b6..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$Profile.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$Profile.class deleted file mode 100644 index 9322a58..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$Profile.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeBooleanPreference$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeBooleanPreference$1.class deleted file mode 100644 index c91761b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeBooleanPreference$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeBooleanPreference.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeBooleanPreference.class deleted file mode 100644 index 1abbfc3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeBooleanPreference.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeChoicePreference$1.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeChoicePreference$1.class deleted file mode 100644 index 8f74cb3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeChoicePreference$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeChoicePreference.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeChoicePreference.class deleted file mode 100644 index 682b0c8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeChoicePreference.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeOption.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeOption.class deleted file mode 100644 index 80136df..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgeOption.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgePreference.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgePreference.class deleted file mode 100644 index 91023a0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator$SkeinforgePreference.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator.class b/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator.class deleted file mode 100644 index 6b45210..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/AbstractFirmwareUploader.class b/ReplicatorG/build/classes/replicatorg/uploader/AbstractFirmwareUploader.class deleted file mode 100644 index 02aa99e..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/AbstractFirmwareUploader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/AvrdudeUploader$StreamDumper.class b/ReplicatorG/build/classes/replicatorg/uploader/AvrdudeUploader$StreamDumper.class deleted file mode 100644 index 74bf96c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/AvrdudeUploader$StreamDumper.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/AvrdudeUploader.class b/ReplicatorG/build/classes/replicatorg/uploader/AvrdudeUploader.class deleted file mode 100644 index 1169b0f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/AvrdudeUploader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareRetriever$UpdateStatus.class b/ReplicatorG/build/classes/replicatorg/uploader/FirmwareRetriever$UpdateStatus.class deleted file mode 100644 index 0b65775..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareRetriever$UpdateStatus.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareRetriever.class b/ReplicatorG/build/classes/replicatorg/uploader/FirmwareRetriever.class deleted file mode 100644 index 37da2ff..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareRetriever.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader$1.class b/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader$1.class deleted file mode 100644 index fc03159..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader$2.class b/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader$2.class deleted file mode 100644 index 7af5943..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader.class b/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader.class deleted file mode 100644 index a564d1d..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareUploader.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareVersion.class b/ReplicatorG/build/classes/replicatorg/uploader/FirmwareVersion.class deleted file mode 100644 index 8a14269..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/FirmwareVersion.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$1.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$1.class deleted file mode 100644 index ece458c..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardListCellRenderer.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardListCellRenderer.class deleted file mode 100644 index e5f36f7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardListCellRenderer.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardListModel.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardListModel.class deleted file mode 100644 index ad61317..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardListModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardSelectionListener.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardSelectionListener.class deleted file mode 100644 index bf92ac0..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel$BoardSelectionListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel.class deleted file mode 100644 index 41901cc..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/BoardSelectionPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$1.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$1.class deleted file mode 100644 index bcf89ae..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$FirmwareListModel.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$FirmwareListModel.class deleted file mode 100644 index 1a4dbd1..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$FirmwareListModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$FirmwareSelectionListener.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$FirmwareSelectionListener.class deleted file mode 100644 index b7be227..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel$FirmwareSelectionListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel.class deleted file mode 100644 index f3b5e0b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/FirmwareSelectionPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$1.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$1.class deleted file mode 100644 index 6e3f19a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$PortSelectionListener.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$PortSelectionListener.class deleted file mode 100644 index fc3ce6a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$PortSelectionListener.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$SerialListModel.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$SerialListModel.class deleted file mode 100644 index 9714151..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel$SerialListModel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel.class deleted file mode 100644 index 6b75474..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/PortSelectionPanel.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$1.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$1.class deleted file mode 100644 index 72add6a..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$1.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$2.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$2.class deleted file mode 100644 index 5983f1f..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$2.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$3.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$3.class deleted file mode 100644 index 0ccdda3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$3.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$4.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$4.class deleted file mode 100644 index 37c73e8..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$4.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$5.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$5.class deleted file mode 100644 index a0794d9..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$5.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$6.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$6.class deleted file mode 100644 index 741bc3b..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$6.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$State.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$State.class deleted file mode 100644 index 58494b7..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog$State.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog.class b/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog.class deleted file mode 100644 index 8298be3..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/uploader/ui/UploaderDialog.class and /dev/null differ diff --git a/ReplicatorG/build/classes/replicatorg/util/Point5d.class b/ReplicatorG/build/classes/replicatorg/util/Point5d.class deleted file mode 100644 index b1d5160..0000000 Binary files a/ReplicatorG/build/classes/replicatorg/util/Point5d.class and /dev/null differ diff --git a/ReplicatorG/build/classes/sources/align-with-floor.svg b/ReplicatorG/build/classes/sources/align-with-floor.svg deleted file mode 100644 index 152672f..0000000 --- a/ReplicatorG/build/classes/sources/align-with-floor.svg +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/arrows.dxf b/ReplicatorG/build/classes/sources/arrows.dxf deleted file mode 100644 index 6d1c345..0000000 --- a/ReplicatorG/build/classes/sources/arrows.dxf +++ /dev/null @@ -1,2388 +0,0 @@ -999 -dxflib 2.2.0.0 - 0 -SECTION - 2 -HEADER - 9 -$ACADVER - 1 -AC1015 - 9 -$HANDSEED - 5 -FFFF - 9 -$DIMASZ - 40 -2.5 - 9 -$PLIMMIN - 10 -0.0 - 20 -0.0 - 9 -$DIMEXE - 40 -1.25 - 9 -$DIMGAP - 40 -0.625 - 9 -$PLIMMAX - 10 -210.0 - 20 -297.0 - 9 -$INSUNITS - 70 -4 - 9 -$DIMEXO - 40 -0.625 - 9 -$DIMTXT - 40 -2.5 - 9 -$CLAYER - 8 -0 - 0 -ENDSEC - 0 -SECTION - 2 -TABLES - 0 -TABLE - 2 -VPORT - 5 -8 -100 -AcDbSymbolTable - 70 -1 - 0 -VPORT - 5 -30 -100 -AcDbSymbolTableRecord -100 -AcDbViewportTableRecord - 2 -*Active - 70 -0 - 10 -0.0 - 20 -0.0 - 11 -1.0 - 21 -1.0 - 12 -286.3055555555554861 - 22 -148.5 - 13 -0.0 - 23 -0.0 - 14 -10.0 - 24 -10.0 - 15 -10.0 - 25 -10.0 - 16 -0.0 - 26 -0.0 - 36 -1.0 - 17 -0.0 - 27 -0.0 - 37 -0.0 - 40 -297.0 - 41 -1.92798353909465 - 42 -50.0 - 43 -0.0 - 44 -0.0 - 50 -0.0 - 51 -0.0 - 71 -0 - 72 -100 - 73 -1 - 74 -3 - 75 -1 - 76 -1 - 77 -0 - 78 -0 -281 -0 - 65 -1 -110 -0.0 -120 -0.0 -130 -0.0 -111 -1.0 -121 -0.0 -131 -0.0 -112 -0.0 -122 -1.0 -132 -0.0 - 79 -0 -146 -0.0 - 0 -ENDTAB - 0 -TABLE - 2 -LTYPE - 5 -5 -100 -AcDbSymbolTable - 70 -21 - 0 -LTYPE - 5 -14 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -ByBlock - 70 -0 - 3 - - 72 -65 - 73 -0 - 40 -0.0 - 0 -LTYPE - 5 -15 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -ByLayer - 70 -0 - 3 - - 72 -65 - 73 -0 - 40 -0.0 - 0 -LTYPE - 5 -16 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -CONTINUOUS - 70 -0 - 3 -Solid line - 72 -65 - 73 -0 - 40 -0.0 - 0 -LTYPE - 5 -31 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DOT - 70 -0 - 3 -Dot . . . . . . . . . . . . . . . . . . . . . . - 72 -65 - 73 -2 - 40 -6.3499999999999996 - 49 -0.0 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 0 -LTYPE - 5 -32 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DOT2 - 70 -0 - 3 -Dot (.5x) ..................................... - 72 -65 - 73 -2 - 40 -3.1749999999999998 - 49 -0.0 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 0 -LTYPE - 5 -33 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DOTX2 - 70 -0 - 3 -Dot (2x) . . . . . . . . . . . . . - 72 -65 - 73 -2 - 40 -12.6999999999999993 - 49 -0.0 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 0 -LTYPE - 5 -34 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DASHED - 70 -0 - 3 -Dashed __ __ __ __ __ __ __ __ __ __ __ __ __ _ - 72 -65 - 73 -2 - 40 -19.0500000000000007 - 49 -12.6999999999999993 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 0 -LTYPE - 5 -35 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DASHED2 - 70 -0 - 3 -Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - 72 -65 - 73 -2 - 40 -9.5250000000000004 - 49 -6.3499999999999996 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 0 -LTYPE - 5 -36 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DASHEDX2 - 70 -0 - 3 -Dashed (2x) ____ ____ ____ ____ ____ ___ - 72 -65 - 73 -2 - 40 -38.1000000000000014 - 49 -25.3999999999999986 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 0 -LTYPE - 5 -37 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DASHDOT - 70 -0 - 3 -Dash dot __ . __ . __ . __ . __ . __ . __ . __ - 72 -65 - 73 -4 - 40 -25.3999999999999986 - 49 -12.6999999999999993 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 49 -0.0 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 0 -LTYPE - 5 -38 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DASHDOT2 - 70 -0 - 3 -Dash dot (.5x) _._._._._._._._._._._._._._._. - 72 -65 - 73 -4 - 40 -12.6999999999999993 - 49 -6.3499999999999996 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 49 -0.0 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 0 -LTYPE - 5 -39 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DASHDOTX2 - 70 -0 - 3 -Dash dot (2x) ____ . ____ . ____ . ___ - 72 -65 - 73 -4 - 40 -50.7999999999999972 - 49 -25.3999999999999986 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 49 -0.0 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 0 -LTYPE - 5 -3A -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DIVIDE - 70 -0 - 3 -Divide ____ . . ____ . . ____ . . ____ . . ____ - 72 -65 - 73 -6 - 40 -31.75 - 49 -12.6999999999999993 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 49 -0.0 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 49 -0.0 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 0 -LTYPE - 5 -3B -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DIVIDE2 - 70 -0 - 3 -Divide (.5x) __..__..__..__..__..__..__..__.._ - 72 -65 - 73 -6 - 40 -15.875 - 49 -6.3499999999999996 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 49 -0.0 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 49 -0.0 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 0 -LTYPE - 5 -3C -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -DIVIDEX2 - 70 -0 - 3 -Divide (2x) ________ . . ________ . . _ - 72 -65 - 73 -6 - 40 -63.5 - 49 -25.3999999999999986 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 49 -0.0 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 49 -0.0 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 0 -LTYPE - 5 -3D -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -CENTER - 70 -0 - 3 -Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ - 72 -65 - 73 -4 - 40 -50.7999999999999972 - 49 -31.75 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 49 -6.3499999999999996 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 0 -LTYPE - 5 -3E -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -CENTER2 - 70 -0 - 3 -Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ - 72 -65 - 73 -4 - 40 -28.5749999999999993 - 49 -19.0500000000000007 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 49 -3.1749999999999998 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 0 -LTYPE - 5 -3F -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -CENTERX2 - 70 -0 - 3 -Center (2x) ________ __ ________ __ _____ - 72 -65 - 73 -4 - 40 -101.5999999999999943 - 49 -63.5 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 49 -12.6999999999999993 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 0 -LTYPE - 5 -40 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -BORDER - 70 -0 - 3 -Border __ __ . __ __ . __ __ . __ __ . __ __ . - 72 -65 - 73 -6 - 40 -44.4500000000000028 - 49 -12.6999999999999993 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 49 -12.6999999999999993 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 49 -0.0 - 74 -0 - 49 --6.3499999999999996 - 74 -0 - 0 -LTYPE - 5 -41 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -BORDER2 - 70 -0 - 3 -Border (.5x) __.__.__.__.__.__.__.__.__.__.__. - 72 -65 - 73 -6 - 40 -22.2250000000000014 - 49 -6.3499999999999996 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 49 -6.3499999999999996 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 49 -0.0 - 74 -0 - 49 --3.1749999999999998 - 74 -0 - 0 -LTYPE - 5 -42 -100 -AcDbSymbolTableRecord -100 -AcDbLinetypeTableRecord - 2 -BORDERX2 - 70 -0 - 3 -Border (2x) ____ ____ . ____ ____ . ___ - 72 -65 - 73 -6 - 40 -88.9000000000000057 - 49 -25.3999999999999986 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 49 -25.3999999999999986 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 49 -0.0 - 74 -0 - 49 --12.6999999999999993 - 74 -0 - 0 -ENDTAB - 0 -TABLE - 2 -LAYER - 5 -2 -100 -AcDbSymbolTable - 70 -1 - 0 -LAYER - 5 -10 -100 -AcDbSymbolTableRecord -100 -AcDbLayerTableRecord - 2 -0 - 70 -0 - 62 -7 -420 -0 - 6 -CONTINUOUS -370 -25 -390 -F - 0 -ENDTAB - 0 -TABLE - 2 -STYLE - 5 -3 -100 -AcDbSymbolTable - 70 -1 - 0 -STYLE - 5 -11 -100 -AcDbSymbolTableRecord -100 -AcDbTextStyleTableRecord - 2 -Standard - 70 -0 - 40 -0.0 - 41 -0.75 - 50 -0.0 - 71 -0 - 42 -2.5 - 3 -txt - 4 - - 0 -ENDTAB - 0 -TABLE - 2 -VIEW - 5 -6 -100 -AcDbSymbolTable - 70 -0 - 0 -ENDTAB - 0 -TABLE - 2 -UCS - 5 -7 -100 -AcDbSymbolTable - 70 -0 - 0 -ENDTAB - 0 -TABLE - 2 -APPID - 5 -9 -100 -AcDbSymbolTable - 70 -1 - 0 -APPID - 5 -12 -100 -AcDbSymbolTableRecord -100 -AcDbRegAppTableRecord - 2 -ACAD - 70 -0 - 0 -ENDTAB - 0 -TABLE - 2 -DIMSTYLE - 5 -A -100 -AcDbSymbolTable - 70 -1 -100 -AcDbDimStyleTable - 71 -0 - 0 -DIMSTYLE -105 -27 -100 -AcDbSymbolTableRecord -100 -AcDbDimStyleTableRecord - 2 -Standard - 41 -2.5 - 42 -0.625 - 43 -3.75 - 44 -1.25 - 70 -0 - 73 -0 - 74 -0 - 77 -1 - 78 -8 -140 -2.5 -141 -2.5 -143 -0.03937007874016 -147 -0.625 -171 -3 -172 -1 -271 -2 -272 -2 -274 -3 -278 -44 -283 -0 -284 -8 -340 -11 - 0 -ENDTAB - 0 -TABLE - 2 -BLOCK_RECORD - 5 -1 -100 -AcDbSymbolTable - 70 -1 - 0 -BLOCK_RECORD - 5 -1F -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Model_Space -340 -22 - 0 -BLOCK_RECORD - 5 -1B -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Paper_Space -340 -1E - 0 -BLOCK_RECORD - 5 -23 -100 -AcDbSymbolTableRecord -100 -AcDbBlockTableRecord - 2 -*Paper_Space0 -340 -26 - 0 -ENDTAB - 0 -ENDSEC - 0 -SECTION - 2 -BLOCKS - 0 -BLOCK - 5 -20 -100 -AcDbEntity - 8 -0 -100 -AcDbBlockBegin - 2 -*Model_Space - 70 -0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Model_Space - 1 - - 0 -ENDBLK - 5 -21 -100 -AcDbEntity - 8 -0 -100 -AcDbBlockEnd - 0 -BLOCK - 5 -1C -100 -AcDbEntity - 67 -1 - 8 -0 -100 -AcDbBlockBegin - 2 -*Paper_Space - 70 -0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Paper_Space - 1 - - 0 -ENDBLK - 5 -1D -100 -AcDbEntity - 67 -1 - 8 -0 -100 -AcDbBlockEnd - 0 -BLOCK - 5 -24 -100 -AcDbEntity - 8 -0 -100 -AcDbBlockBegin - 2 -*Paper_Space0 - 70 -0 - 10 -0.0 - 20 -0.0 - 30 -0.0 - 3 -*Paper_Space0 - 1 - - 0 -ENDBLK - 5 -25 -100 -AcDbEntity - 8 -0 -100 -AcDbBlockEnd - 0 -ENDSEC - 0 -SECTION - 2 -ENTITIES - 0 -LINE - 5 -43 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -262.6099033699941288 - 20 -68.6950483150029498 - 30 -0.0 - 11 -322.9837387624884855 - 21 -100.0 - 31 -0.0 - 0 -LINE - 5 -44 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -322.9837387624884855 - 20 -100.0 - 30 -0.0 - 11 -334.1640786499873457 - 21 -32.9179606750062774 - 31 -0.0 - 0 -LINE - 5 -45 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -112.9632916463618244 - 20 -77.095603064832062 - 30 -0.0 - 11 -74.2803101558559575 - 21 -66.9158710936463024 - 31 -0.0 - 0 -ARC - 5 -46 -100 -AcDbEntity - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer -100 -AcDbCircle - 10 -200.0 - 20 -100.0 - 30 -0.0 - 40 -90.0 -100 -AcDbArc - 50 -194.7435628364707156 - 51 -333.4349488229220242 - 0 -ARC - 5 -47 -100 -AcDbEntity - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer -100 -AcDbCircle - 10 -200.0 - 20 -100.0 - 30 -0.0 - 40 -130.0 -100 -AcDbArc - 50 -194.7435628364707156 - 51 -333.4349488229220242 - 0 -LINE - 5 -48 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -262.6099033699941288 - 20 -68.6950483150029498 - 30 -0.0 - 11 -280.4984471899924188 - 21 -59.7507764050037835 - 31 -0.0 - 0 -LINE - 5 -49 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -316.2755348299890557 - 20 -41.8622325850054438 - 30 -0.0 - 11 -334.1640786499873457 - 21 -32.9179606750062774 - 31 -0.0 - 0 -LINE - 5 -4A -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -262.6099033699941288 - 20 -171.3049516849970075 - 30 -0.0 - 11 -322.9837387624884855 - 21 -140.0000000000003979 - 31 -0.0 - 0 -LINE - 5 -4B -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -322.9837387624884855 - 20 -140.0000000000003979 - 30 -0.0 - 11 -334.1640786499873457 - 21 -207.0820393249938434 - 31 -0.0 - 0 -LINE - 5 -4C -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -112.9632916463618244 - 20 -162.904396935167938 - 30 -0.0 - 11 -74.2803101558559433 - 21 -173.0841289063536976 - 31 -0.0 - 0 -ARC - 5 -4D -100 -AcDbEntity - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer -100 -AcDbCircle - 10 -200.0 - 20 -140.0000000000001137 - 30 -0.0 - 40 -90.0 -100 -AcDbArc - 50 -26.5650511770780078 - 51 -165.2564371635293128 - 0 -ARC - 5 -4E -100 -AcDbEntity - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer -100 -AcDbCircle - 10 -200.0 - 20 -140.0000000000001137 - 30 -0.0 - 40 -130.0 -100 -AcDbArc - 50 -26.5650511770780078 - 51 -165.2564371635293412 - 0 -LINE - 5 -4F -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -262.6099033699941288 - 20 -171.3049516849970075 - 30 -0.0 - 11 -280.4984471899923619 - 21 -180.2492235949964368 - 31 -0.0 - 0 -LINE - 5 -50 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -316.2755348299889988 - 20 -198.1377674149946984 - 30 -0.0 - 11 -334.1640786499873457 - 21 -207.0820393249938434 - 31 -0.0 - 0 -LINE - 5 -51 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -560.0 - 20 -70.0 - 30 -0.0 - 11 -600.0 - 21 -70.0 - 31 -0.0 - 0 -LINE - 5 -52 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -600.0 - 20 -70.0 - 30 -0.0 - 11 -500.0 - 21 -170.0 - 31 -0.0 - 0 -LINE - 5 -53 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -500.0 - 20 -170.0 - 30 -0.0 - 11 -400.0 - 21 -70.0 - 31 -0.0 - 0 -LINE - 5 -54 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -400.0 - 20 -70.0 - 30 -0.0 - 11 -440.0 - 21 -70.0 - 31 -0.0 - 0 -LINE - 5 -55 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -440.0 - 20 --20.0 - 30 -0.0 - 11 -560.0 - 21 --20.0 - 31 -0.0 - 0 -LINE - 5 -56 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -560.0 - 20 --20.0 - 30 -0.0 - 11 -560.0 - 21 -70.0 - 31 -0.0 - 0 -LINE - 5 -57 -100 -AcDbEntity -100 -AcDbLine - 8 -0 - 62 -256 -370 --1 - 6 -ByLayer - 10 -440.0 - 20 -70.0 - 30 -0.0 - 11 -440.0 - 21 --20.0 - 31 -0.0 - 0 -ENDSEC - 0 -SECTION - 2 -OBJECTS - 0 -DICTIONARY - 5 -C -100 -AcDbDictionary -280 -0 -281 -1 - 3 -ACAD_GROUP -350 -D - 3 -ACAD_LAYOUT -350 -1A - 3 -ACAD_MLINESTYLE -350 -17 - 3 -ACAD_PLOTSETTINGS -350 -19 - 3 -ACAD_PLOTSTYLENAME -350 -E - 3 -AcDbVariableDictionary -350 -58 - 0 -DICTIONARY - 5 -D -100 -AcDbDictionary -280 -0 -281 -1 - 0 -ACDBDICTIONARYWDFLT - 5 -E -100 -AcDbDictionary -281 -1 - 3 -Normal -350 -F -100 -AcDbDictionaryWithDefault -340 -F - 0 -ACDBPLACEHOLDER - 5 -F - 0 -DICTIONARY - 5 -17 -100 -AcDbDictionary -280 -0 -281 -1 - 3 -Standard -350 -18 - 0 -MLINESTYLE - 5 -18 -100 -AcDbMlineStyle - 2 -STANDARD - 70 -0 - 3 - - 62 -256 - 51 -90.0 - 52 -90.0 - 71 -2 - 49 -0.5 - 62 -256 - 6 -BYLAYER - 49 --0.5 - 62 -256 - 6 -BYLAYER - 0 -DICTIONARY - 5 -19 -100 -AcDbDictionary -280 -0 -281 -1 - 0 -DICTIONARY - 5 -1A -100 -AcDbDictionary -281 -1 - 3 -Layout1 -350 -1E - 3 -Layout2 -350 -26 - 3 -Model -350 -22 - 0 -LAYOUT - 5 -1E -100 -AcDbPlotSettings - 1 - - 2 -C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 - 4 - - 6 - - 40 -0.0 - 41 -0.0 - 42 -0.0 - 43 -0.0 - 44 -0.0 - 45 -0.0 - 46 -0.0 - 47 -0.0 - 48 -0.0 - 49 -0.0 -140 -0.0 -141 -0.0 -142 -1.0 -143 -1.0 - 70 -688 - 72 -0 - 73 -0 - 74 -5 - 7 - - 75 -16 -147 -1.0 -148 -0.0 -149 -0.0 -100 -AcDbLayout - 1 -Layout1 - 70 -1 - 71 -1 - 10 -0.0 - 20 -0.0 - 11 -420.0 - 21 -297.0 - 12 -0.0 - 22 -0.0 - 32 -0.0 - 14 -100000000000000000000.0 - 24 -100000000000000000000.0 - 34 -100000000000000000000.0 - 15 --100000000000000000000.0 - 25 --100000000000000000000.0 - 35 --100000000000000000000.0 -146 -0.0 - 13 -0.0 - 23 -0.0 - 33 -0.0 - 16 -1.0 - 26 -0.0 - 36 -0.0 - 17 -0.0 - 27 -1.0 - 37 -0.0 - 76 -0 -330 -1B - 0 -LAYOUT - 5 -22 -100 -AcDbPlotSettings - 1 - - 2 -C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 - 4 - - 6 - - 40 -0.0 - 41 -0.0 - 42 -0.0 - 43 -0.0 - 44 -0.0 - 45 -0.0 - 46 -0.0 - 47 -0.0 - 48 -0.0 - 49 -0.0 -140 -0.0 -141 -0.0 -142 -1.0 -143 -1.0 - 70 -1712 - 72 -0 - 73 -0 - 74 -0 - 7 - - 75 -0 -147 -1.0 -148 -0.0 -149 -0.0 -100 -AcDbLayout - 1 -Model - 70 -1 - 71 -0 - 10 -0.0 - 20 -0.0 - 11 -12.0 - 21 -9.0 - 12 -0.0 - 22 -0.0 - 32 -0.0 - 14 -0.0 - 24 -0.0 - 34 -0.0 - 15 -0.0 - 25 -0.0 - 35 -0.0 -146 -0.0 - 13 -0.0 - 23 -0.0 - 33 -0.0 - 16 -1.0 - 26 -0.0 - 36 -0.0 - 17 -0.0 - 27 -1.0 - 37 -0.0 - 76 -0 -330 -1F - 0 -LAYOUT - 5 -26 -100 -AcDbPlotSettings - 1 - - 2 -C:\Program Files\AutoCAD 2002\plotters\DWF ePlot (optimized for plotting).pc3 - 4 - - 6 - - 40 -0.0 - 41 -0.0 - 42 -0.0 - 43 -0.0 - 44 -0.0 - 45 -0.0 - 46 -0.0 - 47 -0.0 - 48 -0.0 - 49 -0.0 -140 -0.0 -141 -0.0 -142 -1.0 -143 -1.0 - 70 -688 - 72 -0 - 73 -0 - 74 -5 - 7 - - 75 -16 -147 -1.0 -148 -0.0 -149 -0.0 -100 -AcDbLayout - 1 -Layout2 - 70 -1 - 71 -2 - 10 -0.0 - 20 -0.0 - 11 -12.0 - 21 -9.0 - 12 -0.0 - 22 -0.0 - 32 -0.0 - 14 -0.0 - 24 -0.0 - 34 -0.0 - 15 -0.0 - 25 -0.0 - 35 -0.0 -146 -0.0 - 13 -0.0 - 23 -0.0 - 33 -0.0 - 16 -1.0 - 26 -0.0 - 36 -0.0 - 17 -0.0 - 27 -1.0 - 37 -0.0 - 76 -0 -330 -23 - 0 -DICTIONARY - 5 -58 -100 -AcDbDictionary -281 -1 - 3 -DIMASSOC -350 -5A - 3 -HIDETEXT -350 -59 - 0 -DICTIONARYVAR - 5 -59 -100 -DictionaryVariables -280 -0 - 1 -2 - 0 -DICTIONARYVAR - 5 -5A -100 -DictionaryVariables -280 -0 - 1 -1 - 0 -ENDSEC - 0 -EOF diff --git a/ReplicatorG/build/classes/sources/button-build.svg b/ReplicatorG/build/classes/sources/button-build.svg deleted file mode 100644 index e81e292..0000000 --- a/ReplicatorG/build/classes/sources/button-build.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-connect.svg b/ReplicatorG/build/classes/sources/button-connect.svg deleted file mode 100644 index bae18d8..0000000 --- a/ReplicatorG/build/classes/sources/button-connect.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-control-panel.svg b/ReplicatorG/build/classes/sources/button-control-panel.svg deleted file mode 100644 index 29f89d8..0000000 --- a/ReplicatorG/build/classes/sources/button-control-panel.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-disconnect.svg b/ReplicatorG/build/classes/sources/button-disconnect.svg deleted file mode 100644 index 0b55049..0000000 --- a/ReplicatorG/build/classes/sources/button-disconnect.svg +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-go-home.svg b/ReplicatorG/build/classes/sources/button-go-home.svg deleted file mode 100644 index f490cef..0000000 --- a/ReplicatorG/build/classes/sources/button-go-home.svg +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-pause.svg b/ReplicatorG/build/classes/sources/button-pause.svg deleted file mode 100644 index a328c0f..0000000 --- a/ReplicatorG/build/classes/sources/button-pause.svg +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-playback.svg b/ReplicatorG/build/classes/sources/button-playback.svg deleted file mode 100644 index 244fdbe..0000000 --- a/ReplicatorG/build/classes/sources/button-playback.svg +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-realtime-control-panel.svg b/ReplicatorG/build/classes/sources/button-realtime-control-panel.svg deleted file mode 100644 index 4d1ed38..0000000 --- a/ReplicatorG/build/classes/sources/button-realtime-control-panel.svg +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-set-home.svg b/ReplicatorG/build/classes/sources/button-set-home.svg deleted file mode 100644 index ad82af4..0000000 --- a/ReplicatorG/build/classes/sources/button-set-home.svg +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-simulate.svg b/ReplicatorG/build/classes/sources/button-simulate.svg deleted file mode 100644 index 539aae5..0000000 --- a/ReplicatorG/build/classes/sources/button-simulate.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-stop.svg b/ReplicatorG/build/classes/sources/button-stop.svg deleted file mode 100644 index 4a602e2..0000000 --- a/ReplicatorG/build/classes/sources/button-stop.svg +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-to-file.svg b/ReplicatorG/build/classes/sources/button-to-file.svg deleted file mode 100644 index 949de08..0000000 --- a/ReplicatorG/build/classes/sources/button-to-file.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/button-upload.svg b/ReplicatorG/build/classes/sources/button-upload.svg deleted file mode 100644 index c7acd40..0000000 --- a/ReplicatorG/build/classes/sources/button-upload.svg +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/center-object.svg b/ReplicatorG/build/classes/sources/center-object.svg deleted file mode 100644 index 7b15f30..0000000 --- a/ReplicatorG/build/classes/sources/center-object.svg +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/flip-object.svg b/ReplicatorG/build/classes/sources/flip-object.svg deleted file mode 100644 index 1145d49..0000000 --- a/ReplicatorG/build/classes/sources/flip-object.svg +++ /dev/null @@ -1,273 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/jog-buttons.svg b/ReplicatorG/build/classes/sources/jog-buttons.svg deleted file mode 100644 index 3f9cf03..0000000 --- a/ReplicatorG/build/classes/sources/jog-buttons.svg +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - Y+ - - - - Y+ - - - - Y- - - - - Y- - - - - X+ - - - - X+ - - - - X- - - - - X- - - - - Z+ - - - - Z+ - - - - Z- - - - - Z- - - - - - - - STOP - - - - STOP - - - - - - Y+ - - - - Y- - - - - X+ - - - - X- - - - - Z+ - - - - Z- - - - - diff --git a/ReplicatorG/build/classes/sources/look-at-object.svg b/ReplicatorG/build/classes/sources/look-at-object.svg deleted file mode 100644 index ae03c9d..0000000 --- a/ReplicatorG/build/classes/sources/look-at-object.svg +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/model-to-gcode.svg b/ReplicatorG/build/classes/sources/model-to-gcode.svg deleted file mode 100644 index 0fc6449..0000000 --- a/ReplicatorG/build/classes/sources/model-to-gcode.svg +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/slicing-icon.svg b/ReplicatorG/build/classes/sources/slicing-icon.svg deleted file mode 100644 index 9f486f4..0000000 --- a/ReplicatorG/build/classes/sources/slicing-icon.svg +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/ReplicatorG/build/classes/sources/tab-regular.xcf b/ReplicatorG/build/classes/sources/tab-regular.xcf deleted file mode 100644 index 6bf792b..0000000 Binary files a/ReplicatorG/build/classes/sources/tab-regular.xcf and /dev/null differ diff --git a/ReplicatorG/build/classes/sources/tab-selected.xcf b/ReplicatorG/build/classes/sources/tab-selected.xcf deleted file mode 100644 index c4eb89f..0000000 Binary files a/ReplicatorG/build/classes/sources/tab-selected.xcf and /dev/null differ diff --git a/ReplicatorG/build/jar/ReplicatorG.jar b/ReplicatorG/build/jar/ReplicatorG.jar deleted file mode 100644 index 997cf66..0000000 Binary files a/ReplicatorG/build/jar/ReplicatorG.jar and /dev/null differ diff --git a/ReplicatorG/build/linux/.cvsignore b/ReplicatorG/build/linux/.cvsignore deleted file mode 100644 index f40f2dc..0000000 --- a/ReplicatorG/build/linux/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -work -processing* - - - diff --git a/ReplicatorG/build/linux/dist/lib-i686/libj3dcore-ogl-cg.so b/ReplicatorG/build/linux/dist/lib-i686/libj3dcore-ogl-cg.so deleted file mode 100644 index b1a49d9..0000000 Binary files a/ReplicatorG/build/linux/dist/lib-i686/libj3dcore-ogl-cg.so and /dev/null differ diff --git a/ReplicatorG/build/linux/dist/lib-i686/libj3dcore-ogl.so b/ReplicatorG/build/linux/dist/lib-i686/libj3dcore-ogl.so deleted file mode 100644 index 7e21bff..0000000 Binary files a/ReplicatorG/build/linux/dist/lib-i686/libj3dcore-ogl.so and /dev/null differ diff --git a/ReplicatorG/build/linux/dist/lib-i686/librxtxSerial.so b/ReplicatorG/build/linux/dist/lib-i686/librxtxSerial.so deleted file mode 100644 index d340dcb..0000000 Binary files a/ReplicatorG/build/linux/dist/lib-i686/librxtxSerial.so and /dev/null differ diff --git a/ReplicatorG/build/linux/dist/lib-x86_64/libj3dcore-ogl.so b/ReplicatorG/build/linux/dist/lib-x86_64/libj3dcore-ogl.so deleted file mode 100644 index a0ac8c8..0000000 Binary files a/ReplicatorG/build/linux/dist/lib-x86_64/libj3dcore-ogl.so and /dev/null differ diff --git a/ReplicatorG/build/linux/dist/lib-x86_64/librxtxSerial.so b/ReplicatorG/build/linux/dist/lib-x86_64/librxtxSerial.so deleted file mode 100644 index 853b87a..0000000 Binary files a/ReplicatorG/build/linux/dist/lib-x86_64/librxtxSerial.so and /dev/null differ diff --git a/ReplicatorG/build/linux/dist/replicatorg b/ReplicatorG/build/linux/dist/replicatorg deleted file mode 100644 index 7e5f333..0000000 --- a/ReplicatorG/build/linux/dist/replicatorg +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -cd `dirname $0` - - -CLASSPATH=lib/ReplicatorG.jar:lib:lib/build:lib/j3dcore.jar:lib/jcommon-1.0.16.jar:lib/miglayout-3.7.4.jar:lib/quaqua.jar:lib/twitter4j-2.0.10.jar:lib/j3dutils.jar:lib/jfreechart-1.0.13.jar:lib/mrj.jar:lib/RXTXcomm.jar:lib/vecmath.jar:lib/filedrop.jar -export CLASSPATH - -# put the directory where this file lives in the front of the path, because -# that directory also contains jikes, which we will need at runtime. -# -PATH=`pwd`/tools:${PATH} -export PATH - -MACHINE=`uname -m` - -# put the directory with the native RXTX libs in the library path -LD_LIBRARY_PATH=`pwd`/lib-${MACHINE}:${LD_LIBRARY_PATH} -export LD_LIBRARY_PATH - -if [ ${http_proxy} ]; then - PROXY=`echo -n -e ${http_proxy} | sed -n 's/http:\/\/\([^:]\+\):\([1234567890]\+\)/-DproxySet=true -DproxyHost=\1 -DproxyPort=\2/p'` - java $PROXY replicatorg.app.Base "$@" -else - java replicatorg.app.Base "$@" -fi diff --git a/ReplicatorG/build/linux/dist/tools/avrdude b/ReplicatorG/build/linux/dist/tools/avrdude deleted file mode 100644 index 96f489c..0000000 Binary files a/ReplicatorG/build/linux/dist/tools/avrdude and /dev/null differ diff --git a/ReplicatorG/build/linux/dist/tools/avrdude.conf b/ReplicatorG/build/linux/dist/tools/avrdude.conf deleted file mode 100644 index 221cf2a..0000000 --- a/ReplicatorG/build/linux/dist/tools/avrdude.conf +++ /dev/null @@ -1,11914 +0,0 @@ -# $Id: avrdude.conf.in,v 1.122 2007/05/16 21:29:36 joerg_wunsch Exp $ -# -# AVRDUDE Configuration File -# -# This file contains configuration data used by AVRDUDE which describes -# the programming hardware pinouts and also provides part definitions. -# AVRDUDE's "-C" command line option specifies the location of the -# configuration file. The "-c" option names the programmer configuration -# which must match one of the entry's "id" parameter. The "-p" option -# identifies which part AVRDUDE is going to be programming and must match -# one of the parts' "id" parameter. -# -# Possible entry formats are: -# -# programmer -# id = [, [, ] ...] ; # are quoted strings -# desc = ; # quoted string -# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | -# avr910 | butterfly | usbasp | -# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | -# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | -# dragon_hvsp; # programmer type -# baudrate = ; # baudrate for avr910-programmer -# vcc = [, ... ] ; # pin number(s) -# reset = ; # pin number -# sck = ; # pin number -# mosi = ; # pin number -# miso = ; # pin number -# errled = ; # pin number -# rdyled = ; # pin number -# pgmled = ; # pin number -# vfyled = ; # pin number -# ; -# -# part -# id = ; # quoted string -# desc = ; # quoted string -# has_jtag = ; # part has JTAG i/f -# has_debugwire = ; # part has debugWire i/f -# devicecode = ; # deprecated, use stk500_devcode -# stk500_devcode = ; # numeric -# avr910_devcode = ; # numeric -# signature = ; # signature bytes -# chip_erase_delay = ; # micro-seconds -# reset = dedicated | io; -# retry_pulse = reset | sck; -# pgm_enable = ; -# chip_erase = ; -# chip_erase_delay = ; # chip erase delay (us) -# # STK500 parameters (parallel programming IO lines) -# pagel = ; # pin name in hex, i.e., 0xD7 -# bs2 = ; # pin name in hex, i.e., 0xA0 -# serial = ; # can use serial downloading -# parallel = ; # can use par. programming -# # STK500v2 parameters, to be taken from Atmel's XML files -# timeout = ; -# stabdelay = ; -# cmdexedelay = ; -# synchloops = ; -# bytedelay = ; -# pollvalue = ; -# pollindex = ; -# predelay = ; -# postdelay = ; -# pollmethod = ; -# mode = ; -# delay = ; -# blocksize = ; -# readsize = ; -# hvspcmdexedelay = ; -# # STK500v2 HV programming parameters, from XML -# pp_controlstack = , , ...; # PP only -# hvsp_controlstack = , , ...; # HVSP only -# hventerstabdelay = ; -# progmodedelay = ; # PP only -# latchcycles = ; -# togglevtg = ; -# poweroffdelay = ; -# resetdelayms = ; -# resetdelayus = ; -# hvleavestabdelay = ; -# resetdelay = ; -# synchcycles = ; # HVSP only -# chiperasepulsewidth = ; # PP only -# chiperasepolltimeout = ; -# chiperasetime = ; # HVSP only -# programfusepulsewidth = ; # PP only -# programfusepolltimeout = ; -# programlockpulsewidth = ; # PP only -# programlockpolltimeout = ; -# # JTAG ICE mkII parameters, also from XML files -# allowfullpagebitstream = ; -# enablepageprogramming = ; -# idr = ; # IO addr of IDR (OCD) reg. -# rampz = ; # IO addr of RAMPZ reg. -# spmcr = ; # mem addr of SPMC[S]R reg. -# eecr = ; # mem addr of EECR reg. -# # (only when != 0x3c) -# -# memory -# paged = ; # yes / no -# size = ; # bytes -# page_size = ; # bytes -# num_pages = ; # numeric -# min_write_delay = ; # micro-seconds -# max_write_delay = ; # micro-seconds -# readback_p1 = ; # byte value -# readback_p2 = ; # byte value -# pwroff_after_write = ; # yes / no -# read = ; -# write = ; -# read_lo = ; -# read_hi = ; -# write_lo = ; -# write_hi = ; -# loadpage_lo = ; -# loadpage_hi = ; -# writepage = ; -# ; -# ; -# -# If any of the above parameters are not specified, the default value -# of 0 is used for numerics or the empty string ("") for string -# values. If a required parameter is left empty, AVRDUDE will -# complain. -# -# NOTES: -# * 'devicecode' is the device code used by the STK500 (see codes -# listed below) -# * Not all memory types will implement all instructions. -# * AVR Fuse bits and Lock bits are implemented as a type of memory. -# * Example memory types are: -# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high -# fuse), "signature", "calibration", "lock" -# * The memory type specified on the avrdude command line must match -# one of the memory types defined for the specified chip. -# * The pwroff_after_write flag causes avrdude to attempt to -# power the device off and back on after an unsuccessful write to -# the affected memory area if VCC programmer pins are defined. If -# VCC pins are not defined for the programmer, a message -# indicating that the device needs a power-cycle is printed out. -# This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: -# -# http://www.atmel.com/atmel/acrobat/doc1280.pdf -# -# INSTRUCTION FORMATS -# -# Instruction formats are specified as a comma seperated list of -# string values containing information (bit specifiers) about each -# of the 32 bits of the instruction. Bit specifiers may be one of -# the following formats: -# -# '1' = the bit is always set on input as well as output -# -# '0' = the bit is always clear on input as well as output -# -# 'x' = the bit is ignored on input and output -# -# 'a' = the bit is an address bit, the bit-number matches this bit -# specifier's position within the current instruction byte -# -# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 -# is address bit 12 on input, a0 is address bit 0. -# -# 'i' = the bit is an input data bit -# -# 'o' = the bit is an output data bit -# -# Each instruction must be composed of 32 bit specifiers. The -# instruction specification closely follows the instruction data -# provided in Atmel's data sheets for their parts. -# -# See below for some examples. -# -# -# The following are STK500 part device codes to use for the -# "devicecode" field of the part. These came from Atmel's software -# section avr061.zip which accompanies the application note -# AVR061 available from: -# -# http://www.atmel.com/atmel/acrobat/doc2525.pdf -# - -#define ATTINY10 0x10 -#define ATTINY11 0x11 -#define ATTINY12 0x12 -#define ATTINY15 0x13 -#define ATTINY13 0x14 - -#define ATTINY22 0x20 -#define ATTINY26 0x21 -#define ATTINY28 0x22 -#define ATTINY2313 0x23 - -#define AT90S1200 0x33 - -#define AT90S2313 0x40 -#define AT90S2323 0x41 -#define AT90S2333 0x42 -#define AT90S2343 0x43 - -#define AT90S4414 0x50 -#define AT90S4433 0x51 -#define AT90S4434 0x52 -#define ATMEGA48 0x59 - -#define AT90S8515 0x60 -#define AT90S8535 0x61 -#define AT90C8534 0x62 -#define ATMEGA8515 0x63 -#define ATMEGA8535 0x64 - -#define ATMEGA8 0x70 -#define ATMEGA88 0x73 -#define ATMEGA168 0x86 - -#define ATMEGA161 0x80 -#define ATMEGA163 0x81 -#define ATMEGA16 0x82 -#define ATMEGA162 0x83 -#define ATMEGA169 0x84 - -#define ATMEGA323 0x90 -#define ATMEGA32 0x91 - -#define ATMEGA64 0xA0 - -#define ATMEGA103 0xB1 -#define ATMEGA128 0xB2 -#define AT90CAN128 0xB3 - -#define AT86RF401 0xD0 - -#define AT89START 0xE0 -#define AT89S51 0xE0 -#define AT89S52 0xE1 - -# The following table lists the devices in the original AVR910 -# appnote: -# |Device |Signature | Code | -# +-------+----------+------+ -# |tiny12 | 1E 90 05 | 0x55 | -# |tiny15 | 1E 90 06 | 0x56 | -# | | | | -# | S1200 | 1E 90 01 | 0x13 | -# | | | | -# | S2313 | 1E 91 01 | 0x20 | -# | S2323 | 1E 91 02 | 0x48 | -# | S2333 | 1E 91 05 | 0x34 | -# | S2343 | 1E 91 03 | 0x4C | -# | | | | -# | S4414 | 1E 92 01 | 0x28 | -# | S4433 | 1E 92 03 | 0x30 | -# | S4434 | 1E 92 02 | 0x6C | -# | | | | -# | S8515 | 1E 93 01 | 0x38 | -# | S8535 | 1E 93 03 | 0x68 | -# | | | | -# |mega32 | 1E 95 01 | 0x72 | -# |mega83 | 1E 93 05 | 0x65 | -# |mega103| 1E 97 01 | 0x41 | -# |mega161| 1E 94 01 | 0x60 | -# |mega163| 1E 94 02 | 0x64 | - -# Appnote AVR109 also has a table of AVR910 device codes, which -# lists: -# dev avr910 signature -# ATmega8 0x77 0x1E 0x93 0x07 -# ATmega8515 0x3B 0x1E 0x93 0x06 -# ATmega8535 0x6A 0x1E 0x93 0x08 -# ATmega16 0x75 0x1E 0x94 0x03 -# ATmega162 0x63 0x1E 0x94 0x04 -# ATmega163 0x66 0x1E 0x94 0x02 -# ATmega169 0x79 0x1E 0x94 0x05 -# ATmega32 0x7F 0x1E 0x95 0x02 -# ATmega323 0x73 0x1E 0x95 0x01 -# ATmega64 0x46 0x1E 0x96 0x02 -# ATmega128 0x44 0x1E 0x97 0x02 -# -# These codes refer to "BOOT" device codes which are apparently -# different than standard device codes, for whatever reasons -# (often one above the standard code). - -# There are several extended versions of AVR910 implementations around -# in the Internet. These add the following codes (only devices that -# actually exist are listed): - -# ATmega8515 0x3A -# ATmega128 0x43 -# ATmega64 0x45 -# ATtiny26 0x5E -# ATmega8535 0x69 -# ATmega32 0x72 -# ATmega16 0x74 -# ATmega8 0x76 -# ATmega169 0x78 - -# -# Overall avrdude defaults -# -default_parallel = "/dev/parport0"; -default_serial = "/dev/ttyS0"; - - -# -# PROGRAMMER DEFINITIONS -# - -programmer - id = "avrisp"; - desc = "Atmel AVR ISP"; - type = stk500; -; - -programmer - id = "avrispv2"; - desc = "Atmel AVR ISP V2"; - type = stk500v2; -; - -programmer - id = "avrispmkII"; - desc = "Atmel AVR ISP mkII"; - type = stk500v2; -; - -programmer - id = "avrisp2"; - desc = "Atmel AVR ISP mkII"; - type = stk500v2; -; - -# This is supposed to be the "default" STK500 entry. -# Attempts to select the correct firmware version -# by probing for it. Better use one of the entries -# below instead. -programmer - id = "stk500"; - desc = "Atmel STK500"; - type = stk500generic; -; - -programmer - id = "stk500v1"; - desc = "Atmel STK500 Version 1.x firmware"; - type = stk500; -; - -programmer - id = "stk500v2"; - desc = "Atmel STK500 Version 2.x firmware"; - type = stk500v2; -; - -programmer - id = "stk500pp"; - desc = "Atmel STK500 V2 in parallel programming mode"; - type = stk500pp; -; - -programmer - id = "stk500hvsp"; - desc = "Atmel STK500 V2 in high-voltage serial programming mode"; - type = stk500hvsp; -; - -programmer - id = "avr910"; - desc = "Atmel Low Cost Serial Programmer"; - type = avr910; -; - -programmer - id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; - type = usbasp; -; - -programmer - id = "usbtiny"; - desc = "USBtiny simple USB programmer"; - type = usbtiny; -; - -programmer - id = "butterfly"; - desc = "Atmel Butterfly Development Board"; - type = butterfly; -; - -programmer - id = "avr109"; - desc = "Atmel AppNote AVR109 Boot Loader"; - type = butterfly; -; - -programmer - id = "avr911"; - desc = "Atmel AppNote AVR911 AVROSP"; - type = butterfly; -; - -programmer - id = "jtagmkI"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 115200; # default is 115200 - type = jtagmki; -; - -# easier to type -programmer - id = "jtag1"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 115200; # default is 115200 - type = jtagmki; -; - -# easier to type -programmer - id = "jtag1slow"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 19200; - type = jtagmki; -; - -programmer - id = "jtagmkII"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 19200; # default is 19200 - type = jtagmkii; -; - -# easier to type -programmer - id = "jtag2slow"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 19200; # default is 19200 - type = jtagmkii; -; - -# JTAG ICE mkII @ 115200 Bd -programmer - id = "jtag2fast"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 115200; - type = jtagmkii; -; - -# make the fast one the default, people will love that -programmer - id = "jtag2"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 115200; - type = jtagmkii; -; - -# JTAG ICE mkII in ISP mode -programmer - id = "jtag2isp"; - desc = "Atmel JTAG ICE mkII in ISP mode"; - baudrate = 115200; - type = jtagmkii_isp; -; - -# JTAG ICE mkII in debugWire mode -programmer - id = "jtag2dw"; - desc = "Atmel JTAG ICE mkII in debugWire mode"; - baudrate = 115200; - type = jtagmkii_dw; -; - -# AVR Dragon in JTAG mode -programmer - id = "dragon_jtag"; - desc = "Atmel AVR Dragon in JTAG mode"; - baudrate = 115200; - type = dragon_jtag; -; - -# AVR Dragon in ISP mode -programmer - id = "dragon_isp"; - desc = "Atmel AVR Dragon in ISP mode"; - baudrate = 115200; - type = dragon_isp; -; - -# AVR Dragon in PP mode -programmer - id = "dragon_pp"; - desc = "Atmel AVR Dragon in PP mode"; - baudrate = 115200; - type = dragon_pp; -; - -# AVR Dragon in HVSP mode -programmer - id = "dragon_hvsp"; - desc = "Atmel AVR Dragon in HVSP mode"; - baudrate = 115200; - type = dragon_hvsp; -; - -# AVR Dragon in debugWire mode -programmer - id = "dragon_dw"; - desc = "Atmel AVR Dragon in debugWire mode"; - baudrate = 115200; - type = dragon_dw; -; - -programmer - id = "pavr"; - desc = "Jason Kyle's pAVR Serial Programmer"; - type = avr910; -; - -# Parallel port programmers. - -programmer - id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; - type = par; - vcc = 2, 3, 4, 5; - reset = 7; - sck = 8; - mosi = 9; - miso = 10; -; - -programmer - id = "stk200"; - desc = "STK200"; - type = par; - buff = 4, 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; -; - -# The programming dongle used by the popular Ponyprog -# utility. It is almost similar to the STK200 one, -# except that there is a LED indicating that the -# programming is currently in progress. - -programmer - id = "pony-stk200"; - desc = "Pony Prog STK200"; - type = par; - buff = 4, 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; - pgmled = 8; -; - -programmer - id = "dt006"; - desc = "Dontronics DT006"; - type = par; - reset = 4; - sck = 5; - mosi = 2; - miso = 11; -; - -programmer - id = "bascom"; - desc = "Bascom SAMPLE programming cable"; - type = par; - reset = 4; - sck = 5; - mosi = 2; - miso = 11; -; - -programmer - id = "alf"; - desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; - type = par; - vcc = 2, 3, 4, 5; - buff = 6; - reset = 7; - sck = 8; - mosi = 9; - miso = 10; - errled = 1; - rdyled = 14; - pgmled = 16; - vfyled = 17; -; - -programmer - id = "sp12"; - desc = "Steve Bolt's Programmer"; - type = par; - vcc = 4,5,6,7,8; - reset = 3; - sck = 2; - mosi = 9; - miso = 11; -; - -programmer - id = "picoweb"; - desc = "Picoweb Programming Cable, http://www.picoweb.net/"; - type = par; - reset = 2; - sck = 3; - mosi = 4; - miso = 13; -; - -programmer - id = "abcmini"; - desc = "ABCmini Board, aka Dick Smith HOTCHIP"; - type = par; - reset = 4; - sck = 3; - mosi = 2; - miso = 10; -; - -programmer - id = "futurlec"; - desc = "Futurlec.com programming cable."; - type = par; - reset = 3; - sck = 2; - mosi = 1; - miso = 10; -; - - -# From the contributor of the "xil" jtag cable: -# The "vcc" definition isn't really vcc (the cable gets its power from -# the programming circuit) but is necessary to switch one of the -# buffer lines (trying to add it to the "buff" lines doesn't work). -# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK -# to SCK (plus vcc/gnd of course) -programmer - id = "xil"; - desc = "Xilinx JTAG cable"; - type = par; - mosi = 2; - sck = 3; - reset = 4; - buff = 5; - miso = 13; - vcc = 6; -; - - -programmer - id = "dapa"; - desc = "Direct AVR Parallel Access cable"; - type = par; - vcc = 3; - reset = 16; - sck = 1; - mosi = 2; - miso = 11; -; - -programmer - id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; - type = par; - reset = ~6; - sck = ~8; - mosi = ~7; - miso = ~10; -; - -programmer - id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; - type = par; - reset = ~4; - sck = 3; - mosi = 2; - miso = 10; -; - -programmer - id = "blaster"; - desc = "Altera ByteBlaster"; - type = par; - sck = 2; - miso = 11; - reset = 3; - mosi = 8; - buff = 14; -; - -# It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port (download on http://electropol.free.fr) -programmer - id = "frank-stk200"; - desc = "Frank STK200"; - type = par; - vcc = 5; - sck = 6; - mosi = 7; - reset = 9; - miso = 10; - pgmled = 8; -; - - -# -# some ultra cheap programmers use bitbanging on the -# serialport. -# -# PC - DB9 - Pins for RS232: -# -# GND 5 -- |O -# | O| <- 9 RI -# DTR 4 <- |O | -# | O| <- 8 CTS -# TXD 3 <- |O | -# | O| -> 7 RTS -# RXD 2 -> |O | -# | O| <- 6 DSR -# DCD 1 -> |O -# -# Using RXD is currently not supported. -# Using RI is not supported under Win32 but is supported under Posix. - -# serial ponyprog design (dasa2 in uisp) -# reset=!txd sck=rts mosi=dtr miso=cts - -programmer - id = "ponyser"; - desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; - type = serbb; - reset = ~3; - sck = 7; - mosi = 4; - miso = 8; -; - -# Same as above, different name -# reset=!txd sck=rts mosi=dtr miso=cts - -programmer - id = "siprog"; - desc = "Lancos SI-Prog "; - type = serbb; - reset = ~3; - sck = 7; - mosi = 4; - miso = 8; -; - -# unknown (dasa in uisp) -# reset=rts sck=dtr mosi=txd miso=cts - -programmer - id = "dasa"; - desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; - type = serbb; - reset = 7; - sck = 4; - mosi = 3; - miso = 8; -; - -# unknown (dasa3 in uisp) -# reset=!dtr sck=rts mosi=txd miso=cts - -programmer - id = "dasa3"; - desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; - type = serbb; - reset = ~4; - sck = 7; - mosi = 3; - miso = 8; -; - -# -# PART DEFINITIONS -# - -#------------------------------------------------------------ -# ATtiny11 -#------------------------------------------------------------ - -# This is an HVSP-only device. - -part - id = "t11"; - desc = "ATtiny11"; - stk500_devcode = 0x11; - signature = 0x1e 0x90 0x04; - chip_erase_delay = 20000; - - timeout = 200; - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - blocksize = 64; - readsize = 256; - delay = 5; - ; - - memory "flash" - size = 1024; - blocksize = 128; - readsize = 256; - delay = 3; - ; - - memory "signature" - size = 3; - ; - - memory "lock" - size = 1; - ; - - memory "calibration" - size = 1; - ; - - memory "fuse" - size = 1; - ; -; - -#------------------------------------------------------------ -# ATtiny12 -#------------------------------------------------------------ - -part - id = "t12"; - desc = "ATtiny12"; - stk500_devcode = 0x12; - avr910_devcode = 0x55; - signature = 0x1e 0x90 0x05; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 8; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - size = 1024; - min_write_delay = 4500; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -; - -#------------------------------------------------------------ -# ATtiny13 -#------------------------------------------------------------ - -part - id = "t13"; - desc = "ATtiny13"; - has_debugwire = yes; - flash_instr = 0xB4, 0x0E, 0x1E; - eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x14; - signature = 0x1e 0x90 0x07; - chip_erase_delay = 4000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 90; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 1024; - page_size = 32; - num_pages = 32; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny15 -#------------------------------------------------------------ - -part - id = "t15"; - desc = "ATtiny15"; - stk500_devcode = 0x13; - avr910_devcode = 0x56; - signature = 0x1e 0x90 0x06; - chip_erase_delay = 8200; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 5; - synchcycles = 6; - latchcycles = 16; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - min_write_delay = 8200; - max_write_delay = 8200; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - size = 1024; - min_write_delay = 4100; - max_write_delay = 4100; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x o o o o x x o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x i i i i 1 1 i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -; - -#------------------------------------------------------------ -# AT90s1200 -#------------------------------------------------------------ - -part - id = "1200"; - desc = "AT90S1200"; - stk500_devcode = 0x33; - avr910_devcode = 0x13; - signature = 0x1e 0x90 0x01; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 1; - bytedelay = 0; - pollindex = 0; - pollvalue = 0xFF; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 64; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 32; - readsize = 256; - ; - memory "flash" - size = 1024; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x02; - delay = 15; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s4414 -#------------------------------------------------------------ - -part - id = "4414"; - desc = "AT90S4414"; - stk500_devcode = 0x50; - avr910_devcode = 0x28; - signature = 0x1e 0x92 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s2313 -#------------------------------------------------------------ - -part - id = "2313"; - desc = "AT90S2313"; - stk500_devcode = 0x40; - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 128; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 2048; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s2333 -#------------------------------------------------------------ - -part - id = "2333"; -##### WARNING: No XML file for device 'AT90S2333'! ##### - desc = "AT90S2333"; - stk500_devcode = 0x42; - avr910_devcode = 0x34; - signature = 0x1e 0x91 0x05; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - ; - memory "flash" - size = 2048; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - pwroff_after_write = yes; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - - -#------------------------------------------------------------ -# AT90s2343 (also AT90s2323 and ATtiny22) -#------------------------------------------------------------ - -part - id = "2343"; - desc = "AT90S2343"; - stk500_devcode = 0x43; - avr910_devcode = 0x4c; - signature = 0x1e 0x91 0x03; - chip_erase_delay = 18000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 0; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 2048; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 128; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o o x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o o x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - - -#------------------------------------------------------------ -# AT90s4433 -#------------------------------------------------------------ - -part - id = "4433"; - desc = "AT90S4433"; - stk500_devcode = 0x51; - avr910_devcode = 0x30; - signature = 0x1e 0x92 0x03; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - pwroff_after_write = yes; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s4434 -#------------------------------------------------------------ - -part - id = "4434"; -##### WARNING: No XML file for device 'AT90S4434'! ##### - desc = "AT90S4434"; - stk500_devcode = 0x52; - avr910_devcode = 0x6c; - signature = 0x1e 0x92 0x02; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s8515 -#------------------------------------------------------------ - -part - id = "8515"; - desc = "AT90S8515"; - stk500_devcode = 0x60; - avr910_devcode = 0x38; - signature = 0x1e 0x93 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 512; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 8192; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s8535 -#------------------------------------------------------------ - -part - id = "8535"; - desc = "AT90S8535"; - stk500_devcode = 0x61; - avr910_devcode = 0x68; - signature = 0x1e 0x93 0x03; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 8192; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x x o"; - write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o x x x x x x"; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# ATmega103 -#------------------------------------------------------------ - -part - id = "m103"; - desc = "ATMEGA103"; - stk500_devcode = 0xB1; - avr910_devcode = 0x41; - signature = 0x1e 0x97 0x01; - chip_erase_delay = 112000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, - 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, - 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, - 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 10; - - memory "eeprom" - size = 4096; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 22000; - max_write_delay = 56000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x11; - delay = 70; - blocksize = 256; - readsize = 256; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o x o 1 o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega64 -#------------------------------------------------------------ - -part - id = "m64"; - desc = "ATMEGA64"; - has_jtag = yes; - stk500_devcode = 0xA0; - avr910_devcode = 0x45; - signature = 0x1e 0x96 0x02; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x22; - spmcr = 0x68; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - - -#------------------------------------------------------------ -# ATmega128 -#------------------------------------------------------------ - -part - id = "m128"; - desc = "ATMEGA128"; - has_jtag = yes; - stk500_devcode = 0xB2; - avr910_devcode = 0x43; - signature = 0x1e 0x97 0x02; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x22; - spmcr = 0x68; - rampz = 0x3b; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90CAN128 -#------------------------------------------------------------ - -part - id = "c128"; - desc = "AT90CAN128"; - has_jtag = yes; - stk500_devcode = 0xB3; -# avr910_devcode = 0x43; - signature = 0x1e 0x97 0x81; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - eecr = 0x3f; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega16 -#------------------------------------------------------------ - -part - id = "m16"; - desc = "ATMEGA16"; - has_jtag = yes; - stk500_devcode = 0x82; - avr910_devcode = 0x74; - signature = 0x1e 0x94 0x03; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 100; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "calibration" - size = 4; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega164P -#------------------------------------------------------------ - -# close to ATmega16 - -part - id = "m164p"; - desc = "ATMEGA164P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x94 0x0a; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega324P -#------------------------------------------------------------ - -# similar to ATmega164P - -part - id = "m324p"; - desc = "ATMEGA324P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x95 0x08; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega644 -#------------------------------------------------------------ - -# similar to ATmega164 - -part - id = "m644"; - desc = "ATMEGA644"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x96 0x09; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega644P -#------------------------------------------------------------ - -# similar to ATmega164p - -part - id = "m644p"; - desc = "ATMEGA644P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x96 0x0a; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - - -#------------------------------------------------------------ -# ATmega162 -#------------------------------------------------------------ - -part - id = "m162"; - desc = "ATMEGA162"; - has_jtag = yes; - stk500_devcode = 0x83; - avr910_devcode = 0x63; - signature = 0x1e 0x94 0x04; - chip_erase_delay = 9000; - pagel = 0xd7; - bs2 = 0xa0; - - idr = 0x04; - spmcr = 0x57; - allowfullpagebitstream = yes; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - - ; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 4; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; -; - - - -#------------------------------------------------------------ -# ATmega163 -#------------------------------------------------------------ - -part - id = "m163"; - desc = "ATMEGA163"; - stk500_devcode = 0x81; - avr910_devcode = 0x64; - signature = 0x1e 0x94 0x02; - chip_erase_delay = 32000; - pagel = 0xd7; - bs2 = 0xa0; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 30; - programfusepulsewidth = 0; - programfusepolltimeout = 2; - programlockpulsewidth = 0; - programlockpolltimeout = 2; - - - memory "eeprom" - size = 512; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 16000; - max_write_delay = 16000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o x x o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i 1 1 i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x 1 o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x 0 x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega169 -#------------------------------------------------------------ - -part - id = "m169"; - desc = "ATMEGA169"; - has_jtag = yes; - stk500_devcode = 0x85; - avr910_devcode = 0x78; - signature = 0x1e 0x94 0x05; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega329 -#------------------------------------------------------------ - -part - id = "m329"; - desc = "ATMEGA329"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x95 0x03; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega3290 -#------------------------------------------------------------ - -# identical to ATmega329 - -part - id = "m3290"; - desc = "ATMEGA3290"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x95 0x04; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a3 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega649 -#------------------------------------------------------------ - -part - id = "m649"; - desc = "ATMEGA649"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x96 0x03; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega6490 -#------------------------------------------------------------ - -# identical to ATmega649 - -part - id = "m6490"; - desc = "ATMEGA6490"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x96 0x04; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega32 -#------------------------------------------------------------ - -part - id = "m32"; - desc = "ATMEGA32"; - has_jtag = yes; - stk500_devcode = 0x91; - avr910_devcode = 0x72; - signature = 0x1e 0x95 0x02; - chip_erase_delay = 9000; - pagel = 0xd7; - bs2 = 0xa0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega161 -#------------------------------------------------------------ - -part - id = "m161"; - desc = "ATMEGA161"; - stk500_devcode = 0x80; - avr910_devcode = 0x60; - signature = 0x1e 0x94 0x01; - chip_erase_delay = 28000; - pagel = 0xd7; - bs2 = 0xa0; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 30; - programfusepulsewidth = 0; - programfusepolltimeout = 2; - programlockpulsewidth = 0; - programlockpolltimeout = 2; - - memory "eeprom" - size = 512; - min_write_delay = 3400; - max_write_delay = 3400; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 14000; - max_write_delay = 14000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 16; - blocksize = 128; - readsize = 256; - ; - - memory "fuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x o x o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x 1 i 1 i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega8 -#------------------------------------------------------------ - -part - id = "m8"; - desc = "ATMEGA8"; - stk500_devcode = 0x70; - avr910_devcode = 0x76; - signature = 0x1e 0x93 0x07; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 10000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - -#------------------------------------------------------------ -# ATmega8515 -#------------------------------------------------------------ - -part - id = "m8515"; - desc = "ATMEGA8515"; - stk500_devcode = 0x63; - avr910_devcode = 0x3A; - signature = 0x1e 0x93 0x06; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - - -#------------------------------------------------------------ -# ATmega8535 -#------------------------------------------------------------ - -part - id = "m8535"; - desc = "ATMEGA8535"; - stk500_devcode = 0x64; - avr910_devcode = 0x69; - signature = 0x1e 0x93 0x08; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATtiny26 -#------------------------------------------------------------ - -part - id = "t26"; - desc = "ATTINY26"; - stk500_devcode = 0x21; - avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x09; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 16; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x x x x i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny261 -#------------------------------------------------------------ -# Close to ATtiny26 - -part - id = "t261"; - desc = "ATTINY261"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x0c; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 128; - page_size = 4; - num_pages = 32; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny461 -#------------------------------------------------------------ -# Close to ATtiny261 - -part - id = "t461"; - desc = "ATTINY461"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x92 0x08; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 256; - page_size = 4; - num_pages = 64; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny861 -#------------------------------------------------------------ -# Close to ATtiny461 - -part - id = "t861"; - desc = "ATTINY861"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x93 0x0d; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 512; - num_pages = 128; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATmega48 -#------------------------------------------------------------ - -part - id = "m48"; - desc = "ATMEGA48"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x59; -# avr910_devcode = 0x; - signature = 0x1e 0x92 0x05; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 45000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 256; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x x", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega88 -#------------------------------------------------------------ - -part - id = "m88"; - desc = "ATMEGA88"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x73; -# avr910_devcode = 0x; - signature = 0x1e 0x93 0x0a; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 512; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega168 -#------------------------------------------------------------ - -part - id = "m168"; - desc = "ATMEGA168"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x86; - # avr910_devcode = 0x; - signature = 0x1e 0x94 0x06; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 512; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; -; - -#------------------------------------------------------------ -# ATmega328 -#------------------------------------------------------------ - -part - id = "m328p"; - desc = "ATMEGA328P"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x86; - # avr910_devcode = 0x; - signature = 0x1e 0x95 0x0F; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 1024; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; -; - #------------------------------------------------------------ -# ATtiny2313 -#------------------------------------------------------------ - -part - id = "t2313"; - desc = "ATtiny2313"; - has_debugwire = yes; - flash_instr = 0xB2, 0x0F, 0x1F; - eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x23; -## Use the ATtiny26 devcode: - avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x0a; - pagel = 0xD4; - bs2 = 0xD6; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, - 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, - 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, - 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - -# The information in the data sheet of April/2004 is wrong, this works: - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - -# The information in the data sheet of April/2004 is wrong, this works: - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - -# The information in the data sheet of April/2004 is wrong, this works: - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. -# The information in the data sheet of April/2004 is wrong, this works: - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM2 -#------------------------------------------------------------ - -part - id = "pwm2"; - desc = "AT90PWM2"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x81; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; -# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM3 -#------------------------------------------------------------ - -# Completely identical to AT90PWM2 (including the signature!) - -part - id = "pwm3"; - desc = "AT90PWM3"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x81; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; -# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM2B -#------------------------------------------------------------ -# Same as AT90PWM2 but different signature. - -part - id = "pwm2b"; - desc = "AT90PWM2B"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x83; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM3B -#------------------------------------------------------------ - -# Completely identical to AT90PWM2B (including the signature!) - -part - id = "pwm3b"; - desc = "AT90PWM3B"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x83; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny25 -#------------------------------------------------------------ - -part - id = "t25"; - desc = "ATtiny25"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x08; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny45 -#------------------------------------------------------------ - -part - id = "t45"; - desc = "ATtiny45"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x92 0x06; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 256; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny85 -#------------------------------------------------------------ - -part - id = "t85"; - desc = "ATtiny85"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x93 0x0b; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega640 -#------------------------------------------------------------ -# Almost same as ATmega1280, except for different memory sizes - -part - id = "m640"; - desc = "ATMEGA640"; - signature = 0x1e 0x96 0x08; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega1280 -#------------------------------------------------------------ - -part - id = "m1280"; - desc = "ATMEGA1280"; - signature = 0x1e 0x97 0x03; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega1281 -#------------------------------------------------------------ -# Identical to ATmega1280 - -part - id = "m1281"; - desc = "ATMEGA1281"; - signature = 0x1e 0x97 0x04; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega2560 -#------------------------------------------------------------ - -part - id = "m2560"; - desc = "ATMEGA2560"; - signature = 0x1e 0x98 0x01; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 262144; - page_size = 256; - num_pages = 1024; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - load_ext_addr = " 0 1 0 0 1 1 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 a16", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega2561 -#------------------------------------------------------------ - -part - id = "m2561"; - desc = "ATMEGA2561"; - signature = 0x1e 0x98 0x02; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 262144; - page_size = 256; - num_pages = 1024; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - load_ext_addr = " 0 1 0 0 1 1 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 a16", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny24 -#------------------------------------------------------------ - -part - id = "t24"; - desc = "ATtiny24"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x0b; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny44 -#------------------------------------------------------------ - -part - id = "t44"; - desc = "ATtiny44"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x92 0x07; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 256; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny84 -#------------------------------------------------------------ - -part - id = "t84"; - desc = "ATtiny84"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x93 0x0c; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB646 -#------------------------------------------------------------ - -part - id = "usb646"; - desc = "AT90USB646"; -# signature = 0x1e 0x96 0x82; ? - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB647 -#------------------------------------------------------------ -# identical to AT90USB646 - -part - id = "usb647"; - desc = "AT90USB647"; -# signature = 0x1e 0x96 0x82; ? - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB1286 -#------------------------------------------------------------ - -part - id = "usb1286"; - desc = "AT90USB1286"; - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB1287 -#------------------------------------------------------------ -# identical to AT90USB1286 - -part - id = "usb1287"; - desc = "AT90USB1287"; - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega325 -#------------------------------------------------------------ - -part - id = "m325"; - desc = "ATMEGA325"; - signature = 0x1e 0x95 0x05; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega645 -#------------------------------------------------------------ - -part - id = "m645"; - desc = "ATMEGA645"; - signature = 0x1E 0x96 0x05; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega3250 -#------------------------------------------------------------ - -part - id = "m3250"; - desc = "ATMEGA3250"; - signature = 0x1E 0x95 0x06; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega6450 -#------------------------------------------------------------ - -part - id = "m6450"; - desc = "ATMEGA6450"; - signature = 0x1E 0x96 0x06; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; diff --git a/ReplicatorG/build/macosx/.cvsignore b/ReplicatorG/build/macosx/.cvsignore deleted file mode 100644 index 323ee55..0000000 --- a/ReplicatorG/build/macosx/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -work* -processing-0000-macosx diff --git a/ReplicatorG/build/macosx/dist/ReplicatorG b/ReplicatorG/build/macosx/dist/ReplicatorG deleted file mode 100644 index d23b5eb..0000000 Binary files a/ReplicatorG/build/macosx/dist/ReplicatorG and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/drivers/FTDIUSBSerialDriver_v2_2_14.dmg b/ReplicatorG/build/macosx/dist/drivers/FTDIUSBSerialDriver_v2_2_14.dmg deleted file mode 100644 index 9ff6889..0000000 Binary files a/ReplicatorG/build/macosx/dist/drivers/FTDIUSBSerialDriver_v2_2_14.dmg and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/libquaqua.jnilib b/ReplicatorG/build/macosx/dist/libquaqua.jnilib deleted file mode 100644 index ddbc03a..0000000 Binary files a/ReplicatorG/build/macosx/dist/libquaqua.jnilib and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/librxtxSerial.jnilib b/ReplicatorG/build/macosx/dist/librxtxSerial.jnilib deleted file mode 100644 index b15dfa5..0000000 Binary files a/ReplicatorG/build/macosx/dist/librxtxSerial.jnilib and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/mkdmg.sh b/ReplicatorG/build/macosx/dist/mkdmg.sh deleted file mode 100644 index 41d6c05..0000000 --- a/ReplicatorG/build/macosx/dist/mkdmg.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -BASE="$1" -SRC="$2" -DEST="$3" -VOLUME="$4" - -echo Base Directory $1 -echo Source $2 -echo Destination $3 -echo Volume $4 - -cd $BASE - -hdiutil create $VOLUME.dmg -srcfolder $SRC -format UDZO -volname $VOLUME -ov diff --git a/ReplicatorG/build/macosx/dist/replicatorg.icns b/ReplicatorG/build/macosx/dist/replicatorg.icns deleted file mode 100644 index 9ed87cf..0000000 Binary files a/ReplicatorG/build/macosx/dist/replicatorg.icns and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/tools/avrdude b/ReplicatorG/build/macosx/dist/tools/avrdude deleted file mode 100644 index 9aa9a17..0000000 Binary files a/ReplicatorG/build/macosx/dist/tools/avrdude and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/tools/avrdude.conf b/ReplicatorG/build/macosx/dist/tools/avrdude.conf deleted file mode 100644 index ad522eb..0000000 --- a/ReplicatorG/build/macosx/dist/tools/avrdude.conf +++ /dev/null @@ -1,11721 +0,0 @@ -# $Id: avrdude.conf.in,v 1.122 2007/05/16 21:29:36 joerg_wunsch Exp $ -# -# AVRDUDE Configuration File -# -# This file contains configuration data used by AVRDUDE which describes -# the programming hardware pinouts and also provides part definitions. -# AVRDUDE's "-C" command line option specifies the location of the -# configuration file. The "-c" option names the programmer configuration -# which must match one of the entry's "id" parameter. The "-p" option -# identifies which part AVRDUDE is going to be programming and must match -# one of the parts' "id" parameter. -# -# Possible entry formats are: -# -# programmer -# id = [, [, ] ...] ; # are quoted strings -# desc = ; # quoted string -# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | -# avr910 | butterfly | usbasp | -# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | -# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | -# dragon_hvsp; # programmer type -# baudrate = ; # baudrate for avr910-programmer -# vcc = [, ... ] ; # pin number(s) -# reset = ; # pin number -# sck = ; # pin number -# mosi = ; # pin number -# miso = ; # pin number -# errled = ; # pin number -# rdyled = ; # pin number -# pgmled = ; # pin number -# vfyled = ; # pin number -# ; -# -# part -# id = ; # quoted string -# desc = ; # quoted string -# has_jtag = ; # part has JTAG i/f -# has_debugwire = ; # part has debugWire i/f -# devicecode = ; # deprecated, use stk500_devcode -# stk500_devcode = ; # numeric -# avr910_devcode = ; # numeric -# signature = ; # signature bytes -# chip_erase_delay = ; # micro-seconds -# reset = dedicated | io; -# retry_pulse = reset | sck; -# pgm_enable = ; -# chip_erase = ; -# chip_erase_delay = ; # chip erase delay (us) -# # STK500 parameters (parallel programming IO lines) -# pagel = ; # pin name in hex, i.e., 0xD7 -# bs2 = ; # pin name in hex, i.e., 0xA0 -# serial = ; # can use serial downloading -# parallel = ; # can use par. programming -# # STK500v2 parameters, to be taken from Atmel's XML files -# timeout = ; -# stabdelay = ; -# cmdexedelay = ; -# synchloops = ; -# bytedelay = ; -# pollvalue = ; -# pollindex = ; -# predelay = ; -# postdelay = ; -# pollmethod = ; -# mode = ; -# delay = ; -# blocksize = ; -# readsize = ; -# hvspcmdexedelay = ; -# # STK500v2 HV programming parameters, from XML -# pp_controlstack = , , ...; # PP only -# hvsp_controlstack = , , ...; # HVSP only -# hventerstabdelay = ; -# progmodedelay = ; # PP only -# latchcycles = ; -# togglevtg = ; -# poweroffdelay = ; -# resetdelayms = ; -# resetdelayus = ; -# hvleavestabdelay = ; -# resetdelay = ; -# synchcycles = ; # HVSP only -# chiperasepulsewidth = ; # PP only -# chiperasepolltimeout = ; -# chiperasetime = ; # HVSP only -# programfusepulsewidth = ; # PP only -# programfusepolltimeout = ; -# programlockpulsewidth = ; # PP only -# programlockpolltimeout = ; -# # JTAG ICE mkII parameters, also from XML files -# allowfullpagebitstream = ; -# enablepageprogramming = ; -# idr = ; # IO addr of IDR (OCD) reg. -# rampz = ; # IO addr of RAMPZ reg. -# spmcr = ; # mem addr of SPMC[S]R reg. -# eecr = ; # mem addr of EECR reg. -# # (only when != 0x3c) -# -# memory -# paged = ; # yes / no -# size = ; # bytes -# page_size = ; # bytes -# num_pages = ; # numeric -# min_write_delay = ; # micro-seconds -# max_write_delay = ; # micro-seconds -# readback_p1 = ; # byte value -# readback_p2 = ; # byte value -# pwroff_after_write = ; # yes / no -# read = ; -# write = ; -# read_lo = ; -# read_hi = ; -# write_lo = ; -# write_hi = ; -# loadpage_lo = ; -# loadpage_hi = ; -# writepage = ; -# ; -# ; -# -# If any of the above parameters are not specified, the default value -# of 0 is used for numerics or the empty string ("") for string -# values. If a required parameter is left empty, AVRDUDE will -# complain. -# -# NOTES: -# * 'devicecode' is the device code used by the STK500 (see codes -# listed below) -# * Not all memory types will implement all instructions. -# * AVR Fuse bits and Lock bits are implemented as a type of memory. -# * Example memory types are: -# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high -# fuse), "signature", "calibration", "lock" -# * The memory type specified on the avrdude command line must match -# one of the memory types defined for the specified chip. -# * The pwroff_after_write flag causes avrdude to attempt to -# power the device off and back on after an unsuccessful write to -# the affected memory area if VCC programmer pins are defined. If -# VCC pins are not defined for the programmer, a message -# indicating that the device needs a power-cycle is printed out. -# This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata at: -# -# http://www.atmel.com/atmel/acrobat/doc1280.pdf -# -# INSTRUCTION FORMATS -# -# Instruction formats are specified as a comma seperated list of -# string values containing information (bit specifiers) about each -# of the 32 bits of the instruction. Bit specifiers may be one of -# the following formats: -# -# '1' = the bit is always set on input as well as output -# -# '0' = the bit is always clear on input as well as output -# -# 'x' = the bit is ignored on input and output -# -# 'a' = the bit is an address bit, the bit-number matches this bit -# specifier's position within the current instruction byte -# -# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 -# is address bit 12 on input, a0 is address bit 0. -# -# 'i' = the bit is an input data bit -# -# 'o' = the bit is an output data bit -# -# Each instruction must be composed of 32 bit specifiers. The -# instruction specification closely follows the instruction data -# provided in Atmel's data sheets for their parts. -# -# See below for some examples. -# -# -# The following are STK500 part device codes to use for the -# "devicecode" field of the part. These came from Atmel's software -# section avr061.zip which accompanies the application note -# AVR061 available from: -# -# http://www.atmel.com/atmel/acrobat/doc2525.pdf -# - -#define ATTINY10 0x10 -#define ATTINY11 0x11 -#define ATTINY12 0x12 -#define ATTINY15 0x13 -#define ATTINY13 0x14 - -#define ATTINY22 0x20 -#define ATTINY26 0x21 -#define ATTINY28 0x22 -#define ATTINY2313 0x23 - -#define AT90S1200 0x33 - -#define AT90S2313 0x40 -#define AT90S2323 0x41 -#define AT90S2333 0x42 -#define AT90S2343 0x43 - -#define AT90S4414 0x50 -#define AT90S4433 0x51 -#define AT90S4434 0x52 -#define ATMEGA48 0x59 - -#define AT90S8515 0x60 -#define AT90S8535 0x61 -#define AT90C8534 0x62 -#define ATMEGA8515 0x63 -#define ATMEGA8535 0x64 - -#define ATMEGA8 0x70 -#define ATMEGA88 0x73 -#define ATMEGA168 0x86 - -#define ATMEGA161 0x80 -#define ATMEGA163 0x81 -#define ATMEGA16 0x82 -#define ATMEGA162 0x83 -#define ATMEGA169 0x84 - -#define ATMEGA323 0x90 -#define ATMEGA32 0x91 - -#define ATMEGA64 0xA0 - -#define ATMEGA103 0xB1 -#define ATMEGA128 0xB2 -#define AT90CAN128 0xB3 - -#define AT86RF401 0xD0 - -#define AT89START 0xE0 -#define AT89S51 0xE0 -#define AT89S52 0xE1 - -# The following table lists the devices in the original AVR910 -# appnote: -# |Device |Signature | Code | -# +-------+----------+------+ -# |tiny12 | 1E 90 05 | 0x55 | -# |tiny15 | 1E 90 06 | 0x56 | -# | | | | -# | S1200 | 1E 90 01 | 0x13 | -# | | | | -# | S2313 | 1E 91 01 | 0x20 | -# | S2323 | 1E 91 02 | 0x48 | -# | S2333 | 1E 91 05 | 0x34 | -# | S2343 | 1E 91 03 | 0x4C | -# | | | | -# | S4414 | 1E 92 01 | 0x28 | -# | S4433 | 1E 92 03 | 0x30 | -# | S4434 | 1E 92 02 | 0x6C | -# | | | | -# | S8515 | 1E 93 01 | 0x38 | -# | S8535 | 1E 93 03 | 0x68 | -# | | | | -# |mega32 | 1E 95 01 | 0x72 | -# |mega83 | 1E 93 05 | 0x65 | -# |mega103| 1E 97 01 | 0x41 | -# |mega161| 1E 94 01 | 0x60 | -# |mega163| 1E 94 02 | 0x64 | - -# Appnote AVR109 also has a table of AVR910 device codes, which -# lists: -# dev avr910 signature -# ATmega8 0x77 0x1E 0x93 0x07 -# ATmega8515 0x3B 0x1E 0x93 0x06 -# ATmega8535 0x6A 0x1E 0x93 0x08 -# ATmega16 0x75 0x1E 0x94 0x03 -# ATmega162 0x63 0x1E 0x94 0x04 -# ATmega163 0x66 0x1E 0x94 0x02 -# ATmega169 0x79 0x1E 0x94 0x05 -# ATmega32 0x7F 0x1E 0x95 0x02 -# ATmega323 0x73 0x1E 0x95 0x01 -# ATmega64 0x46 0x1E 0x96 0x02 -# ATmega128 0x44 0x1E 0x97 0x02 -# -# These codes refer to "BOOT" device codes which are apparently -# different than standard device codes, for whatever reasons -# (often one above the standard code). - -# There are several extended versions of AVR910 implementations around -# in the Internet. These add the following codes (only devices that -# actually exist are listed): - -# ATmega8515 0x3A -# ATmega128 0x43 -# ATmega64 0x45 -# ATtiny26 0x5E -# ATmega8535 0x69 -# ATmega32 0x72 -# ATmega16 0x74 -# ATmega8 0x76 -# ATmega169 0x78 - -# -# Overall avrdude defaults -# -default_parallel = "unknown"; -default_serial = "unknown"; - - -# -# PROGRAMMER DEFINITIONS -# - -programmer - id = "avrisp"; - desc = "Atmel AVR ISP"; - type = stk500; -; - -programmer - id = "avrispv2"; - desc = "Atmel AVR ISP V2"; - type = stk500v2; -; - -programmer - id = "avrispmkII"; - desc = "Atmel AVR ISP mkII"; - type = stk500v2; -; - -programmer - id = "avrisp2"; - desc = "Atmel AVR ISP mkII"; - type = stk500v2; -; - -# This is supposed to be the "default" STK500 entry. -# Attempts to select the correct firmware version -# by probing for it. Better use one of the entries -# below instead. -programmer - id = "stk500"; - desc = "Atmel STK500"; - type = stk500generic; -; - -programmer - id = "stk500v1"; - desc = "Atmel STK500 Version 1.x firmware"; - type = stk500; -; - -programmer - id = "stk500v2"; - desc = "Atmel STK500 Version 2.x firmware"; - type = stk500v2; -; - -programmer - id = "stk500pp"; - desc = "Atmel STK500 V2 in parallel programming mode"; - type = stk500pp; -; - -programmer - id = "stk500hvsp"; - desc = "Atmel STK500 V2 in high-voltage serial programming mode"; - type = stk500hvsp; -; - -programmer - id = "avr910"; - desc = "Atmel Low Cost Serial Programmer"; - type = avr910; -; - -programmer - id = "usbasp"; - desc = "USBasp, http://www.fischl.de/usbasp/"; - type = usbasp; -; - -programmer - id = "usbtiny"; - desc = "USBtiny simple USB programmer"; - type = usbtiny; -; - -programmer - id = "butterfly"; - desc = "Atmel Butterfly Development Board"; - type = butterfly; -; - -programmer - id = "avr109"; - desc = "Atmel AppNote AVR109 Boot Loader"; - type = butterfly; -; - -programmer - id = "avr911"; - desc = "Atmel AppNote AVR911 AVROSP"; - type = butterfly; -; - -programmer - id = "jtagmkI"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 115200; # default is 115200 - type = jtagmki; -; - -# easier to type -programmer - id = "jtag1"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 115200; # default is 115200 - type = jtagmki; -; - -# easier to type -programmer - id = "jtag1slow"; - desc = "Atmel JTAG ICE (mkI)"; - baudrate = 19200; - type = jtagmki; -; - -programmer - id = "jtagmkII"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 19200; # default is 19200 - type = jtagmkii; -; - -# easier to type -programmer - id = "jtag2slow"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 19200; # default is 19200 - type = jtagmkii; -; - -# JTAG ICE mkII @ 115200 Bd -programmer - id = "jtag2fast"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 115200; - type = jtagmkii; -; - -# make the fast one the default, people will love that -programmer - id = "jtag2"; - desc = "Atmel JTAG ICE mkII"; - baudrate = 115200; - type = jtagmkii; -; - -# JTAG ICE mkII in ISP mode -programmer - id = "jtag2isp"; - desc = "Atmel JTAG ICE mkII in ISP mode"; - baudrate = 115200; - type = jtagmkii_isp; -; - -# JTAG ICE mkII in debugWire mode -programmer - id = "jtag2dw"; - desc = "Atmel JTAG ICE mkII in debugWire mode"; - baudrate = 115200; - type = jtagmkii_dw; -; - -# AVR Dragon in JTAG mode -programmer - id = "dragon_jtag"; - desc = "Atmel AVR Dragon in JTAG mode"; - baudrate = 115200; - type = dragon_jtag; -; - -# AVR Dragon in ISP mode -programmer - id = "dragon_isp"; - desc = "Atmel AVR Dragon in ISP mode"; - baudrate = 115200; - type = dragon_isp; -; - -# AVR Dragon in PP mode -programmer - id = "dragon_pp"; - desc = "Atmel AVR Dragon in PP mode"; - baudrate = 115200; - type = dragon_pp; -; - -# AVR Dragon in HVSP mode -programmer - id = "dragon_hvsp"; - desc = "Atmel AVR Dragon in HVSP mode"; - baudrate = 115200; - type = dragon_hvsp; -; - -# AVR Dragon in debugWire mode -programmer - id = "dragon_dw"; - desc = "Atmel AVR Dragon in debugWire mode"; - baudrate = 115200; - type = dragon_dw; -; - -programmer - id = "pavr"; - desc = "Jason Kyle's pAVR Serial Programmer"; - type = avr910; -; - - -# -# some ultra cheap programmers use bitbanging on the -# serialport. -# -# PC - DB9 - Pins for RS232: -# -# GND 5 -- |O -# | O| <- 9 RI -# DTR 4 <- |O | -# | O| <- 8 CTS -# TXD 3 <- |O | -# | O| -> 7 RTS -# RXD 2 -> |O | -# | O| <- 6 DSR -# DCD 1 -> |O -# -# Using RXD is currently not supported. -# Using RI is not supported under Win32 but is supported under Posix. - -# serial ponyprog design (dasa2 in uisp) -# reset=!txd sck=rts mosi=dtr miso=cts - -programmer - id = "ponyser"; - desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; - type = serbb; - reset = ~3; - sck = 7; - mosi = 4; - miso = 8; -; - -# Same as above, different name -# reset=!txd sck=rts mosi=dtr miso=cts - -programmer - id = "siprog"; - desc = "Lancos SI-Prog "; - type = serbb; - reset = ~3; - sck = 7; - mosi = 4; - miso = 8; -; - -# unknown (dasa in uisp) -# reset=rts sck=dtr mosi=txd miso=cts - -programmer - id = "dasa"; - desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; - type = serbb; - reset = 7; - sck = 4; - mosi = 3; - miso = 8; -; - -# unknown (dasa3 in uisp) -# reset=!dtr sck=rts mosi=txd miso=cts - -programmer - id = "dasa3"; - desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; - type = serbb; - reset = ~4; - sck = 7; - mosi = 3; - miso = 8; -; - -# -# PART DEFINITIONS -# - -#------------------------------------------------------------ -# ATtiny11 -#------------------------------------------------------------ - -# This is an HVSP-only device. - -part - id = "t11"; - desc = "ATtiny11"; - stk500_devcode = 0x11; - signature = 0x1e 0x90 0x04; - chip_erase_delay = 20000; - - timeout = 200; - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - blocksize = 64; - readsize = 256; - delay = 5; - ; - - memory "flash" - size = 1024; - blocksize = 128; - readsize = 256; - delay = 3; - ; - - memory "signature" - size = 3; - ; - - memory "lock" - size = 1; - ; - - memory "calibration" - size = 1; - ; - - memory "fuse" - size = 1; - ; -; - -#------------------------------------------------------------ -# ATtiny12 -#------------------------------------------------------------ - -part - id = "t12"; - desc = "ATtiny12"; - stk500_devcode = 0x12; - avr910_devcode = 0x55; - signature = 0x1e 0x90 0x05; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 8; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - size = 1024; - min_write_delay = 4500; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -; - -#------------------------------------------------------------ -# ATtiny13 -#------------------------------------------------------------ - -part - id = "t13"; - desc = "ATtiny13"; - has_debugwire = yes; - flash_instr = 0xB4, 0x0E, 0x1E; - eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x14; - signature = 0x1e 0x90 0x07; - chip_erase_delay = 4000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 90; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 1024; - page_size = 32; - num_pages = 32; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 0 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny15 -#------------------------------------------------------------ - -part - id = "t15"; - desc = "ATtiny15"; - stk500_devcode = 0x13; - avr910_devcode = 0x56; - signature = 0x1e 0x90 0x06; - chip_erase_delay = 8200; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 5; - synchcycles = 6; - latchcycles = 16; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 64; - min_write_delay = 8200; - max_write_delay = 8200; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - size = 1024; - min_write_delay = 4100; - max_write_delay = 4100; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x o o o o x x o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x i i i i 1 1 i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -; - -#------------------------------------------------------------ -# AT90s1200 -#------------------------------------------------------------ - -part - id = "1200"; - desc = "AT90S1200"; - stk500_devcode = 0x33; - avr910_devcode = 0x13; - signature = 0x1e 0x90 0x01; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 1; - bytedelay = 0; - pollindex = 0; - pollvalue = 0xFF; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 64; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 32; - readsize = 256; - ; - memory "flash" - size = 1024; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x02; - delay = 15; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s4414 -#------------------------------------------------------------ - -part - id = "4414"; - desc = "AT90S4414"; - stk500_devcode = 0x50; - avr910_devcode = 0x28; - signature = 0x1e 0x92 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s2313 -#------------------------------------------------------------ - -part - id = "2313"; - desc = "AT90S2313"; - stk500_devcode = 0x40; - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 128; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 2048; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s2333 -#------------------------------------------------------------ - -part - id = "2333"; -##### WARNING: No XML file for device 'AT90S2333'! ##### - desc = "AT90S2333"; - stk500_devcode = 0x42; - avr910_devcode = 0x34; - signature = 0x1e 0x91 0x05; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - ; - memory "flash" - size = 2048; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - pwroff_after_write = yes; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - - -#------------------------------------------------------------ -# AT90s2343 (also AT90s2323 and ATtiny22) -#------------------------------------------------------------ - -part - id = "2343"; - desc = "AT90S2343"; - stk500_devcode = 0x43; - avr910_devcode = 0x4c; - signature = 0x1e 0x91 0x03; - chip_erase_delay = 18000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, - 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, - 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 0; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 50; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - memory "flash" - size = 2048; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 128; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o o x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o o x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - - -#------------------------------------------------------------ -# AT90s4433 -#------------------------------------------------------------ - -part - id = "4433"; - desc = "AT90S4433"; - stk500_devcode = 0x51; - avr910_devcode = 0x30; - signature = 0x1e 0x92 0x03; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - pwroff_after_write = yes; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s4434 -#------------------------------------------------------------ - -part - id = "4434"; -##### WARNING: No XML file for device 'AT90S4434'! ##### - desc = "AT90S4434"; - stk500_devcode = 0x52; - avr910_devcode = 0x6c; - signature = 0x1e 0x92 0x02; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - memory "eeprom" - size = 256; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - ; - memory "flash" - size = 4096; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", - "x x x x x x x x x x x x x x x x"; - ; - memory "lock" - size = 1; - min_write_delay = 9000; - max_write_delay = 20000; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - ; - ; - -#------------------------------------------------------------ -# AT90s8515 -#------------------------------------------------------------ - -part - id = "8515"; - desc = "AT90S8515"; - stk500_devcode = 0x60; - avr910_devcode = 0x38; - signature = 0x1e 0x93 0x01; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 512; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 8192; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x7f; - readback_p2 = 0x7f; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# AT90s8535 -#------------------------------------------------------------ - -part - id = "8535"; - desc = "AT90S8535"; - stk500_devcode = 0x61; - avr910_devcode = 0x68; - signature = 0x1e 0x93 0x03; - chip_erase_delay = 20000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 1; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0x00; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "flash" - size = 8192; - min_write_delay = 9000; - max_write_delay = 20000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write_lo = " 0 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - write_hi = " 0 1 0 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 128; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "fuse" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x x o"; - write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x o o x x x x x x"; - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - ; - -#------------------------------------------------------------ -# ATmega103 -#------------------------------------------------------------ - -part - id = "m103"; - desc = "ATMEGA103"; - stk500_devcode = 0xB1; - avr910_devcode = 0x41; - signature = 0x1e 0x97 0x01; - chip_erase_delay = 112000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, - 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, - 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, - 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 15; - chiperasepolltimeout = 0; - programfusepulsewidth = 2; - programfusepolltimeout = 0; - programlockpulsewidth = 0; - programlockpolltimeout = 10; - - memory "eeprom" - size = 4096; - min_write_delay = 4000; - max_write_delay = 9000; - readback_p1 = 0x80; - readback_p2 = 0x7f; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 22000; - max_write_delay = 56000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x11; - delay = 70; - blocksize = 256; - readsize = 256; - ; - - memory "fuse" - size = 1; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x x o x o 1 o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x o o x"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega64 -#------------------------------------------------------------ - -part - id = "m64"; - desc = "ATMEGA64"; - has_jtag = yes; - stk500_devcode = 0xA0; - avr910_devcode = 0x45; - signature = 0x1e 0x96 0x02; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x22; - spmcr = 0x68; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - - -#------------------------------------------------------------ -# ATmega128 -#------------------------------------------------------------ - -part - id = "m128"; - desc = "ATMEGA128"; - has_jtag = yes; - stk500_devcode = 0xB2; - avr910_devcode = 0x43; - signature = 0x1e 0x97 0x02; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x22; - spmcr = 0x68; - rampz = 0x3b; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 12; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90CAN128 -#------------------------------------------------------------ - -part - id = "c128"; - desc = "AT90CAN128"; - has_jtag = yes; - stk500_devcode = 0xB3; -# avr910_devcode = 0x43; - signature = 0x1e 0x97 0x81; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - eecr = 0x3f; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega16 -#------------------------------------------------------------ - -part - id = "m16"; - desc = "ATMEGA16"; - has_jtag = yes; - stk500_devcode = 0x82; - avr910_devcode = 0x74; - signature = 0x1e 0x94 0x03; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 100; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "calibration" - size = 4; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega164P -#------------------------------------------------------------ - -# close to ATmega16 - -part - id = "m164p"; - desc = "ATMEGA164P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x94 0x0a; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega324P -#------------------------------------------------------------ - -# similar to ATmega164P - -part - id = "m324p"; - desc = "ATMEGA324P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x95 0x08; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega644 -#------------------------------------------------------------ - -# similar to ATmega164 - -part - id = "m644"; - desc = "ATMEGA644"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x96 0x09; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega644P -#------------------------------------------------------------ - -# similar to ATmega164p - -part - id = "m644p"; - desc = "ATMEGA644P"; - has_jtag = yes; -# stk500_devcode = 0x82; # no STK500v1 support -# avr910_devcode = 0x?; # try the ATmega16 one:^ - avr910_devcode = 0x74; - signature = 0x1e 0x96 0x0a; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - - - -#------------------------------------------------------------ -# ATmega162 -#------------------------------------------------------------ - -part - id = "m162"; - desc = "ATMEGA162"; - has_jtag = yes; - stk500_devcode = 0x83; - avr910_devcode = 0x63; - signature = 0x1e 0x94 0x04; - chip_erase_delay = 9000; - pagel = 0xd7; - bs2 = 0xa0; - - idr = 0x04; - spmcr = 0x57; - allowfullpagebitstream = yes; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - - ; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 4; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 16000; - max_write_delay = 16000; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; -; - - - -#------------------------------------------------------------ -# ATmega163 -#------------------------------------------------------------ - -part - id = "m163"; - desc = "ATMEGA163"; - stk500_devcode = 0x81; - avr910_devcode = 0x64; - signature = 0x1e 0x94 0x02; - chip_erase_delay = 32000; - pagel = 0xd7; - bs2 = 0xa0; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 30; - programfusepulsewidth = 0; - programfusepolltimeout = 2; - programlockpulsewidth = 0; - programlockpolltimeout = 2; - - - memory "eeprom" - size = 512; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 16000; - max_write_delay = 16000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o x x o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i 1 1 i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x 1 o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x 1 1 1 1 1 i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x 0 x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega169 -#------------------------------------------------------------ - -part - id = "m169"; - desc = "ATMEGA169"; - has_jtag = yes; - stk500_devcode = 0x85; - avr910_devcode = 0x78; - signature = 0x1e 0x94 0x05; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega329 -#------------------------------------------------------------ - -part - id = "m329"; - desc = "ATMEGA329"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x95 0x03; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega3290 -#------------------------------------------------------------ - -# identical to ATmega329 - -part - id = "m3290"; - desc = "ATMEGA3290"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x95 0x04; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a3 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega649 -#------------------------------------------------------------ - -part - id = "m649"; - desc = "ATMEGA649"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x96 0x03; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega6490 -#------------------------------------------------------------ - -# identical to ATmega649 - -part - id = "m6490"; - desc = "ATMEGA6490"; - has_jtag = yes; -# stk500_devcode = 0x85; # no STK500 support, only STK500v2 -# avr910_devcode = 0x?; # try the ATmega169 one: - avr910_devcode = 0x75; - signature = 0x1e 0x96 0x04; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 20; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega32 -#------------------------------------------------------------ - -part - id = "m32"; - desc = "ATMEGA32"; - has_jtag = yes; - stk500_devcode = 0x91; - avr910_devcode = 0x72; - signature = 0x1e 0x95 0x02; - chip_erase_delay = 9000; - pagel = 0xd7; - bs2 = 0xa0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = yes; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega161 -#------------------------------------------------------------ - -part - id = "m161"; - desc = "ATMEGA161"; - stk500_devcode = 0x80; - avr910_devcode = 0x60; - signature = 0x1e 0x94 0x01; - chip_erase_delay = 28000; - pagel = 0xd7; - bs2 = 0xa0; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 0; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 30; - programfusepulsewidth = 0; - programfusepolltimeout = 2; - programlockpulsewidth = 0; - programlockpolltimeout = 2; - - memory "eeprom" - size = 512; - min_write_delay = 3400; - max_write_delay = 3400; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 5; - blocksize = 128; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 14000; - max_write_delay = 14000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 16; - blocksize = 128; - readsize = 256; - ; - - memory "fuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 x x x x x x x x", - "x x x x x x x x x o x o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", - "x x x x x x x x 1 i 1 i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega8 -#------------------------------------------------------------ - -part - id = "m8"; - desc = "ATMEGA8"; - stk500_devcode = 0x70; - avr910_devcode = 0x76; - signature = 0x1e 0x93 0x07; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 10000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 20; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - -#------------------------------------------------------------ -# ATmega8515 -#------------------------------------------------------------ - -part - id = "m8515"; - desc = "ATMEGA8515"; - stk500_devcode = 0x63; - avr910_devcode = 0x3A; - signature = 0x1e 0x93 0x06; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - - - -#------------------------------------------------------------ -# ATmega8535 -#------------------------------------------------------------ - -part - id = "m8535"; - desc = "ATMEGA8535"; - stk500_devcode = 0x64; - avr910_devcode = 0x69; - signature = 0x1e 0x93 0x08; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 6; - togglevtg = 0; - poweroffdelay = 0; - resetdelayms = 0; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 128; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 2000; - max_write_delay = 2000; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATtiny26 -#------------------------------------------------------------ - -part - id = "t26"; - desc = "ATTINY26"; - stk500_devcode = 0x21; - avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x09; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 128; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - mode = 0x04; - delay = 10; - blocksize = 64; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x21; - delay = 6; - blocksize = 16; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x x x x i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 4; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny261 -#------------------------------------------------------------ -# Close to ATtiny26 - -part - id = "t261"; - desc = "ATTINY261"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x0c; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 128; - page_size = 4; - num_pages = 32; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = "1 0 1 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 x x x x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x x a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny461 -#------------------------------------------------------------ -# Close to ATtiny261 - -part - id = "t461"; - desc = "ATTINY461"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x92 0x08; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 256; - page_size = 4; - num_pages = 64; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATtiny861 -#------------------------------------------------------------ -# Close to ATtiny461 - -part - id = "t861"; - desc = "ATTINY861"; - has_debugwire = yes; - flash_instr = 0xB4, 0x00, 0x10; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -# stk500_devcode = 0x21; -# avr910_devcode = 0x5e; - signature = 0x1e 0x93 0x0d; - pagel = 0xb3; - bs2 = 0xb2; - chip_erase_delay = 4000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 0; - - pp_controlstack = - 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, - 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, - 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, - 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 2; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - size = 512; - num_pages = 128; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4000; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - - read_lo = " 0 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 x x x x x x x x", - "x x x x x x x x x x x x x x o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", - "x x x x x x x x x x x x x x x x"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - min_write_delay = 4500; - max_write_delay = 4500; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - -; - - -#------------------------------------------------------------ -# ATmega48 -#------------------------------------------------------------ - -part - id = "m48"; - desc = "ATMEGA48"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x59; -# avr910_devcode = 0x; - signature = 0x1e 0x92 0x05; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 45000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 256; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x x", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x x x o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - - -#------------------------------------------------------------ -# ATmega88 -#------------------------------------------------------------ - -part - id = "m88"; - desc = "ATMEGA88"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x73; -# avr910_devcode = 0x; - signature = 0x1e 0x93 0x0a; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 512; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega168 -#------------------------------------------------------------ - -part - id = "m168"; - desc = "ATMEGA168"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x86; - # avr910_devcode = 0x; - signature = 0x1e 0x94 0x06; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 512; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x x a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 16384; - page_size = 128; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; -; - -#------------------------------------------------------------ -# ATmega328 -#------------------------------------------------------------ - -part - id = "m328p"; - desc = "ATMEGA328P"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x86; - # avr910_devcode = 0x; - signature = 0x1e 0x95 0x0F; - pagel = 0xd7; - bs2 = 0xc2; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - resetdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - paged = no; - page_size = 4; - size = 1024; - min_write_delay = 3600; - max_write_delay = 3600; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 x x x a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 5; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 a13 a12 a11 a10 a9 a8", - " a7 a6 x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 128; - readsize = 256; - - ; - - memory "lfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "hfuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - ; - - memory "efuse" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x x x x x x o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - ; - - memory "lock" - size = 1; - min_write_delay = 4500; - max_write_delay = 4500; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; -; - -#------------------------------------------------------------ -# ATtiny2313 -#------------------------------------------------------------ - -part - id = "t2313"; - desc = "ATtiny2313"; - has_debugwire = yes; - flash_instr = 0xB2, 0x0F, 0x1F; - eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x23; -## Use the ATtiny26 devcode: - avr910_devcode = 0x5e; - signature = 0x1e 0x91 0x0a; - pagel = 0xD4; - bs2 = 0xD6; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, - 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, - 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, - 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - -# The information in the data sheet of April/2004 is wrong, this works: - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - -# The information in the data sheet of April/2004 is wrong, this works: - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - -# The information in the data sheet of April/2004 is wrong, this works: - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; -# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. -# The information in the data sheet of April/2004 is wrong, this works: - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM2 -#------------------------------------------------------------ - -part - id = "pwm2"; - desc = "AT90PWM2"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x81; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; -# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM3 -#------------------------------------------------------------ - -# Completely identical to AT90PWM2 (including the signature!) - -part - id = "pwm3"; - desc = "AT90PWM3"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x81; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; -# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM2B -#------------------------------------------------------------ -# Same as AT90PWM2 but different signature. - -part - id = "pwm2b"; - desc = "AT90PWM2B"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x83; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90PWM3B -#------------------------------------------------------------ - -# Completely identical to AT90PWM2B (including the signature!) - -part - id = "pwm3b"; - desc = "AT90PWM3B"; - has_debugwire = yes; - flash_instr = 0xB6, 0x01, 0x11; - eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, - 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, - 0x99, 0xF9, 0xBB, 0xAF; - stk500_devcode = 0x65; -## avr910_devcode = ?; - signature = 0x1e 0x93 0x83; - pagel = 0xD8; - bs2 = 0xE2; - reset = io; - chip_erase_delay = 9000; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 64; - readsize = 256; - ; - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny25 -#------------------------------------------------------------ - -part - id = "t25"; - desc = "ATtiny25"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x08; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny45 -#------------------------------------------------------------ - -part - id = "t45"; - desc = "ATtiny45"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x92 0x06; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 256; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny85 -#------------------------------------------------------------ - -part - id = "t85"; - desc = "ATtiny85"; - has_debugwire = yes; - flash_instr = 0xB4, 0x02, 0x12; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x93 0x0b; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 2; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega640 -#------------------------------------------------------------ -# Almost same as ATmega1280, except for different memory sizes - -part - id = "m640"; - desc = "ATMEGA640"; - signature = 0x1e 0x96 0x08; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega1280 -#------------------------------------------------------------ - -part - id = "m1280"; - desc = "ATMEGA1280"; - signature = 0x1e 0x97 0x03; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega1281 -#------------------------------------------------------------ -# Identical to ATmega1280 - -part - id = "m1281"; - desc = "ATMEGA1281"; - signature = 0x1e 0x97 0x04; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega2560 -#------------------------------------------------------------ - -part - id = "m2560"; - desc = "ATMEGA2560"; - signature = 0x1e 0x98 0x01; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 262144; - page_size = 256; - num_pages = 1024; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - load_ext_addr = " 0 1 0 0 1 1 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 a16", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega2561 -#------------------------------------------------------------ - -part - id = "m2561"; - desc = "ATMEGA2561"; - signature = 0x1e 0x98 0x02; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 262144; - page_size = 256; - num_pages = 1024; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - load_ext_addr = " 0 1 0 0 1 1 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 a16", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny24 -#------------------------------------------------------------ - -part - id = "t24"; - desc = "ATtiny24"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x91 0x0b; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 128; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 2048; - page_size = 32; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x x a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny44 -#------------------------------------------------------------ - -part - id = "t44"; - desc = "ATtiny44"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x92 0x07; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 256; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", - "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 4096; - page_size = 64; - num_pages = 64; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATtiny84 -#------------------------------------------------------------ - -part - id = "t84"; - desc = "ATtiny84"; - has_debugwire = yes; - flash_instr = 0xB4, 0x07, 0x17; - eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, - 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, - 0x99, 0xE1, 0xBB, 0xAC; -## no STK500 devcode in XML file, use the ATtiny45 one - stk500_devcode = 0x14; -## avr910_devcode = ?; -## Try the AT90S2313 devcode: - avr910_devcode = 0x20; - signature = 0x1e 0x93 0x0c; - reset = io; - chip_erase_delay = 4500; - - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - hvsp_controlstack = - 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, - 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, - 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, - 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; - hventerstabdelay = 100; - hvspcmdexedelay = 0; - synchcycles = 6; - latchcycles = 1; - togglevtg = 1; - poweroffdelay = 25; - resetdelayms = 0; - resetdelayus = 70; - hvleavestabdelay = 100; - resetdelay = 25; - chiperasepolltimeout = 40; - chiperasetime = 0; - programfusepolltimeout = 25; - programlockpolltimeout = 25; - - memory "eeprom" - size = 512; - paged = no; - page_size = 4; - min_write_delay = 4000; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", - "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; - - write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", - "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x x x x", - " x a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 4; - readsize = 256; - ; - memory "flash" - paged = yes; - size = 8192; - page_size = 64; - num_pages = 128; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 x x x x x", - " x x x a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 0 0 0 a11 a10 a9 a8", - " a7 a6 a5 x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 32; - readsize = 256; - ; -# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - - memory "lock" - size = 1; - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x x x x x x x i i"; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x x x x i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", - "0 0 0 0 0 0 0 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB646 -#------------------------------------------------------------ - -part - id = "usb646"; - desc = "AT90USB646"; -# signature = 0x1e 0x96 0x82; ? - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB647 -#------------------------------------------------------------ -# identical to AT90USB646 - -part - id = "usb647"; - desc = "AT90USB647"; -# signature = 0x1e 0x96 0x82; ? - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x x a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB1286 -#------------------------------------------------------------ - -part - id = "usb1286"; - desc = "AT90USB1286"; - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# AT90USB1287 -#------------------------------------------------------------ -# identical to AT90USB1286 - -part - id = "usb1287"; - desc = "AT90USB1287"; - signature = 0x1e 0x97 0x82; - has_jtag = yes; -# stk500_devcode = 0xB2; -# avr910_devcode = 0x43; - chip_erase_delay = 9000; - pagel = 0xD7; - bs2 = 0xA0; - reset = dedicated; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "x x x x x x x x x x x x x x x x"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "x x x x x x x x x x x x x x x x"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - rampz = 0x3b; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 4096; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0x00; - readback_p2 = 0x00; - read = " 1 0 1 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " x x x x a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 x x x a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 131072; - page_size = 256; - num_pages = 512; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0x00; - readback_p2 = 0x00; - read_lo = " 0 0 1 0 0 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " x x x x x x x x", - " x a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - "a15 a14 a13 a12 a11 a10 a9 a8", - " a7 x x x x x x x", - " x x x x x x x x"; - - mode = 0x41; - delay = 6; - blocksize = 256; - readsize = 256; - ; - - memory "lfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "x x x x x x x x i i i i i i i i"; - - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "x x x x x x x x x x x x i i i i"; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "x x x x x x x x o o o o o o o o"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", - "x x x x x x x x 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "calibration" - size = 1; - read = "0 0 1 1 1 0 0 0 x x x x x x x x", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 x x x x x x x x", - "x x x x x x a1 a0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega325 -#------------------------------------------------------------ - -part - id = "m325"; - desc = "ATMEGA325"; - signature = 0x1e 0x95 0x05; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega645 -#------------------------------------------------------------ - -part - id = "m645"; - desc = "ATMEGA645"; - signature = 0x1E 0x96 0x05; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 8; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega3250 -#------------------------------------------------------------ - -part - id = "m3250"; - desc = "ATMEGA3250"; - signature = 0x1E 0x95 0x06; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 4; /* for parallel programming */ - size = 1024; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 0 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 0 a9 a8", - " a7 a6 a5 a4 a3 a2 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 32768; - page_size = 128; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " 0 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; - -#------------------------------------------------------------ -# ATmega6450 -#------------------------------------------------------------ - -part - id = "m6450"; - desc = "ATMEGA6450"; - signature = 0x1E 0x96 0x06; - has_jtag = yes; -# stk500_devcode = 0x??; # No STK500v1 support? -# avr910_devcode = 0x??; # Try the ATmega16 one - avr910_devcode = 0x74; - pagel = 0xd7; - bs2 = 0xa0; - chip_erase_delay = 9000; - pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; - - timeout = 200; - stabdelay = 100; - cmdexedelay = 25; - synchloops = 32; - bytedelay = 0; - pollindex = 3; - pollvalue = 0x53; - predelay = 1; - postdelay = 1; - pollmethod = 1; - - pp_controlstack = - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, - 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; - hventerstabdelay = 100; - progmodedelay = 0; - latchcycles = 5; - togglevtg = 1; - poweroffdelay = 15; - resetdelayms = 1; - resetdelayus = 0; - hvleavestabdelay = 15; - chiperasepulsewidth = 0; - chiperasepolltimeout = 10; - programfusepulsewidth = 0; - programfusepolltimeout = 5; - programlockpulsewidth = 0; - programlockpolltimeout = 5; - - idr = 0x31; - spmcr = 0x57; - allowfullpagebitstream = no; - - memory "eeprom" - paged = no; /* leave this "no" */ - page_size = 8; /* for parallel programming */ - size = 2048; - min_write_delay = 9000; - max_write_delay = 9000; - readback_p1 = 0xff; - readback_p2 = 0xff; - read = " 1 0 1 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - write = " 1 1 0 0 0 0 0 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_lo = " 1 1 0 0 0 0 0 1", - " 0 0 0 0 0 0 0 0", - " 0 0 0 0 0 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 1 1 0 0 0 0 1 0", - " 0 0 0 0 0 a10 a9 a8", - " a7 a6 a5 a4 a3 0 0 0", - " x x x x x x x x"; - - mode = 0x41; - delay = 10; - blocksize = 4; - readsize = 256; - ; - - memory "flash" - paged = yes; - size = 65536; - page_size = 256; - num_pages = 256; - min_write_delay = 4500; - max_write_delay = 4500; - readback_p1 = 0xff; - readback_p2 = 0xff; - read_lo = " 0 0 1 0 0 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - read_hi = " 0 0 1 0 1 0 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " o o o o o o o o"; - - loadpage_lo = " 0 1 0 0 0 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - loadpage_hi = " 0 1 0 0 1 0 0 0", - " 0 0 0 0 0 0 0 0", - " a7 a6 a5 a4 a3 a2 a1 a0", - " i i i i i i i i"; - - writepage = " 0 1 0 0 1 1 0 0", - " a15 a14 a13 a12 a11 a10 a9 a8", - " a7 a6 a5 a4 a3 a2 a1 a0", - " 0 0 0 0 0 0 0 0"; - - mode = 0x41; - delay = 10; - blocksize = 128; - readsize = 256; - ; - - memory "lock" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", - "x x x x x x x x x x o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 1 1 i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "lfuse" - size = 1; - read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "hfuse" - size = 1; - read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", - "0 0 0 0 0 0 0 0 i i i i i i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "efuse" - size = 1; - - read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - - write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", - "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; - min_write_delay = 9000; - max_write_delay = 9000; - ; - - memory "signature" - size = 3; - read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 a1 a0 o o o o o o o o"; - ; - - memory "calibration" - size = 1; - - read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", - "0 0 0 0 0 0 0 0 o o o o o o o o"; - ; - ; diff --git a/ReplicatorG/build/macosx/dist/tools/libiberty.a b/ReplicatorG/build/macosx/dist/tools/libiberty.a deleted file mode 100644 index 341ed07..0000000 Binary files a/ReplicatorG/build/macosx/dist/tools/libiberty.a and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/tools/libusb.a b/ReplicatorG/build/macosx/dist/tools/libusb.a deleted file mode 100644 index b828de9..0000000 Binary files a/ReplicatorG/build/macosx/dist/tools/libusb.a and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/tools/libusb.la b/ReplicatorG/build/macosx/dist/tools/libusb.la deleted file mode 100644 index 42e3bbc..0000000 --- a/ReplicatorG/build/macosx/dist/tools/libusb.la +++ /dev/null @@ -1,35 +0,0 @@ -# libusb.la - a libtool library file -# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42) -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libusb.a' - -# Libraries that this one depends upon. -dependency_libs='' - -# Version information for libusb. -current=8 -age=4 -revision=4 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/AVRMacPack-20081213/lib' diff --git a/ReplicatorG/build/macosx/dist/tools/libusbpp.a b/ReplicatorG/build/macosx/dist/tools/libusbpp.a deleted file mode 100644 index ec37952..0000000 Binary files a/ReplicatorG/build/macosx/dist/tools/libusbpp.a and /dev/null differ diff --git a/ReplicatorG/build/macosx/dist/tools/libusbpp.la b/ReplicatorG/build/macosx/dist/tools/libusbpp.la deleted file mode 100644 index cba48ba..0000000 --- a/ReplicatorG/build/macosx/dist/tools/libusbpp.la +++ /dev/null @@ -1,35 +0,0 @@ -# libusbpp.la - a libtool library file -# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42) -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libusbpp.a' - -# Libraries that this one depends upon. -dependency_libs=' /usr/local/AVRMacPack-20081213/lib/libusb.la' - -# Version information for libusbpp. -current=8 -age=4 -revision=4 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/usr/local/AVRMacPack-20081213/lib' diff --git a/ReplicatorG/build/macosx/jarbundler-2.2.0.jar b/ReplicatorG/build/macosx/jarbundler-2.2.0.jar deleted file mode 100644 index 1009748..0000000 Binary files a/ReplicatorG/build/macosx/jarbundler-2.2.0.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/RXTXcomm.jar b/ReplicatorG/build/shared/lib/RXTXcomm.jar deleted file mode 100644 index 8971c81..0000000 Binary files a/ReplicatorG/build/shared/lib/RXTXcomm.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/filedrop.jar b/ReplicatorG/build/shared/lib/filedrop.jar deleted file mode 100644 index 36d90ca..0000000 Binary files a/ReplicatorG/build/shared/lib/filedrop.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/j3dcore.jar b/ReplicatorG/build/shared/lib/j3dcore.jar deleted file mode 100644 index f28c754..0000000 Binary files a/ReplicatorG/build/shared/lib/j3dcore.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/j3dutils.jar b/ReplicatorG/build/shared/lib/j3dutils.jar deleted file mode 100644 index 90201b3..0000000 Binary files a/ReplicatorG/build/shared/lib/j3dutils.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/jcommon-1.0.16.jar b/ReplicatorG/build/shared/lib/jcommon-1.0.16.jar deleted file mode 100644 index 4cd6807..0000000 Binary files a/ReplicatorG/build/shared/lib/jcommon-1.0.16.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/jfreechart-1.0.13.jar b/ReplicatorG/build/shared/lib/jfreechart-1.0.13.jar deleted file mode 100644 index 83c6993..0000000 Binary files a/ReplicatorG/build/shared/lib/jfreechart-1.0.13.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/keywords.txt b/ReplicatorG/build/shared/lib/keywords.txt deleted file mode 100644 index dab1b7e..0000000 --- a/ReplicatorG/build/shared/lib/keywords.txt +++ /dev/null @@ -1,19 +0,0 @@ -# LITERAL1 specifies constants - -#HIGH LITERAL1 Constants - -# KEYWORD1 specifies datatypes and C/C++ keywords - -#boolean KEYWORD1 BooleanVariables - -# operators aren't highlighted, but may have documentation - -#+= IncrementCompound - -# these are datatypes, but we've also defined functions to cast to them - -#boolean KEYWORD2 boolean_ - -# KEYWORD2 specifies methods and functions - -#abs KEYWORD2 Abs diff --git a/ReplicatorG/build/shared/lib/loading.gif b/ReplicatorG/build/shared/lib/loading.gif deleted file mode 100644 index 619b9c7..0000000 Binary files a/ReplicatorG/build/shared/lib/loading.gif and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/logo.gif b/ReplicatorG/build/shared/lib/logo.gif deleted file mode 100644 index 1ae550a..0000000 Binary files a/ReplicatorG/build/shared/lib/logo.gif and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/miglayout-3.7.4.jar b/ReplicatorG/build/shared/lib/miglayout-3.7.4.jar deleted file mode 100644 index 15ab30a..0000000 Binary files a/ReplicatorG/build/shared/lib/miglayout-3.7.4.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/mrj.jar b/ReplicatorG/build/shared/lib/mrj.jar deleted file mode 100644 index 5faa8e8..0000000 Binary files a/ReplicatorG/build/shared/lib/mrj.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/quaqua.jar b/ReplicatorG/build/shared/lib/quaqua.jar deleted file mode 100644 index 411f397..0000000 Binary files a/ReplicatorG/build/shared/lib/quaqua.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/twitter4j-2.0.10.jar b/ReplicatorG/build/shared/lib/twitter4j-2.0.10.jar deleted file mode 100644 index bc04046..0000000 Binary files a/ReplicatorG/build/shared/lib/twitter4j-2.0.10.jar and /dev/null differ diff --git a/ReplicatorG/build/shared/lib/vecmath.jar b/ReplicatorG/build/shared/lib/vecmath.jar deleted file mode 100644 index 3eda5f9..0000000 Binary files a/ReplicatorG/build/shared/lib/vecmath.jar and /dev/null differ diff --git a/ReplicatorG/build/windows/.cvsignore b/ReplicatorG/build/windows/.cvsignore deleted file mode 100644 index b6254aa..0000000 --- a/ReplicatorG/build/windows/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -work* -processing-* - diff --git a/ReplicatorG/build/windows/dist/ICE_JNIRegistry.dll b/ReplicatorG/build/windows/dist/ICE_JNIRegistry.dll deleted file mode 100644 index 5463a70..0000000 Binary files a/ReplicatorG/build/windows/dist/ICE_JNIRegistry.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/ReplicatorG.exe b/ReplicatorG/build/windows/dist/ReplicatorG.exe deleted file mode 100644 index 975fdd7..0000000 Binary files a/ReplicatorG/build/windows/dist/ReplicatorG.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/cygiconv-2.dll b/ReplicatorG/build/windows/dist/cygiconv-2.dll deleted file mode 100644 index 64fd39e..0000000 Binary files a/ReplicatorG/build/windows/dist/cygiconv-2.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/cygwin1.dll b/ReplicatorG/build/windows/dist/cygwin1.dll deleted file mode 100644 index 83e58ea..0000000 Binary files a/ReplicatorG/build/windows/dist/cygwin1.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/Arduino Mega 2560 usbser Driver/Arduino MEGA 2560.inf b/ReplicatorG/build/windows/dist/drivers/Arduino Mega 2560 usbser Driver/Arduino MEGA 2560.inf deleted file mode 100644 index 2f51973..0000000 --- a/ReplicatorG/build/windows/dist/drivers/Arduino Mega 2560 usbser Driver/Arduino MEGA 2560.inf +++ /dev/null @@ -1,106 +0,0 @@ -;************************************************************ -; Windows USB CDC ACM Setup File -; Copyright (c) 2000 Microsoft Corporation - - -[Version] -Signature="$Windows NT$" -Class=Ports -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} -Provider=%MFGNAME% -LayoutFile=layout.inf -CatalogFile=%MFGFILENAME%.cat -DriverVer=11/15/2007,5.1.2600.0 - -[Manufacturer] -%MFGNAME%=DeviceList, NTamd64 - -[DestinationDirs] -DefaultDestDir=12 - - -;------------------------------------------------------------------------------ -; Windows 2000/XP/Vista-32bit Sections -;------------------------------------------------------------------------------ - -[DriverInstall.nt] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles.nt -AddReg=DriverInstall.nt.AddReg - -[DriverCopyFiles.nt] -usbser.sys,,,0x20 - -[DriverInstall.nt.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,%DRIVERFILENAME%.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.nt.Services] -AddService=usbser, 0x00000002, DriverService.nt - -[DriverService.nt] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\%DRIVERFILENAME%.sys - -;------------------------------------------------------------------------------ -; Vista-64bit Sections -;------------------------------------------------------------------------------ - -[DriverInstall.NTamd64] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles.NTamd64 -AddReg=DriverInstall.NTamd64.AddReg - -[DriverCopyFiles.NTamd64] -%DRIVERFILENAME%.sys,,,0x20 - -[DriverInstall.NTamd64.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,%DRIVERFILENAME%.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.NTamd64.Services] -AddService=usbser, 0x00000002, DriverService.NTamd64 - -[DriverService.NTamd64] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\%DRIVERFILENAME%.sys - - -;------------------------------------------------------------------------------ -; Vendor and Product ID Definitions -;------------------------------------------------------------------------------ -; When developing your USB device, the VID and PID used in the PC side -; application program and the firmware on the microcontroller must match. -; Modify the below line to use your VID and PID. Use the format as shown below. -; Note: One INF file can be used for multiple devices with different VID and PIDs. -; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. -;------------------------------------------------------------------------------ -[SourceDisksFiles] -[SourceDisksNames] -[DeviceList] -%DESCRIPTION%=DriverInstall, USB\VID_2341&PID_0010 - -[DeviceList.NTamd64] -%DESCRIPTION%=DriverInstall, USB\VID_2341&PID_0010 - - -;------------------------------------------------------------------------------ -; String Definitions -;------------------------------------------------------------------------------ -;Modify these strings to customize your device -;------------------------------------------------------------------------------ -[Strings] -MFGFILENAME="CDC_vista" -DRIVERFILENAME ="usbser" -MFGNAME="Arduino LLC (www.arduino.cc)" -INSTDISK="Arduino Mega 2560 Driver Installer" -DESCRIPTION="Arduino Mega 2560" -SERVICE="USB RS-232 Emulation Driver" diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/Static/amd64/ftd2xx.lib b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/Static/amd64/ftd2xx.lib deleted file mode 100644 index 4db96e3..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/Static/amd64/ftd2xx.lib and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/Static/i386/ftd2xx.lib b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/Static/i386/ftd2xx.lib deleted file mode 100644 index c4b94d9..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/Static/i386/ftd2xx.lib and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftbusui.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftbusui.dll deleted file mode 100644 index b2fde4f..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftbusui.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftcserco.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftcserco.dll deleted file mode 100644 index 41942e7..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftcserco.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftd2xx.lib b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftd2xx.lib deleted file mode 100644 index c4776b9..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftd2xx.lib and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftd2xx64.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftd2xx64.dll deleted file mode 100644 index 650d682..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftd2xx64.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftdibus.sys b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftdibus.sys deleted file mode 100644 index d928a60..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftdibus.sys and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftlang.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftlang.dll deleted file mode 100644 index e985dfe..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftlang.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftser2k.sys b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftser2k.sys deleted file mode 100644 index a7a649d..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftser2k.sys and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftserui2.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftserui2.dll deleted file mode 100644 index 2b1987b..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/amd64/ftserui2.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftd2xx.h b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftd2xx.h deleted file mode 100644 index 102333b..0000000 --- a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftd2xx.h +++ /dev/null @@ -1,964 +0,0 @@ -/*++ - -Copyright (c) 2001-2007 Future Technology Devices International Ltd. - -Module Name: - - ftd2xx.h - -Abstract: - - Native USB device driver for FTDI FT8U232/245 - FTD2XX library definitions - -Environment: - - kernel & user mode - -Revision History: - - 13/03/01 awm Created. - 13/01/03 awm Added device information support. - 19/03/03 awm Added FT_W32_CancelIo. - 12/06/03 awm Added FT_StopInTask and FT_RestartInTask. - 18/09/03 awm Added FT_SetResetPipeRetryCount. - 10/10/03 awm Added FT_ResetPort. - 23/01/04 awm Added support for open-by-location. - 16/03/04 awm Added support for FT2232C. - 23/09/04 awm Added support for FT232R. - 20/10/04 awm Added FT_CyclePort. - 18/01/05 awm Added FT_DEVICE_LIST_INFO_NODE type. - 11/02/05 awm Added LocId to FT_DEVICE_LIST_INFO_NODE. - 25/08/05 awm Added FT_SetDeadmanTimeout. - 02/12/05 awm Removed obsolete references. - 05/12/05 awm Added FT_GetVersion, FT_GetVersionEx. - 08/09/06 awm Added FT_W32_GetCommMask. - 11/09/06 awm Added FT_Rescan. - 11/07/07 awm Added support for FT2232H and FT4232H. - 10/08/07 awm Added flags definitions. - 21/11/07 mja Added FT_GetComPortNumber. - 05/06/08 mja Added EEPROM extensions for FT2232H. - - ---*/ - - -#ifndef FTD2XX_H -#define FTD2XX_H - -// The following ifdef block is the standard way of creating macros -// which make exporting from a DLL simpler. All files within this DLL -// are compiled with the FTD2XX_EXPORTS symbol defined on the command line. -// This symbol should not be defined on any project that uses this DLL. -// This way any other project whose source files include this file see -// FTD2XX_API functions as being imported from a DLL, whereas this DLL -// sees symbols defined with this macro as being exported. - -#ifdef FTD2XX_EXPORTS -#define FTD2XX_API __declspec(dllexport) -#else -#define FTD2XX_API __declspec(dllimport) -#endif - - -typedef PVOID FT_HANDLE; -typedef ULONG FT_STATUS; - -// -// Device status -// -enum { - FT_OK, - FT_INVALID_HANDLE, - FT_DEVICE_NOT_FOUND, - FT_DEVICE_NOT_OPENED, - FT_IO_ERROR, - FT_INSUFFICIENT_RESOURCES, - FT_INVALID_PARAMETER, - FT_INVALID_BAUD_RATE, - - FT_DEVICE_NOT_OPENED_FOR_ERASE, - FT_DEVICE_NOT_OPENED_FOR_WRITE, - FT_FAILED_TO_WRITE_DEVICE, - FT_EEPROM_READ_FAILED, - FT_EEPROM_WRITE_FAILED, - FT_EEPROM_ERASE_FAILED, - FT_EEPROM_NOT_PRESENT, - FT_EEPROM_NOT_PROGRAMMED, - FT_INVALID_ARGS, - FT_NOT_SUPPORTED, - FT_OTHER_ERROR, - FT_DEVICE_LIST_NOT_READY, -}; - - -#define FT_SUCCESS(status) ((status) == FT_OK) - -// -// FT_OpenEx Flags -// - -#define FT_OPEN_BY_SERIAL_NUMBER 1 -#define FT_OPEN_BY_DESCRIPTION 2 -#define FT_OPEN_BY_LOCATION 4 - -// -// FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags -// - -#define FT_LIST_NUMBER_ONLY 0x80000000 -#define FT_LIST_BY_INDEX 0x40000000 -#define FT_LIST_ALL 0x20000000 - -#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL) - -// -// Baud Rates -// - -#define FT_BAUD_300 300 -#define FT_BAUD_600 600 -#define FT_BAUD_1200 1200 -#define FT_BAUD_2400 2400 -#define FT_BAUD_4800 4800 -#define FT_BAUD_9600 9600 -#define FT_BAUD_14400 14400 -#define FT_BAUD_19200 19200 -#define FT_BAUD_38400 38400 -#define FT_BAUD_57600 57600 -#define FT_BAUD_115200 115200 -#define FT_BAUD_230400 230400 -#define FT_BAUD_460800 460800 -#define FT_BAUD_921600 921600 - -// -// Word Lengths -// - -#define FT_BITS_8 (UCHAR) 8 -#define FT_BITS_7 (UCHAR) 7 -#define FT_BITS_6 (UCHAR) 6 -#define FT_BITS_5 (UCHAR) 5 - -// -// Stop Bits -// - -#define FT_STOP_BITS_1 (UCHAR) 0 -#define FT_STOP_BITS_1_5 (UCHAR) 1 -#define FT_STOP_BITS_2 (UCHAR) 2 - -// -// Parity -// - -#define FT_PARITY_NONE (UCHAR) 0 -#define FT_PARITY_ODD (UCHAR) 1 -#define FT_PARITY_EVEN (UCHAR) 2 -#define FT_PARITY_MARK (UCHAR) 3 -#define FT_PARITY_SPACE (UCHAR) 4 - -// -// Flow Control -// - -#define FT_FLOW_NONE 0x0000 -#define FT_FLOW_RTS_CTS 0x0100 -#define FT_FLOW_DTR_DSR 0x0200 -#define FT_FLOW_XON_XOFF 0x0400 - -// -// Purge rx and tx buffers -// -#define FT_PURGE_RX 1 -#define FT_PURGE_TX 2 - -// -// Events -// - -typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD); - -#define FT_EVENT_RXCHAR 1 -#define FT_EVENT_MODEM_STATUS 2 -#define FT_EVENT_LINE_STATUS 4 - -// -// Timeouts -// - -#define FT_DEFAULT_RX_TIMEOUT 300 -#define FT_DEFAULT_TX_TIMEOUT 300 - -// -// Device types -// - -typedef ULONG FT_DEVICE; - -enum { - FT_DEVICE_BM, - FT_DEVICE_AM, - FT_DEVICE_100AX, - FT_DEVICE_UNKNOWN, - FT_DEVICE_2232C, - FT_DEVICE_232R, - FT_DEVICE_2232H, - FT_DEVICE_4232H, - FT_DEVICE_232H -}; - - -#ifdef __cplusplus -extern "C" { -#endif - - -FTD2XX_API -FT_STATUS WINAPI FT_Open( - int deviceNumber, - FT_HANDLE *pHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_OpenEx( - PVOID pArg1, - DWORD Flags, - FT_HANDLE *pHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ListDevices( - PVOID pArg1, - PVOID pArg2, - DWORD Flags - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Close( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Read( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD dwBytesToRead, - LPDWORD lpBytesReturned - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Write( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD dwBytesToWrite, - LPDWORD lpBytesWritten - ); - -FTD2XX_API -FT_STATUS WINAPI FT_IoCtl( - FT_HANDLE ftHandle, - DWORD dwIoControlCode, - LPVOID lpInBuf, - DWORD nInBufSize, - LPVOID lpOutBuf, - DWORD nOutBufSize, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBaudRate( - FT_HANDLE ftHandle, - ULONG BaudRate - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDivisor( - FT_HANDLE ftHandle, - USHORT Divisor - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDataCharacteristics( - FT_HANDLE ftHandle, - UCHAR WordLength, - UCHAR StopBits, - UCHAR Parity - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetFlowControl( - FT_HANDLE ftHandle, - USHORT FlowControl, - UCHAR XonChar, - UCHAR XoffChar - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ResetDevice( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDtr( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ClrDtr( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetRts( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ClrRts( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetModemStatus( - FT_HANDLE ftHandle, - ULONG *pModemStatus - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetChars( - FT_HANDLE ftHandle, - UCHAR EventChar, - UCHAR EventCharEnabled, - UCHAR ErrorChar, - UCHAR ErrorCharEnabled - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Purge( - FT_HANDLE ftHandle, - ULONG Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetTimeouts( - FT_HANDLE ftHandle, - ULONG ReadTimeout, - ULONG WriteTimeout - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetQueueStatus( - FT_HANDLE ftHandle, - DWORD *dwRxBytes - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetEventNotification( - FT_HANDLE ftHandle, - DWORD Mask, - PVOID Param - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetStatus( - FT_HANDLE ftHandle, - DWORD *dwRxBytes, - DWORD *dwTxBytes, - DWORD *dwEventDWord - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBreakOn( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBreakOff( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetWaitMask( - FT_HANDLE ftHandle, - DWORD Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_WaitOnMask( - FT_HANDLE ftHandle, - DWORD *Mask - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetEventStatus( - FT_HANDLE ftHandle, - DWORD *dwEventDWord - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ReadEE( - FT_HANDLE ftHandle, - DWORD dwWordOffset, - LPWORD lpwValue - ); - -FTD2XX_API -FT_STATUS WINAPI FT_WriteEE( - FT_HANDLE ftHandle, - DWORD dwWordOffset, - WORD wValue - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EraseEE( - FT_HANDLE ftHandle - ); - -// -// structure to hold program data for FT_Program function -// -typedef struct ft_program_data { - - DWORD Signature1; // Header - must be 0x00000000 - DWORD Signature2; // Header - must be 0xffffffff - DWORD Version; // Header - FT_PROGRAM_DATA version - // 0 = original - // 1 = FT2232C extensions - // 2 = FT232R extensions - // 3 = FT2232H extensions - // 4 = FT4232H extensions - - WORD VendorId; // 0x0403 - WORD ProductId; // 0x6001 - char *Manufacturer; // "FTDI" - char *ManufacturerId; // "FT" - char *Description; // "USB HS Serial Converter" - char *SerialNumber; // "FT000001" if fixed, or NULL - WORD MaxPower; // 0 < MaxPower <= 500 - WORD PnP; // 0 = disabled, 1 = enabled - WORD SelfPowered; // 0 = bus powered, 1 = self powered - WORD RemoteWakeup; // 0 = not capable, 1 = capable - // - // Rev4 (FT232B) extensions - // - UCHAR Rev4; // non-zero if Rev4 chip, zero otherwise - UCHAR IsoIn; // non-zero if in endpoint is isochronous - UCHAR IsoOut; // non-zero if out endpoint is isochronous - UCHAR PullDownEnable; // non-zero if pull down enabled - UCHAR SerNumEnable; // non-zero if serial number to be used - UCHAR USBVersionEnable; // non-zero if chip uses USBVersion - WORD USBVersion; // BCD (0x0200 => USB2) - // - // Rev 5 (FT2232) extensions - // - UCHAR Rev5; // non-zero if Rev5 chip, zero otherwise - UCHAR IsoInA; // non-zero if in endpoint is isochronous - UCHAR IsoInB; // non-zero if in endpoint is isochronous - UCHAR IsoOutA; // non-zero if out endpoint is isochronous - UCHAR IsoOutB; // non-zero if out endpoint is isochronous - UCHAR PullDownEnable5; // non-zero if pull down enabled - UCHAR SerNumEnable5; // non-zero if serial number to be used - UCHAR USBVersionEnable5; // non-zero if chip uses USBVersion - WORD USBVersion5; // BCD (0x0200 => USB2) - UCHAR AIsHighCurrent; // non-zero if interface is high current - UCHAR BIsHighCurrent; // non-zero if interface is high current - UCHAR IFAIsFifo; // non-zero if interface is 245 FIFO - UCHAR IFAIsFifoTar; // non-zero if interface is 245 FIFO CPU target - UCHAR IFAIsFastSer; // non-zero if interface is Fast serial - UCHAR AIsVCP; // non-zero if interface is to use VCP drivers - UCHAR IFBIsFifo; // non-zero if interface is 245 FIFO - UCHAR IFBIsFifoTar; // non-zero if interface is 245 FIFO CPU target - UCHAR IFBIsFastSer; // non-zero if interface is Fast serial - UCHAR BIsVCP; // non-zero if interface is to use VCP drivers - // - // Rev 6 (FT232R) extensions - // - UCHAR UseExtOsc; // Use External Oscillator - UCHAR HighDriveIOs; // High Drive I/Os - UCHAR EndpointSize; // Endpoint size - UCHAR PullDownEnableR; // non-zero if pull down enabled - UCHAR SerNumEnableR; // non-zero if serial number to be used - UCHAR InvertTXD; // non-zero if invert TXD - UCHAR InvertRXD; // non-zero if invert RXD - UCHAR InvertRTS; // non-zero if invert RTS - UCHAR InvertCTS; // non-zero if invert CTS - UCHAR InvertDTR; // non-zero if invert DTR - UCHAR InvertDSR; // non-zero if invert DSR - UCHAR InvertDCD; // non-zero if invert DCD - UCHAR InvertRI; // non-zero if invert RI - UCHAR Cbus0; // Cbus Mux control - UCHAR Cbus1; // Cbus Mux control - UCHAR Cbus2; // Cbus Mux control - UCHAR Cbus3; // Cbus Mux control - UCHAR Cbus4; // Cbus Mux control - UCHAR RIsD2XX; // non-zero if using D2XX driver - // - // Rev 7 (FT2232H) Extensions - // - UCHAR PullDownEnable7; // non-zero if pull down enabled - UCHAR SerNumEnable7; // non-zero if serial number to be used - UCHAR ALSlowSlew; // non-zero if AL pins have slow slew - UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR AHSlowSlew; // non-zero if AH pins have slow slew - UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BLSlowSlew; // non-zero if BL pins have slow slew - UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BHSlowSlew; // non-zero if BH pins have slow slew - UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR IFAIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFAIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFAIsFastSer7; // non-zero if interface is Fast serial - UCHAR AIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR IFBIsFifo7; // non-zero if interface is 245 FIFO - UCHAR IFBIsFifoTar7; // non-zero if interface is 245 FIFO CPU target - UCHAR IFBIsFastSer7; // non-zero if interface is Fast serial - UCHAR BIsVCP7; // non-zero if interface is to use VCP drivers - UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs - // - // Rev 8 (FT4232H) Extensions - // - UCHAR PullDownEnable8; // non-zero if pull down enabled - UCHAR SerNumEnable8; // non-zero if serial number to be used - UCHAR ASlowSlew; // non-zero if AL pins have slow slew - UCHAR ASchmittInput; // non-zero if AL pins are Schmitt input - UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR BSlowSlew; // non-zero if AH pins have slow slew - UCHAR BSchmittInput; // non-zero if AH pins are Schmitt input - UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR CSlowSlew; // non-zero if BL pins have slow slew - UCHAR CSchmittInput; // non-zero if BL pins are Schmitt input - UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR DSlowSlew; // non-zero if BH pins have slow slew - UCHAR DSchmittInput; // non-zero if BH pins are Schmitt input - UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA - UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN - UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN - UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN - UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN - UCHAR AIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR BIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR CIsVCP8; // non-zero if interface is to use VCP drivers - UCHAR DIsVCP8; // non-zero if interface is to use VCP drivers - -} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA; - -FTD2XX_API -FT_STATUS WINAPI FT_EE_Program( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_ProgramEx( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData, - char *Manufacturer, - char *ManufacturerId, - char *Description, - char *SerialNumber - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_Read( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_ReadEx( - FT_HANDLE ftHandle, - PFT_PROGRAM_DATA pData, - char *Manufacturer, - char *ManufacturerId, - char *Description, - char *SerialNumber - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UASize( - FT_HANDLE ftHandle, - LPDWORD lpdwSize - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UAWrite( - FT_HANDLE ftHandle, - PUCHAR pucData, - DWORD dwDataLen - ); - -FTD2XX_API -FT_STATUS WINAPI FT_EE_UARead( - FT_HANDLE ftHandle, - PUCHAR pucData, - DWORD dwDataLen, - LPDWORD lpdwBytesRead - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetLatencyTimer( - FT_HANDLE ftHandle, - UCHAR ucLatency - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetLatencyTimer( - FT_HANDLE ftHandle, - PUCHAR pucLatency - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetBitMode( - FT_HANDLE ftHandle, - UCHAR ucMask, - UCHAR ucEnable - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetBitMode( - FT_HANDLE ftHandle, - PUCHAR pucMode - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetUSBParameters( - FT_HANDLE ftHandle, - ULONG ulInTransferSize, - ULONG ulOutTransferSize - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetDeadmanTimeout( - FT_HANDLE ftHandle, - ULONG ulDeadmanTimeout - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfo( - FT_HANDLE ftHandle, - FT_DEVICE *lpftDevice, - LPDWORD lpdwID, - PCHAR SerialNumber, - PCHAR Description, - LPVOID Dummy - ); - -FTD2XX_API -FT_STATUS WINAPI FT_StopInTask( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_RestartInTask( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_SetResetPipeRetryCount( - FT_HANDLE ftHandle, - DWORD dwCount - ); - -FTD2XX_API -FT_STATUS WINAPI FT_ResetPort( - FT_HANDLE ftHandle - ); - -FTD2XX_API -FT_STATUS WINAPI FT_CyclePort( - FT_HANDLE ftHandle - ); - - -// -// Win32-type functions -// - -FTD2XX_API -FT_HANDLE WINAPI FT_W32_CreateFile( - LPCTSTR lpszName, - DWORD dwAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreate, - DWORD dwAttrsAndFlags, - HANDLE hTemplate - ); - -FTD2XX_API -BOOL WINAPI FT_W32_CloseHandle( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_ReadFile( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesReturned, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -BOOL WINAPI FT_W32_WriteFile( - FT_HANDLE ftHandle, - LPVOID lpBuffer, - DWORD nBufferSize, - LPDWORD lpBytesWritten, - LPOVERLAPPED lpOverlapped - ); - -FTD2XX_API -DWORD WINAPI FT_W32_GetLastError( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetOverlappedResult( - FT_HANDLE ftHandle, - LPOVERLAPPED lpOverlapped, - LPDWORD lpdwBytesTransferred, - BOOL bWait - ); - -FTD2XX_API -BOOL WINAPI FT_W32_CancelIo( - FT_HANDLE ftHandle - ); - - -// -// Win32 COMM API type functions -// -typedef struct _FTCOMSTAT { - DWORD fCtsHold : 1; - DWORD fDsrHold : 1; - DWORD fRlsdHold : 1; - DWORD fXoffHold : 1; - DWORD fXoffSent : 1; - DWORD fEof : 1; - DWORD fTxim : 1; - DWORD fReserved : 25; - DWORD cbInQue; - DWORD cbOutQue; -} FTCOMSTAT, *LPFTCOMSTAT; - -typedef struct _FTDCB { - DWORD DCBlength; /* sizeof(FTDCB) */ - DWORD BaudRate; /* Baudrate at which running */ - DWORD fBinary: 1; /* Binary Mode (skip EOF check) */ - DWORD fParity: 1; /* Enable parity checking */ - DWORD fOutxCtsFlow:1; /* CTS handshaking on output */ - DWORD fOutxDsrFlow:1; /* DSR handshaking on output */ - DWORD fDtrControl:2; /* DTR Flow control */ - DWORD fDsrSensitivity:1; /* DSR Sensitivity */ - DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */ - DWORD fOutX: 1; /* Enable output X-ON/X-OFF */ - DWORD fInX: 1; /* Enable input X-ON/X-OFF */ - DWORD fErrorChar: 1; /* Enable Err Replacement */ - DWORD fNull: 1; /* Enable Null stripping */ - DWORD fRtsControl:2; /* Rts Flow control */ - DWORD fAbortOnError:1; /* Abort all reads and writes on Error */ - DWORD fDummy2:17; /* Reserved */ - WORD wReserved; /* Not currently used */ - WORD XonLim; /* Transmit X-ON threshold */ - WORD XoffLim; /* Transmit X-OFF threshold */ - BYTE ByteSize; /* Number of bits/byte, 4-8 */ - BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */ - BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */ - char XonChar; /* Tx and Rx X-ON character */ - char XoffChar; /* Tx and Rx X-OFF character */ - char ErrorChar; /* Error replacement char */ - char EofChar; /* End of Input character */ - char EvtChar; /* Received Event character */ - WORD wReserved1; /* Fill for now. */ -} FTDCB, *LPFTDCB; - -typedef struct _FTTIMEOUTS { - DWORD ReadIntervalTimeout; /* Maximum time between read chars. */ - DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */ - DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */ - DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */ - DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */ -} FTTIMEOUTS,*LPFTTIMEOUTS; - - -FTD2XX_API -BOOL WINAPI FT_W32_ClearCommBreak( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_ClearCommError( - FT_HANDLE ftHandle, - LPDWORD lpdwErrors, - LPFTCOMSTAT lpftComstat - ); - -FTD2XX_API -BOOL WINAPI FT_W32_EscapeCommFunction( - FT_HANDLE ftHandle, - DWORD dwFunc - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommModemStatus( - FT_HANDLE ftHandle, - LPDWORD lpdwModemStatus - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommState( - FT_HANDLE ftHandle, - LPFTDCB lpftDcb - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommTimeouts( - FT_HANDLE ftHandle, - FTTIMEOUTS *pTimeouts - ); - -FTD2XX_API -BOOL WINAPI FT_W32_PurgeComm( - FT_HANDLE ftHandle, - DWORD dwMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommBreak( - FT_HANDLE ftHandle - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommMask( - FT_HANDLE ftHandle, - ULONG ulEventMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_GetCommMask( - FT_HANDLE ftHandle, - LPDWORD lpdwEventMask - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommState( - FT_HANDLE ftHandle, - LPFTDCB lpftDcb - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetCommTimeouts( - FT_HANDLE ftHandle, - FTTIMEOUTS *pTimeouts - ); - -FTD2XX_API -BOOL WINAPI FT_W32_SetupComm( - FT_HANDLE ftHandle, - DWORD dwReadBufferSize, - DWORD dwWriteBufferSize - ); - -FTD2XX_API -BOOL WINAPI FT_W32_WaitCommEvent( - FT_HANDLE ftHandle, - PULONG pulEvent, - LPOVERLAPPED lpOverlapped - ); - - -// -// Device information -// - -typedef struct _ft_device_list_info_node { - ULONG Flags; - ULONG Type; - ULONG ID; - DWORD LocId; - char SerialNumber[16]; - char Description[64]; - FT_HANDLE ftHandle; -} FT_DEVICE_LIST_INFO_NODE; - -// Device information flags -enum { - FT_FLAGS_OPENED = 1, - FT_FLAGS_HISPEED = 2 -}; - - -FTD2XX_API -FT_STATUS WINAPI FT_CreateDeviceInfoList( - LPDWORD lpdwNumDevs - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfoList( - FT_DEVICE_LIST_INFO_NODE *pDest, - LPDWORD lpdwNumDevs - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetDeviceInfoDetail( - DWORD dwIndex, - LPDWORD lpdwFlags, - LPDWORD lpdwType, - LPDWORD lpdwID, - LPDWORD lpdwLocId, - LPVOID lpSerialNumber, - LPVOID lpDescription, - FT_HANDLE *pftHandle - ); - - -// -// Version information -// - -FTD2XX_API -FT_STATUS WINAPI FT_GetDriverVersion( - FT_HANDLE ftHandle, - LPDWORD lpdwVersion - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetLibraryVersion( - LPDWORD lpdwVersion - ); - - -FTD2XX_API -FT_STATUS WINAPI FT_Rescan( - void - ); - -FTD2XX_API -FT_STATUS WINAPI FT_Reload( - WORD wVid, - WORD wPid - ); - -FTD2XX_API -FT_STATUS WINAPI FT_GetComPortNumber( - FT_HANDLE ftHandle, - LPLONG lpdwComPortNumber - ); - - - -#ifdef __cplusplus -} -#endif - - -#endif /* FTD2XX_H */ - diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdibus.cat b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdibus.cat deleted file mode 100644 index a9faaad..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdibus.cat and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdibus.inf b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdibus.inf deleted file mode 100644 index 82ff650..0000000 --- a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdibus.inf +++ /dev/null @@ -1,137 +0,0 @@ -; FTDIBUS.INF -; Copyright (c) 2000-2010 FTDI Ltd. -; -; USB serial converter driver installation file for Windows 2000, XP, Server 2003, Vista, Server 2008, -; Windows 7 and Server 2008 R2 (x86 and x64). -; -; FTDI device drivers may be used only in conjunction with products based on FTDI parts. -; The driver may be distributed in any form as long as our license information is not modified. -; If a custom Vendor ID and/or Product ID, or description string are used, it is the responsibility of -; the product manufacturer to maintain any changes and subsequent WHQL re-certification as a result of -; making these changes. -; -; - -[Version] -Signature="$Windows NT$" -DriverPackageType=PlugAndPlay -DriverPackageDisplayName=%DESC% -Class=USB -ClassGUID={36fc9e60-c465-11cf-8056-444553540000} -Provider=%FTDI% -CatalogFile=ftdibus.cat -DriverVer=03/30/2010,2.06.02 - -[SourceDisksNames] -1=%DriversDisk%,,, - -[SourceDisksFiles] -ftdibus.sys = 1,i386 -ftbusui.dll = 1,i386 -ftd2xx.dll = 1,i386 -FTLang.Dll = 1,i386 - -[SourceDisksFiles.amd64] -ftdibus.sys = 1,amd64 -ftbusui.dll = 1,amd64 -ftd2xx64.dll = 1,amd64 -ftd2xx.dll = 1,i386 -FTLang.Dll = 1,amd64 - -[DestinationDirs] -FtdiBus.NT.Copy = 10,system32\drivers -FtdiBus.NT.Copy2 = 10,system32 -FtdiBus.NTamd64.Copy = 10,system32\drivers -FtdiBus.NTamd64.Copy2 = 10,system32 -FtdiBus.NTamd64.Copy3 = 10,syswow64 - - -[Manufacturer] -%Ftdi%=FtdiHw,NTamd64 - -[FtdiHw] -%USB\VID_0403&PID_6001.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6001 -%USB\VID_0403&PID_6010&MI_00.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6010&MI_00 -%USB\VID_0403&PID_6010&MI_01.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6010&MI_01 -%USB\VID_0403&PID_6011&MI_00.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_00 -%USB\VID_0403&PID_6011&MI_01.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_01 -%USB\VID_0403&PID_6011&MI_02.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_02 -%USB\VID_0403&PID_6011&MI_03.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_03 - -[FtdiHw.NTamd64] -%USB\VID_0403&PID_6001.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6001 -%USB\VID_0403&PID_6010&MI_00.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6010&MI_00 -%USB\VID_0403&PID_6010&MI_01.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6010&MI_01 -%USB\VID_0403&PID_6011&MI_00.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_00 -%USB\VID_0403&PID_6011&MI_01.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_01 -%USB\VID_0403&PID_6011&MI_02.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_02 -%USB\VID_0403&PID_6011&MI_03.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_03 - -[ControlFlags] -ExcludeFromSelect=* - -[FtdiBus.NT] -CopyFiles=FtdiBus.NT.Copy,FtdiBus.NT.Copy2 -AddReg=FtdiBus.NT.AddReg - -[FtdiBus.NTamd64] -CopyFiles=FtdiBus.NTamd64.Copy,FtdiBus.NTamd64.Copy2,FtdiBus.NTamd64.Copy3 -AddReg=FtdiBus.NT.AddReg - -[FtdiBus.NT.Services] -AddService = FTDIBUS, 0x00000002, FtdiBus.NT.AddService - -[FtdiBus.NTamd64.Services] -AddService = FTDIBUS, 0x00000002, FtdiBus.NT.AddService - -[FtdiBus.NT.AddService] -DisplayName = %SvcDesc% -ServiceType = 1 ; SERVICE_KERNEL_DRIVER -StartType = 3 ; SERVICE_DEMAND_START -ErrorControl = 1 ; SERVICE_ERROR_NORMAL -ServiceBinary = %10%\system32\drivers\ftdibus.sys -LoadOrderGroup = Base -AddReg = FtdiBus.NT.AddService.AddReg - -[FtdiBus.NT.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,ftdibus.sys -HKR,,EnumPropPages32,,"ftbusui.dll,FTBUSUIPropPageProvider" - -[FtdiBus.NT.AddService.AddReg] -;HKR,Parameters,"LocIds",1,31,00,00,00,32,00,00,00,00 -;HKR,Parameters,"RetryResetCount",0x10001,50 - - -[FtdiBus.NT.Copy] -ftdibus.sys - -[FtdiBus.NT.Copy2] -ftbusui.dll -ftd2xx.dll -FTLang.dll - -[FtdiBus.NTamd64.Copy] -ftdibus.sys - -[FtdiBus.NTamd64.Copy2] -ftbusui.dll -ftd2xx.dll,ftd2xx64.dll -FTLang.dll - -[FtdiBus.NTamd64.Copy3] -ftd2xx.dll - -[Strings] -Ftdi="FTDI" -DESC="CDM Driver Package" -DriversDisk="FTDI USB Drivers Disk" -USB\VID_0403&PID_6001.DeviceDesc="USB Serial Converter" -USB\VID_0403&PID_6010&MI_00.DeviceDesc="USB Serial Converter A" -USB\VID_0403&PID_6010&MI_01.DeviceDesc="USB Serial Converter B" -USB\VID_0403&PID_6011&MI_00.DeviceDesc="USB Serial Converter A" -USB\VID_0403&PID_6011&MI_01.DeviceDesc="USB Serial Converter B" -USB\VID_0403&PID_6011&MI_02.DeviceDesc="USB Serial Converter C" -USB\VID_0403&PID_6011&MI_03.DeviceDesc="USB Serial Converter D" -SvcDesc="USB Serial Converter Driver" -ClassName="USB" diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdiport.cat b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdiport.cat deleted file mode 100644 index 455ebe8..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdiport.cat and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdiport.inf b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdiport.inf deleted file mode 100644 index bf37dae..0000000 --- a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/ftdiport.inf +++ /dev/null @@ -1,174 +0,0 @@ -; FTDIPORT.INF -; Copyright (c) 2000-2010 FTDI Ltd. -; -; USB serial port driver installation file for Windows 2000, XP, Server 2003, Vista, Server 2008, -; Windows 7 and Server 2008 R2 (x86 and x64). -; -; FTDI device drivers may be used only in conjunction with products based on FTDI parts. -; The driver may be distributed in any form as long as our license information is not modified. -; If a custom Vendor ID and/or Product ID, or description string are used, it is the responsibility of -; the product manufacturer to maintain any changes and subsequent WHQL re-certification as a result of -; making these changes. -; -; - -[Version] -Signature="$Windows NT$" -DriverPackageType=PlugAndPlay -DriverPackageDisplayName=%DESC% -Class=Ports -ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318} -Provider=%FTDI% -CatalogFile=ftdiport.cat -DriverVer=03/30/2010,2.06.02 - -[SourceDisksNames] -1=%DriversDisk%,,, - -[SourceDisksFiles] -ftser2k.sys=1,i386 -ftserui2.dll=1,i386 -ftcserco.dll = 1,i386 - -[SourceDisksFiles.amd64] -ftser2k.sys=1,amd64 -ftserui2.dll=1,amd64 -ftcserco.dll = 1,amd64 - -[DestinationDirs] -FtdiPort.NT.Copy=10,system32\drivers -FtdiPort.NT.CopyUI=10,system32 -FtdiPort2232.NT.CopyCoInst=10,system32 - -[ControlFlags] -ExcludeFromSelect=* - -[Manufacturer] -%FTDI%=FtdiHw,NTamd64 - -[FtdiHw] -%VID_0403&PID_6001.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&PID_6001 -%VID_0403&PID_6010.DeviceDesc%=FtdiPort2232.NT,FTDIBUS\COMPORT&VID_0403&PID_6010 -%VID_0403&PID_6011.DeviceDesc%=FtdiPort2232.NT,FTDIBUS\COMPORT&VID_0403&PID_6011 - -[FtdiHw.NTamd64] -%VID_0403&PID_6001.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6001 -%VID_0403&PID_6010.DeviceDesc%=FtdiPort2232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6010 -%VID_0403&PID_6011.DeviceDesc%=FtdiPort2232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6011 - -[FtdiPort.NT.AddService] -DisplayName = %SvcDesc% -ServiceType = 1 ; SERVICE_KERNEL_DRIVER -StartType = 3 ; SERVICE_DEMAND_START -ErrorControl = 1 ; SERVICE_ERROR_NORMAL -ServiceBinary = %10%\system32\drivers\ftser2k.sys -LoadOrderGroup = Base - -; -------------- Serenum Driver install section -[SerEnum_AddService] -DisplayName = %SerEnum.SvcDesc% -ServiceType = 1 ; SERVICE_KERNEL_DRIVER -StartType = 3 ; SERVICE_DEMAND_START -ErrorControl = 1 ; SERVICE_ERROR_NORMAL -ServiceBinary = %12%\serenum.sys -LoadOrderGroup = PNP Filter - -[FtdiPort.NT.AddReg] -HKR,,EnumPropPages32,,"ftserui2.dll,SerialPortPropPageProvider" - -[FtdiPort.NT.Copy] -ftser2k.sys - -[FtdiPort.NT.CopyUI] -ftserui2.dll - -[FtdiPort232.NT] -CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI -AddReg=FtdiPort.NT.AddReg - -[FtdiPort232.NTamd64] -CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI -AddReg=FtdiPort.NT.AddReg - -[FtdiPort232.NT.HW] -AddReg=FtdiPort232.NT.HW.AddReg - -[FtdiPort232.NTamd64.HW] -AddReg=FtdiPort232.NT.HW.AddReg - -[FtdiPort232.NT.Services] -AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService -AddService = Serenum,,SerEnum_AddService -DelService = FTSERIAL - -[FtdiPort232.NTamd64.Services] -AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService -AddService = Serenum,,SerEnum_AddService -DelService = FTSERIAL - -[FtdiPort232.NT.HW.AddReg] -HKR,,"UpperFilters",0x00010000,"serenum" -HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00 -HKR,,"MinReadTimeout",0x00010001,0 -HKR,,"MinWriteTimeout",0x00010001,0 -HKR,,"LatencyTimer",0x00010001,16 - - -; ------------------------------------------------------------------------------ -; -; Multiple interface device section - includes FT2232C/D/L, FT2232H and FT4232H -; -; ------------------------------------------------------------------------------ - -[FtdiPort2232.NT] -CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI -AddReg=FtdiPort.NT.AddReg - -[FtdiPort2232.NTamd64] -CopyFiles=FtdiPort.NT.Copy,FtdiPort.NT.CopyUI -AddReg=FtdiPort.NT.AddReg - -[FtdiPort2232.NT.HW] -AddReg=FtdiPort232.NT.HW.AddReg - -[FtdiPort2232.NTamd64.HW] -AddReg=FtdiPort232.NT.HW.AddReg - -[FtdiPort2232.NT.CoInstallers] -AddReg=FtdiPort2232.NT.CoInstallers.AddReg -CopyFiles=FtdiPort2232.NT.CopyCoInst - -[FtdiPort2232.NTamd64.CoInstallers] -AddReg=FtdiPort2232.NT.CoInstallers.AddReg -CopyFiles=FtdiPort2232.NT.CopyCoInst - -[FtdiPort2232.NT.Services] -AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService -AddService = Serenum,,SerEnum_AddService -DelService = FTSERIAL - -[FtdiPort2232.NTamd64.Services] -AddService = FTSER2K, 0x00000002, FtdiPort.NT.AddService -AddService = Serenum,,SerEnum_AddService -DelService = FTSERIAL - -[FtdiPort2232.NT.CoInstallers.AddReg] -HKR,,CoInstallers32,0x00010000,"ftcserco.Dll,FTCSERCoInstaller" - -[FtdiPort2232.NT.CopyCoInst] -ftcserco.dll - -;---------------------------------------------------------------; - -[Strings] -FTDI="FTDI" -DESC="CDM Driver Package" -DriversDisk="FTDI USB Drivers Disk" -PortsClassName = "Ports (COM & LPT)" -VID_0403&PID_6001.DeviceDesc="USB Serial Port" -VID_0403&PID_6010.DeviceDesc="USB Serial Port" -VID_0403&PID_6011.DeviceDesc="USB Serial Port" -SvcDesc="USB Serial Port Driver" -SerEnum.SvcDesc="Serenum Filter Driver" - - diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftbusui.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftbusui.dll deleted file mode 100644 index 148356d..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftbusui.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftcserco.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftcserco.dll deleted file mode 100644 index 9dda2ec..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftcserco.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftd2xx.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftd2xx.dll deleted file mode 100644 index 8041518..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftd2xx.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftd2xx.lib b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftd2xx.lib deleted file mode 100644 index 18acc1e..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftd2xx.lib and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftdibus.sys b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftdibus.sys deleted file mode 100644 index 66852e6..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftdibus.sys and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftlang.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftlang.dll deleted file mode 100644 index 58c5ba5..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftlang.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftser2k.sys b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftser2k.sys deleted file mode 100644 index 71fbb78..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftser2k.sys and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftserui2.dll b/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftserui2.dll deleted file mode 100644 index 672e4c0..0000000 Binary files a/ReplicatorG/build/windows/dist/drivers/FTDI USB Drivers/i386/ftserui2.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/j3dcore-d3d.dll b/ReplicatorG/build/windows/dist/j3dcore-d3d.dll deleted file mode 100644 index e9a3901..0000000 Binary files a/ReplicatorG/build/windows/dist/j3dcore-d3d.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/j3dcore-ogl-cg.dll b/ReplicatorG/build/windows/dist/j3dcore-ogl-cg.dll deleted file mode 100644 index 2ec07eb..0000000 Binary files a/ReplicatorG/build/windows/dist/j3dcore-ogl-cg.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/j3dcore-ogl-chk.dll b/ReplicatorG/build/windows/dist/j3dcore-ogl-chk.dll deleted file mode 100644 index 37afe01..0000000 Binary files a/ReplicatorG/build/windows/dist/j3dcore-ogl-chk.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/j3dcore-ogl.dll b/ReplicatorG/build/windows/dist/j3dcore-ogl.dll deleted file mode 100644 index fb9b600..0000000 Binary files a/ReplicatorG/build/windows/dist/j3dcore-ogl.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/COPYRIGHT b/ReplicatorG/build/windows/dist/java/COPYRIGHT deleted file mode 100644 index 2ae2120..0000000 --- a/ReplicatorG/build/windows/dist/java/COPYRIGHT +++ /dev/null @@ -1,74 +0,0 @@ -Copyright © 2009 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -California 95054, U.S.A. All rights reserved. - -Sun Microsystems, Inc. has intellectual property rights relating to -technology embodied in the product that is described in this document. -In particular, and without limitation, these intellectual property -rights may include one or more of the U.S. patents listed at -http://www.sun.com/patents and one or more additional patents or pending -patent applications in the U.S. and in other countries. - -THIS PRODUCT CONTAINS CONFIDENTIAL INFORMATION AND TRADE SECRETS OF SUN -MICROSYSTEMS, INC. USE, DISCLOSURE OR REPRODUCTION IS PROHIBITED -WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SUN MICROSYSTEMS, INC. - -U.S. Government Rights - Commercial software. Government users are -subject to the Sun Microsystems, Inc. standard license agreement and -applicable provisions of the FAR and its supplements. - -Use is subject to license terms. - -This distribution may include materials developed by third parties. - -Sun, Sun Microsystems, the Sun logo, Java and Java SE are trademarks or -registered trademarks of Sun Microsystems, Inc. in the U.S. and other -countries. - -This product is covered and controlled by U.S. Export Control laws and -may be subject to the export or import laws in other countries. -Nuclear, missile, chemical biological weapons or nuclear maritime end -uses or end users, whether direct or indirect, are strictly prohibited. -Export or reexport to countries subject to U.S. embargo or to entities -identified on U.S. export exclusion lists, including, but not limited -to, the denied persons and specially designated nationals lists is -strictly prohibited. - -Copyright © 2009 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, -California 95054, Etats-Unis. Tous droits rservs. - -Sun Microsystems, Inc. dtient les droits de proprit intellectuele -relatifs la technologie incorpore dans le produit qui est dcrit dans ce -document. En particulier, et ce sans limitation, ces droits de proprit -intellectuelle peuvent inclure un ou plusieurs des brevets amricains -lists l'adresse suivante: http://www.sun.com/patents et un ou -plusieures de brevet en attente aux Etats - Unis et dans les autres -pays. - -CE PRODUIT CONTIENT DES INFORMATIONS CONFIDENTIELLES ET DES SECRETS -COMMERCIAUX DE SUN MICROSYSTEMS, INC. SON UTILISATION, SA DIVULGATION -ET SA REPRODUCTION SONT INTERDITES SANS L AUTORISATION EXPRESSE, ECRITE -ET PREALABLE DE SUN MICROSYSTEMS, INC. - -L'utilisation est soumise aux termes du contract de licence. - -Cette distributions peut inclure des elements dvelopps par des tiers. - -Sun, Sun Microsystems, le logo Sun, Java et Java SE sont des marques de -fabrique ou des marques dposes de Sun Microsystems, Inc. aux Etats-Unis -et dans d'autres pays. - -Ce produit est soumis la lgislation amricaine en matire de contrle des -exportations et peut tre soumis la rglementation en vigueur dans -d'autres pays dans le domaine des exportations et importations. Les -utilisations finales, ou utilisateurs finaux, pour des armes -nuclaires,des missiles, des armes biologiques et chimiques ou du -nuclaire maritime, directement ou indirectement, sont strictement -interdites. Les exportations ou rexportations vers les pays sous -embargo amricain, ou vers des entits figurant sur les listes d'exclusion -d'exportation des produits ou des services qui sont regis parla -legislation amricaines, y compris, mais de manire non exhaustive, la -liste de personnes qui font objet d'un ordre de ne pas participer, d'une -faon directe ou indirecte, aux exportations des produits ou des services -qui sont rgis par la lgislation amricaine sur le contrle des -exportations et la liste de ressortissants spcifiquement dsigns, sont -rigoureusement interdites. diff --git a/ReplicatorG/build/windows/dist/java/LICENSE b/ReplicatorG/build/windows/dist/java/LICENSE deleted file mode 100644 index 46280da..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE +++ /dev/null @@ -1,261 +0,0 @@ -Sun Microsystems, Inc. Binary Code License Agreement - -for the JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6 and -JAVAFX RUNTIME VERSION 1 - -SUN MICROSYSTEMS, INC. ("SUN") IS WILLING TO LICENSE THE -SOFTWARE IDENTIFIED BELOW TO YOU ONLY UPON THE CONDITION -THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY -CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS -(COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT -CAREFULLY. BY USING THE SOFTWARE YOU ACKNOWLEDGE THAT -YOU HAVE READ THE TERMS AND AGREE TO THEM. IF YOU ARE -AGREEING TO THESE TERMS ON BEHALF OF A COMPANY OR OTHER -LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL -AUTHORITY TO BIND THE LEGAL ENTITY TO THESE TERMS. IF -YOU DO NOT HAVE SUCH AUTHORITY, OR IF YOU DO NOT WISH -TO BE BOUND BY THE TERMS, THEN YOU MUST NOT USE THE -SOFTWARE ON THIS SITE OR ANY OTHER MEDIA ON WHICH THE -SOFTWARE IS CONTAINED. - -1. DEFINITIONS. "Software" means the identified above in -binary form, any other machine readable materials -(including, but not limited to, libraries, source files, -header files, and data files), any updates or error -corrections provided by Sun, and any user manuals, -programming guides and other documentation provided to you -by Sun under this Agreement. "General Purpose Desktop -Computers and Servers" means computers, including desktop -and laptop computers, or servers, used for general -computing functions under end user control (such as but not -specifically limited to email, general purpose Internet -browsing, and office suite productivity tools). The use of -Software in systems and solutions that provide dedicated -functionality (other than as mentioned above) or designed -for use in embedded or function-specific software -applications, for example but not limited to: Software -embedded in or bundled with industrial control systems, -wireless mobile telephones, wireless handheld devices, -netbooks, kiosks, TV/STB, Blu-ray Disc devices, telematics -and network control switching equipment, printers and -storage management systems, and other related systems are -excluded from this definition and not licensed under this -Agreement. "Programs" means (a) Java technology applets and -applications intended to run on the Java Platform Standard -Edition (Java SE) platform on Java-enabled General Purpose -Desktop Computers and Servers, and (b) JavaFX technology -applications intended to run on the JavaFX Runtime on -JavaFX-enabled General Purpose Desktop Computers and -Servers. - -2. LICENSE TO USE. Subject to the terms and conditions of -this Agreement, including, but not limited to the Java -Technology Restrictions of the Supplemental License Terms, -Sun grants you a non-exclusive, non-transferable, limited -license without license fees to reproduce and use internally -Software complete and unmodified for the sole purpose of -running Programs. Additional licenses for developers and/or -publishers are granted in the Supplemental License Terms. - -3. RESTRICTIONS. Software is confidential and copyrighted. -Title to Software and all associated intellectual property -rights is retained by Sun and/or its licensors. Unless -enforcement is prohibited by applicable law, you may not -modify, decompile, or reverse engineer Software. You -acknowledge that Licensed Software is not designed or -intended for use in the design, construction, operation or -maintenance of any nuclear facility. Sun Microsystems, Inc. -disclaims any express or implied warranty of fitness for -such uses. No right, title or interest in or to any -trademark, service mark, logo or trade name of Sun or its -licensors is granted under this Agreement. Additional -restrictions for developers and/or publishers licenses are -set forth in the Supplemental License Terms. - -4. LIMITED WARRANTY. Sun warrants to you that for a period -of ninety (90) days from the date of purchase, as evidenced -by a copy of the receipt, the media on which Software is -furnished (if any) will be free of defects in materials and -workmanship under normal use. Except for the foregoing, -Software is provided "AS IS". Your exclusive remedy and -Sun's entire liability under this limited warranty will be -at Sun's option to replace Software media or refund the fee -paid for Software. Any implied warranties on the Software -are limited to 90 days. Some states do not allow -limitations on duration of an implied warranty, so the above -may not apply to you. This limited warranty gives you -specific legal rights. You may have others, which vary from -state to state. - -5. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS -AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, -REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED -WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE -EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY -INVALID. - -6. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED -BY LAW, IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR -ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, -CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER -CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF -OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN -IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -In no event will Sun's liability to you, whether in -contract, tort (including negligence), or otherwise, exceed -the amount paid by you for Software under this Agreement. -The foregoing limitations will apply even if the above -stated warranty fails of its essential purpose. Some states -do not allow the exclusion of incidental or consequential -damages, so some of the terms above may not be applicable to -you. - -7. TERMINATION. This Agreement is effective until -terminated. You may terminate this Agreement at any time by -destroying all copies of Software. This Agreement will -terminate immediately without notice from Sun if you fail to -comply with any provision of this Agreement. Either party -may terminate this Agreement immediately should any Software -become, or in either party's opinion be likely to become, -the subject of a claim of infringement of any intellectual -property right. Upon Termination, you must destroy all -copies of Software. - -8. EXPORT REGULATIONS. All Software and technical data -delivered under this Agreement are subject to US export -control laws and may be subject to export or import -regulations in other countries. You agree to comply -strictly with all such laws and regulations and acknowledge -that you have the responsibility to obtain such licenses to -export, re-export, or import as may be required after -delivery to you. - -9. TRADEMARKS AND LOGOS. You acknowledge and agree as -between you and Sun that Sun owns the SUN, SOLARIS, JAVA, -JINI, FORTE, and iPLANET trademarks and all SUN, SOLARIS, -JAVA, JINI, FORTE, and iPLANET-related trademarks, service -marks, logos and other brand designations ("Sun Marks"), and -you agree to comply with the Sun Trademark and Logo Usage -Requirements currently located at -http://www.sun.com/policies/trademarks. Any use you make of -the Sun Marks inures to Sun's benefit. - -10. U.S. GOVERNMENT RESTRICTED RIGHTS. If Software is -being acquired by or on behalf of the U.S. Government or by -a U.S. Government prime contractor or subcontractor (at any -tier), then the Government's rights in Software and -accompanying documentation will be only as set forth in this -Agreement; this is in accordance with 48 CFR 227.7201 -through 227.7202-4 (for Department of Defense (DOD) -acquisitions) and with 48 CFR 2.101 and 12.212 (for non-DOD -acquisitions). - -11. GOVERNING LAW. Any action related to this Agreement -will be governed by California law and controlling U.S. -federal law. No choice of law rules of any jurisdiction -will apply. - -12. SEVERABILITY. If any provision of this Agreement is -held to be unenforceable, this Agreement will remain in -effect with the provision omitted, unless omission would -frustrate the intent of the parties, in which case this -Agreement will immediately terminate. - -13. INTEGRATION. This Agreement is the entire agreement -between you and Sun relating to its subject matter. It -supersedes all prior or contemporaneous oral or written -communications, proposals, representations and warranties -and prevails over any conflicting or additional terms of any -quote, order, acknowledgment, or other communication between -the parties relating to its subject matter during the term -of this Agreement. No modification of this Agreement will -be binding, unless in writing and signed by an authorized -representative of each party. - -SUPPLEMENTAL LICENSE TERMS - -These Supplemental License Terms add to or modify the terms -of the Binary Code License Agreement. Capitalized terms not -defined in these Supplemental Terms shall have the same -meanings ascribed to them in the Binary Code License -Agreement . These Supplemental Terms shall supersede any -inconsistent or conflicting terms in the Binary Code License -Agreement, or in any license contained within the Software. - -A. Software Internal Use and Development License Grant. -Subject to the terms and conditions of this Agreement and -restrictions and exceptions set forth in the Software -"README" file incorporated herein by reference, including, -but not limited to the Java Technology Restrictions of these -Supplemental Terms, Sun grants you a non-exclusive, -non-transferable, limited license without fees to reproduce -internally and use internally the Software complete and -unmodified for the purpose of designing, developing, and -testing your Programs. - -B. License to Distribute Software. Subject to the terms -and conditions of this Agreement and restrictions and -exceptions set forth in the Software README file, including, -but not limited to the Java Technology Restrictions of these -Supplemental Terms, Sun grants you a non-exclusive, -non-transferable, limited license without fees to reproduce -and distribute the Software (except for the JavaFX Runtime), -provided that (i) you distribute the Software complete and -unmodified and only bundled as part of, and for the sole -purpose of running, your Programs, (ii) the Programs add -significant and primary functionality to the Software, (iii) -you do not distribute additional software intended to -replace any component(s) of the Software, (iv) you do not -remove or alter any proprietary legends or notices contained -in the Software, (v) you only distribute the Software -subject to a license agreement that protects Sun's interests -consistent with the terms contained in this Agreement, and -(vi) you agree to defend and indemnify Sun and its licensors -from and against any damages, costs, liabilities, settlement -amounts and/or expenses (including attorneys' fees) incurred -in connection with any claim, lawsuit or action by any third -party that arises or results from the use or distribution of -any and all Programs and/or Software. - -C. Java Technology Restrictions. You may not create, -modify, or change the behavior of, or authorize your -licensees to create, modify, or change the behavior of, -classes, interfaces, or subpackages that are in any way -identified as "java", "javax", "sun" or similar convention -as specified by Sun in any naming convention designation. - -D. Source Code. Software may contain source code that, -unless expressly licensed for other purposes, is provided -solely for reference purposes pursuant to the terms of this -Agreement. Source code may not be redistributed unless -expressly provided for in this Agreement. - -E. Third Party Code. Additional copyright notices and -license terms applicable to portions of the Software are set -forth in the THIRDPARTYLICENSEREADME.txt file. In addition -to any terms and conditions of any third party -opensource/freeware license identified in the -THIRDPARTYLICENSEREADME.txt file, the disclaimer of warranty -and limitation of liability provisions in paragraphs 5 and 6 -of the Binary Code License Agreement shall apply to all -Software in this distribution. - -F. Termination for Infringement. Either party may -terminate this Agreement immediately should any Software -become, or in either party's opinion be likely to become, -the subject of a claim of infringement of any intellectual -property right. - -G. Installation and Auto-Update. The Software's -installation and auto-update processes transmit a limited -amount of data to Sun (or its service provider) about those -specific processes to help Sun understand and optimize them. -Sun does not associate the data with personally identifiable -information. You can find more information about the data -Sun collects at http://java.com/data/. - -For inquiries please contact: Sun Microsystems, Inc., 4150 -Network Circle, Santa Clara, California 95054, U.S.A. - - diff --git a/ReplicatorG/build/windows/dist/java/LICENSE.rtf b/ReplicatorG/build/windows/dist/java/LICENSE.rtf deleted file mode 100644 index 40c5f2b..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE.rtf +++ /dev/null @@ -1,61 +0,0 @@ -{\rtf1\ansi\ansicpg1252\deff0\deftab709{\fonttbl{\f0\fnil\fcharset0 Nimbus Mono L;}} -{\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\lang1033\f0\fs20 Sun Microsystems, Inc. Binary Code License Agreement \par -\par -for the JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6 and\par -JAVAFX RUNTIME VERSION 1\par -\par -SUN MICROSYSTEMS, INC. ("SUN") IS WILLING TO LICENSE THE SOFTWARE IDENTIFIED BELOW TO YOU ONLY UPON THE CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS (COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT CAREFULLY. BY USING THE SOFTWARE YOU ACKNOWLEDGE THAT YOU HAVE READ THE TERMS AND AGREE TO THEM. IF YOU ARE AGREEING TO THESE TERMS ON BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THE LEGAL ENTITY TO THESE TERMS. IF YOU DO NOT HAVE SUCH AUTHORITY, OR IF YOU DO NOT WISH TO BE BOUND BY THE TERMS, THEN YOU MUST NOT USE THE SOFTWARE ON THIS SITE OR ANY OTHER MEDIA ON WHICH THE SOFTWARE IS CONTAINED.\par -\par -1. DEFINITIONS. "Software" means the identified above in binary form, any other machine readable materials (including, but not limited to, libraries, source files, header files, and data files), any updates or error corrections provided by Sun, and any user manuals, programming guides and other documentation provided to you by Sun under this Agreement. "General Purpose Desktop Computers and Servers" means computers, including desktop and laptop computers, or servers, used for general computing functions under end user control (such as but not specifically limited to email, general purpose Internet browsing, and office suite productivity tools). The use of Software in systems and solutions that provide dedicated functionality (other than as mentioned above) or designed for use in embedded or function-specific software applications, for example but not limited to: Software embedded in or bundled with industrial control systems, wireless mobile telephones, wireless handheld devices, netbooks, kiosks, TV/STB, Blu-ray Disc devices, telematics and network control switching equipment, printers and storage management systems, and other related systems are excluded from this definition and not licensed under this Agreement. "Programs" means (a) Java technology applets and applications intended to run on the Java Platform Standard Edition (Java SE) platform on Java-enabled General Purpose Desktop Computers and Servers, and (b) JavaFX technology applications intended to run on the JavaFX Runtime on JavaFX-enabled General Purpose Desktop Computers and Servers.\par -\par -2. LICENSE TO USE. Subject to the terms and conditions of this Agreement, including, but not limited to the Java Technology Restrictions of the Supplemental License Terms, Sun grants you a non-exclusive, non-transferable, limited license without license fees to reproduce and use internally Software complete and unmodified for the sole purpose of running Programs. Additional licenses for developers and/or publishers are granted in the Supplemental License Terms.\par -\par -3. RESTRICTIONS. Software is confidential and copyrighted. Title to Software and all associated intellectual property rights is retained by Sun and/or its licensors. Unless enforcement is prohibited by applicable law, you may not modify, decompile, or reverse engineer Software. You acknowledge that Licensed Software is not designed or intended for use in the design, construction, operation or maintenance of any nuclear facility. Sun Microsystems, Inc. disclaims any express or implied warranty of fitness for such uses. No right, title or interest in or to any trademark, service mark, logo or trade name of Sun or its licensors is granted under this Agreement. Additional restrictions for developers and/or publishers licenses are set forth in the Supplemental License Terms.\par -\par -4. LIMITED WARRANTY. Sun warrants to you that for a period of ninety (90) days from the date of purchase, as evidenced by a copy of the receipt, the media on which Software is furnished (if any) will be free of defects in materials and workmanship under normal use. Except for the foregoing, Software is provided "AS IS". Your exclusive remedy and Sun's entire liability under this limited warranty will be at Sun's option to replace Software media or refund the fee paid for Software. Any implied warranties on the Software are limited to 90 days. Some states do not allow limitations on duration of an implied warranty, so the above may not apply to you. This limited warranty gives you specific legal rights. You may have others, which vary from state to state.\par -\par -5. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.\par -\par -6. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event will Sun's liability to you, whether in contract, tort (including negligence), or otherwise, exceed the amount paid by you for Software under this Agreement. The foregoing limitations will apply even if the above stated warranty fails of its essential purpose. Some states do not allow the exclusion of incidental or consequential damages, so some of the terms above may not be applicable to you.\par -\par -7. TERMINATION. This Agreement is effective until terminated. You may terminate this Agreement at any time by destroying all copies of Software. This Agreement will terminate immediately without notice from Sun if you fail to comply with any provision of this Agreement. Either party may terminate this Agreement immediately should any Software become, or in either party's opinion be likely to become, the subject of a claim of infringement of any intellectual property right. Upon Termination, you must destroy all copies of Software. \par -\par -8. EXPORT REGULATIONS. All Software and technical data delivered under this Agreement are subject to US export control laws and may be subject to export or import regulations in other countries. You agree to comply strictly with all such laws and regulations and acknowledge that you have the responsibility to obtain such licenses to export, re-export, or import as may be required after delivery to you.\par -\par -9. TRADEMARKS AND LOGOS. You acknowledge and agree as between you and Sun that Sun owns the SUN, SOLARIS, JAVA, JINI, FORTE, and iPLANET trademarks and all SUN, SOLARIS, JAVA, JINI, FORTE, and iPLANET-related trademarks, service marks, logos and other brand designations ("Sun Marks"), and you agree to comply with the Sun Trademark and Logo Usage Requirements currently located at http://www.sun.com/policies/trademarks. Any use you make of the Sun Marks inures to Sun's benefit.\par -\par -10. U.S. GOVERNMENT RESTRICTED RIGHTS. If Software is being acquired by or on behalf of the U.S. Government or by a U.S. Government prime contractor or subcontractor (at any tier), then the Government's rights in Software and accompanying documentation will be only as set forth in this Agreement; this is in accordance with 48 CFR 227.7201 through 227.7202-4 (for Department of Defense (DOD) acquisitions) and with 48 CFR 2.101 and 12.212 (for non-DOD acquisitions).\par -\par -11. GOVERNING LAW. Any action related to this Agreement will be governed by California law and controlling U.S. federal law. No choice of law rules of any jurisdiction will apply.\par -\par -12. SEVERABILITY. If any provision of this Agreement is held to be unenforceable, this Agreement will remain in effect with the provision omitted, unless omission would frustrate the intent of the parties, in which case this Agreement will immediately terminate.\par -\par -13. INTEGRATION. This Agreement is the entire agreement between you and Sun relating to its subject matter. It supersedes all prior or contemporaneous oral or written communications, proposals, representations and warranties and prevails over any conflicting or additional terms of any quote, order, acknowledgment, or other communication between the parties relating to its subject matter during the term of this Agreement. No modification of this Agreement will be binding, unless in writing and signed by an authorized representative of each party.\par -\par -SUPPLEMENTAL LICENSE TERMS\par -\par -These Supplemental License Terms add to or modify the terms of the Binary Code License Agreement. Capitalized terms not defined in these Supplemental Terms shall have the same meanings ascribed to them in the Binary Code License Agreement . These Supplemental Terms shall supersede any inconsistent or conflicting terms in the Binary Code License Agreement, or in any license contained within the Software.\par -\par -A. Software Internal Use and Development License Grant. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the Software "README" file incorporated herein by reference, including, but not limited to the Java Technology Restrictions of these Supplemental Terms, Sun grants you a non-exclusive, non-transferable, limited license without fees to reproduce internally and use internally the Software complete and unmodified for the purpose of designing, developing, and testing your Programs.\par -\par -B. License to Distribute Software. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the Software README file, including, but not limited to the Java Technology Restrictions of these Supplemental Terms, Sun grants you a non-exclusive, non-transferable, limited license without fees to reproduce and distribute the Software (except for the JavaFX Runtime), provided that (i) you distribute the Software complete and unmodified and only bundled as part of, and for the sole purpose of running, your Programs, (ii) the Programs add significant and primary functionality to the Software, (iii) you do not distribute additional software intended to replace any component(s) of the Software, (iv) you do not remove or alter any proprietary legends or notices contained in the Software, (v) you only distribute the Software subject to a license agreement that protects Sun's interests consistent with the terms contained in this Agreement, and (vi) you agree to defend and indemnify Sun and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of any and all Programs and/or Software.\par -\par -C. Java Technology Restrictions. You may not create, modify, or change the behavior of, or authorize your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "sun" or similar convention as specified by Sun in any naming convention designation.\par -\par -D. Source Code. Software may contain source code that, unless expressly licensed for other purposes, is provided solely for reference purposes pursuant to the terms of this Agreement. Source code may not be redistributed unless expressly provided for in this Agreement.\par -\par -E. Third Party Code. Additional copyright notices and license terms applicable to portions of the Software are set forth in the THIRDPARTYLICENSEREADME.txt file. In addition to any terms and conditions of any third party opensource/freeware license identified in the THIRDPARTYLICENSEREADME.txt file, the disclaimer of warranty and limitation of liability provisions in paragraphs 5 and 6 of the Binary Code License Agreement shall apply to all Software in this distribution.\par -\par -F. Termination for Infringement. Either party may terminate this Agreement immediately should any Software become, or in either party's opinion be likely to become, the subject of a claim of infringement of any intellectual property right.\par -\par -G. Installation and Auto-Update. The Software's installation and auto-update processes transmit a limited amount of data to Sun (or its service provider) about those specific processes to help Sun understand and optimize them. Sun does not associate the data with personally identifiable information. You can find more information about the data Sun collects at http://java.com/data/.\par -\par -For inquiries please contact: Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A.\par -\par -\par -\par -\par -\par -\par -} - diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_de.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_de.rtf deleted file mode 100644 index 4c65818..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_de.rtf +++ /dev/null @@ -1,194 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f52\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Microsoft Sans Serif;} -{\f265\froman\fcharset238\fprq2 Times New Roman CE;}{\f266\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f268\froman\fcharset161\fprq2 Times New Roman Greek;}{\f269\froman\fcharset162\fprq2 Times New Roman Tur;} -{\f270\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f271\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f272\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f273\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\f785\fswiss\fcharset238\fprq2 Microsoft Sans Serif CE;}{\f786\fswiss\fcharset204\fprq2 Microsoft Sans Serif Cyr;}{\f788\fswiss\fcharset161\fprq2 Microsoft Sans Serif Greek;}{\f789\fswiss\fcharset162\fprq2 Microsoft Sans Serif Tur;} -{\f790\fbidi \fswiss\fcharset177\fprq2 Microsoft Sans Serif (Hebrew);}{\f791\fbidi \fswiss\fcharset178\fprq2 Microsoft Sans Serif (Arabic);}{\f792\fswiss\fcharset186\fprq2 Microsoft Sans Serif Baltic;} -{\f793\fswiss\fcharset163\fprq2 Microsoft Sans Serif (Vietnamese);}{\f794\fswiss\fcharset222\fprq2 Microsoft Sans Serif (Thai);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255; -\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;} -{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 \snext0 Normal;}{\*\cs10 \additive \ssemihidden -Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}} -{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid1190314\rsid9175239\rsid9660382\rsid10957118\rsid13454321}{\*\generator Microsoft Word 11.0.0000;}{\info{\operator Peter Werthmann}{\creatim\yr2009\mo4\dy2\hr10\min55} -{\revtim\yr2009\mo6\dy15\hr16\min38}{\version5}{\edmins1}{\nofpages3}{\nofwords2303}{\nofchars13131}{\nofcharsws15404}{\vern24611}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} -\paperw12240\paperh15840\margl1417\margr1417\margt1417\margb1134\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\hyphhotz425\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 -\jcompress\viewkind4\viewscale130\rsidroot1190314 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1031\langfe1031\cgrid\langnp1031\langfenp1031 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 Sun Microsystems, Inc. -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314\charrsid9175239 Bin\'e4rcode-Lizenzvertrag -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1036\langfe1031\langnp1036\insrsid1190314 f\'fcr die}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314\charrsid9175239 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1036\langfe1031\langnp1036\insrsid1190314 -\par JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6 und JAVAFX RUNTIME VERSION 1 -\par -\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10957118 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 SUN MICROSYSTEMS, INC. (\'84}{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 SUN}{ -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ") IST NUR UNTER DER BEDINGUNG BEREIT, IHNEN EINE LIZENZ F\'dcR DIE UNTEN BEZEICHNETE }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 SOFTWARE}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \f52\fs16\insrsid1190314 ZU GEW\'c4HREN, DASS SIE ALLE IN DIESEM }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 BIN\'c4RCODE-LIZENZVERTRAG}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 SOWIE DEN }{ -\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 ZUS\'c4TZLICHEN LIZENZBEDINGUNGEN}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 (ZUSAMMEN DER \'84}{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 -VERTRAG}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ") AUFGEF\'dcHRTEN BEDINGUNGEN ANNEHMEN. BITTE LESEN SIE DEN }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 VERTRAG}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 SORGF\'c4LTIG DURCH. }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid10957118\charrsid10957118 DURCH VERWENDUNG DER }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid10957118\charrsid9660382 SOFTWARE}{\rtlch\fcs1 -\af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid10957118\charrsid10957118 BEST\'c4TIGEN SIE, DASS SIE DIE BEDINGUNGEN GELESEN HABEN UND IHNEN ZUSTIMMEN. WENN SIE DIESEN BEDINGUNGEN IM NAMEN EINES UNTERNEHMENS ODER EINER JURISTISCHEN PERSON ZUSTIMMEN, BEST\'c4 -TIGEN SIE, DASS SIE GESETZLICH BEFUGT SIND, DIE JURISTISCHE PERSON AN DIESE BEDINGUNGEN ZU BINDEN. WENN SIE DIESE BEFUGNIS NICHT BESITZEN ODER EINE BINDUNG AN DIESE BEDINGUNGEN ABLEHNEN, D\'dcRFEN SIE DIE }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid10957118\charrsid9660382 SOFTWARE}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid10957118\charrsid10957118 AUF DIESER SITE ODER ANDERE MEDIEN, WELCHE DIE }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid10957118\charrsid9660382 SOFTWARE}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid10957118\charrsid10957118 ENTHALTEN, NICHT VERWENDEN.}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 1.}{\rtlch\fcs1 \ab\af52\afs16 \ltrch\fcs0 \b\f52\fs16\insrsid1190314 \tab }{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \f52\fs16\insrsid1190314 DEFINITIONEN. Der Begriff \'84Software\'93 bezieht sich auf das oben bezeichnete Computerprogramm in bin\'e4rer Form, alle sonstigen maschinenlesbaren Materialien, (einschlie\'dflich, jedoch nicht beschr\'e4 -nkt auf Bibliotheken, Quelldateien, Headerdateien und andere Datendateien), alle etwaigen von Sun zur Verf\'fcgung gestellten Aktualisierungen oder Fehlerbehebungen sowie s\'e4mtliche Benutzerhandb\'fc -cher, Programmieranleitungen und sonstige Dokumentationen, die Ihnen von Sun gem\'e4\'df dieses Vertrags bereitgestellt werden. Der Begriff \'84Allzweck-Desktop-Computer und -Server\'93 bezieht sich auf Computer, }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314\charrsid1190314 einschlie\'dflich Desktop-, und Laptop-Computern, oder Server, die von Endanwendern f\'fcr allgemeine Computing-Funktionen genutzt werden (einschlie\'dflich, aber nicht ausdr\'fccklich beschr\'e4 -nkt auf E-Mail, allgemeines Internet-Surfen und Office Suite Produktivit\'e4tstools). Die Verwendung von Software in Systemen und L\'f6sungen, die spezielle Funktionalit\'e4t bieten (au\'dfer der oben angegebenen) oder f\'fc -r die Verwendung in eingebetteten oder funktionsspezifischen Software-Anwendungen vorgesehen sind, z. B., aber nicht beschr\'e4nkt auf Software, die in industriellen Steuerungssystemen, schnurlosen Mobiltelefonen, schnurlosen Handheld-Ger\'e4 -ten, Netbooks, Kioskterminals}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 , TV/STB, Blu-ray Disc-Ger\'e4ten, Telematik und Switching-Einheiten f\'fcr die Netzwerksteuerung sowie Druckern, Speicherverwaltungssystemen und \'e4 -hnlichen Systemen eingebettet bzw. damit geb\'fcndelt ist, ist aus dieser Definition ausgeschlossen und nicht unter diesem Vertrag lizenziert. Der Begriff \'84Programme\'93 - bezieht sich auf: (a) Java-Applets und -Anwendungen, die auf der Java Platform, Standard Edition (Java SE)-Plattform auf Java-f\'e4 -higen Allzweck-Desktop-Computern und -Servern laufen sollen; und (b) JavaFX-Technologieanwendungen, die auf JavaFX Runtime auf JavaFX-f\'e4higen Allzweck-Desktop-Computern und -Servern laufen sollen. -\par -\par 2.\tab BENUTZERLIZENZ. Vorbehaltlich der Bedingungen und Bestimmungen dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 , einschlie\'df -lich, jedoch nicht begrenzt auf Java-Technologiebeschr\'e4nkungen der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Zus\'e4tzlichen Lizenzbedingungen}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 , erteilt }{ -\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 Ihnen eine nicht ausschlie\'dfliche, nicht \'fcbertragbare, beschr\'e4nkte und geb\'fc -hrenfreie Lizenz zur internen Reproduktion und Verwendung der vollst\'e4ndigen und nicht modifizierten }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - zum alleinigen Zweck, }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Programme}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 laufen zu lassen. Zusatzlizenzen f\'fcr Entwickler und/oder Verlage werden in den }{ -\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Zus\'e4tzlichen Lizenzbedingungen}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 gew\'e4hrt. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 3.\tab BESCHR\'c4NKUNGEN. Bei der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 -Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 handelt es sich um vertrauliches und urheberrechtlich gesch\'fctztes Material. Das Eigentumsrecht an der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{ -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 und alle dazugeh\'f6rigen gewerblichen Schutzrechten verbleiben bei }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 und/oder seinen Lizenzgebern. Ihnen ist nicht gestattet, die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - zu modifizieren, dekompilieren oder durch Reverse-Engineering zu rekonstruieren, es sei denn, die Durchsetzung dieser Beschr\'e4nkungen ist rechtlich unzul\'e4ssig. Der Lizenznehmer erkennt an, dass die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 lizenzierte Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - nicht zur Verwendung beim Design, bei der Konstruktion, dem Betrieb bzw. der Wartung einer Kernkraftanlage entwickelt wurde oder bestimmt ist. Sun Microsystems, Inc.}{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 }{\rtlch\fcs1 -\af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 lehnt jegliche ausdr\'fcckliche oder stillschweigende Gew\'e4hrleistung der Eignung f\'fcr eine solche Nutzung ab. Im Rahmen dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 -Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 werden keinerlei Rechte, Eigentumsrechte oder Anrechte auf irgendwelche Marken, Dienstleistungsmarken, Logos oder gesch\'e4ftliche Bezeichnungen von }{\rtlch\fcs1 \ai\af52\afs16 -\ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 oder seinen Lizenzgebern gew\'e4hrt. Zus\'e4tzliche Beschr\'e4nkungen f\'fcr Entwickler und/oder Verlage sind in den }{\rtlch\fcs1 \ai\af52\afs16 -\ltrch\fcs0 \i\f52\fs16\insrsid1190314 Zus\'e4tzlichen Lizenzbedingungen}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 dargelegt. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 4.\tab BESCHR\'c4NKTE GEW\'c4HRLEISTUNG. }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 gew\'e4hrleistet, dass der Datentr\'e4ger, auf dem die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \f52\fs16\insrsid1190314 ggf. bereitgestellt wird, f\'fcr einen Zeitraum von neunzig (90) Tagen ab Kaufdatum, das durch eine Kopie der Quittung nachzuweisen ist, bei normalem Gebrauch keine Materialfehler und Herstellungsm\'e4 -ngel aufweist. Mit Ausnahme des Vorangegangenen wird die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 \'84WIE BESEHEN ohne Gew\'e4hrleistung\'93 zur Verf\'fc -gung gestellt. Ihr ausschlie\'dfliches Rechtsmittel und die einzige Verpflichtung von }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 im Rahmen dieser beschr\'e4 -nkten Gew\'e4hrleistung besteht darin, dass }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 nach eigenem Ermessen die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -Datentr\'e4ger ersetzen oder die f\'fcr die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \f52\fs16\insrsid1190314 bezahlte Geb\'fchr zur\'fcckerstatten wird. Jegliche stillschweigenden Gew\'e4hrleistungen bez\'fcglich der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \f52\fs16\insrsid1190314 sind auf 90 Tage beschr\'e4nkt. Einige Staaten gestatten in Bezug auf die Dauer von stillschweigenden Gew\'e4hrleistungen keine Beschr\'e4nkungen; aus diesem Grund treffen die oben dargelegten -Bestimmungen u.U. auf Sie nicht zu. Diese beschr\'e4nkte Gew\'e4hrleistung verleiht Ihnen bestimmte Rechte. Dar\'fcber hinaus stehen Ihnen m\'f6glicherweise andere Rechte zu, welche je nach Staat unterschiedlich sein k\'f6nnen. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 5.\tab GEW\'c4HRLEISTUNGSAUSSCHLUSS. WENN NICHT ANDERS IN DIESEM }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 VERTRAG}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ANGEGEBEN, WERDEN ALLE AUSDR\'dcCKLICHEN ODER STILLSCHWEIGENDEN BEDINGUNGEN, ZUSICHERUNGEN, GEW\'c4HRLEISTUNGEN UND GARANTIEN EINSCHLIESSLICH JEGLICHER GEW -\'c4HRLEISTUNG DER EIGNUNG F\'dcR DEN GEW\'d6HNLICHEN GEBRAUCH, DER EIGNUNG F\'dcR EINEN BESTIMMTEN ZWECK UND DER GEW\'c4HRLEISTUNG F\'dcR RECHTSM\'c4NGEL AUSGESCHLOSSEN, AUSSER WENN EIN DERARTIGER GEW\'c4HRLEISTUNGSAUSSCHLUSS RECHTLICH ALS UNG\'dc -LTIG ANGESEHEN WIRD. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 6.\tab HAFTUNGSBEGRENZUNG. SOWEIT RECHTLICH NICHT UNZUL\'c4SSIG, SCHLIESSEN }{\rtlch\fcs1 \ai\af52\afs16 -\ltrch\fcs0 \i\f52\fs16\insrsid1190314 SUN}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 BZW. SEINE LIZENZGEBER JEGLICHE HAFTUNG F\'dcR EINKOMMENS-, GEWINN- ODER DATENVERLUSTE ODER F\'dcR SONDER-, INDIREKTE, FOLGE- ODER NEBENSCH\'c4 -DEN UND STRAFSCHADENSERSATZANSPR\'dcCHE V\'d6LLIG AUS, UNABH\'c4NGIG VON DER URSACHE UND DER HAFTUNGSTHEORIE, DIE SICH AUS DER VERWENDUNG ODER IM ZUSAMMENHANG MIT DER VERWENDUNG ODER DEM UNVERM\'d6GEN DER VERWENDUNG DER }{\rtlch\fcs1 \ai\af52\afs16 -\ltrch\fcs0 \i\f52\fs16\insrsid1190314 SOFTWARE}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ERGEBEN, SELBST WENN }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 SUN}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 VON EINER M\'d6GLICHKEIT DIESER SCH\'c4DEN UNTERRICHTET WURDE. In keinem Fall \'fcberschreitet die Haftung von }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 Ihnen gegen\'fcber, ob durch Vertrag oder eine unerlaubte Handlung (einschlie\'dflich Fahrl\'e4ssigkeit) oder auf sonstige Weise, den Betrag, den Sie im Rahmen dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 f\'fcr die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - bezahlt haben. Die vorangegangenen Beschr\'e4nkungen gelten auch, wenn die oben genannte Gew\'e4hrleistungsregelung ihren wesentlichen Zweck verfehlt. In einigen Staaten ist der Ausschluss von Neben- oder Folgesch\'e4 -den nicht gestattet. Aus diesem Grund treffen einige der oben dargelegten Bestimmungen auf Sie u.U. nicht zu. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 7.\tab K\'dcNDIGUNG. Dieser }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{ -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ist bis zu seiner K\'fcndigung g\'fcltig. Sie k\'f6nnen diesen }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 jederzeit k\'fcndigen, indem Sie alle Kopien der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 vernichten. Dieser }{\rtlch\fcs1 -\ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 wird sofort und ohne Benachrichtigung seitens }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{ -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 gek\'fcndigt, wenn Sie irgendwelche Bestimmungen dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 nicht einhalten. Dieser }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 kann von allen Vertragsparteien fristlos gek\'fc -ndigt werden, wenn die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - Gegenstand eines Anspruchs wegen Verletzung gewerblicher Schutzrechte oder geistigen Eigentums wird oder wenn nach Ansicht einer der Vertragsparteien die Geltendmachung eines solchen Anspruchs zu erwarten steht. Nach K\'fcndigung sind alle Kopien der }{ -\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 von Ihnen zu vernichten. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 8.\tab AUSFUHRBESTIMMUNGEN. Die gesamte }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 -Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 und alle technischen Daten, die im Rahmen dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 zur Verf\'fcgung gestellt werden, unterliegen den US-Ausfuhrkontrollgesetzen und k\'f6nnen dar\'fcber hinaus Ausfuhr- oder Einfuhrbestimmungen in anderen L\'e4ndern unterliegen. Sie erkl\'e4 -ren sich bereit, alle solchen Gesetze und Vorschriften genauestens zu befolgen, und erkennen an, dass Sie daf\'fcr verantwortlich sind, Lizenzen zur Ausfuhr, Neuausfuhr oder Einfuhr einzuholen, wenn dies nach der Zurverf\'fc -gungstellung an Sie erforderlich ist. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 9.\tab MARKEN UND LOGOS. Sie erkennen gegen\'fcber }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 an und vereinbaren mit }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -, dass die Marken SUN, SOLARIS, JAVA, JINI, FORTE und iPLANET sowie alle auf SUN, SOLARIS, JAVA, JINI, FORTE und iPLANET bezogenen Marken, Dienstleistungsmarken, Logos und sonstigen Markenbezeichnungen (\'84}{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Marken von Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ") das Eigentum von }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 sind, und Sie verpflichten sich, die sich zurzeit unter http://www.sun.com/policies/trademarks einsehbaren Marken- und Logo-Verwendungsbedingungen}{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 }{\rtlch\fcs1 -\af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 von }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 einzuhalten. Jegliche Verwendung der }{\rtlch\fcs1 \ai\af52\afs16 -\ltrch\fcs0 \i\f52\fs16\insrsid1190314 Marken von Sun }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 erfolgt zum Vorteil und im Interesse von }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \f52\fs16\insrsid1190314 . -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 10.\tab EINGESCHR\'c4NKTE RECHTE DER US-REGIERUNG. Wenn die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - durch oder im Namen der US-Regierung oder durch einen Haupt- oder Unterlieferanten der US-Regierung (gleich auf welcher Ebene) erworben wird, stehen der Regierung nur die Rechte an der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 -Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 und der begleitenden Dokumentation zu, die in diesem }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 aufgef\'fchrt sind, d.h. gem\'e4\'df 48 CFR 227.7201 bis 227.7202-4 (bei einem Erwerb durch das DOD [US-Verteidigungsministerium]) und gem\'e4\'df 48 CFR 2.101 und 12.212 (bei einem Erwerb durch andere Beh\'f6rden). -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 11.\tab GELTENDES RECHT. Alle Klagen in Bezug auf diesen }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 unterliegen kalifornischem Recht und dem ma\'dfgeblichen US-Bundesrecht. Es gelten keine Rechtswahlregeln irgendeiner Rechtsordnung. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 12.\tab SALVATORISCHE KLAUSEL. Sollte eine Bestimmung dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 nicht durchsetzbar sein, bleibt dieser }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 unter Ausschluss der nicht durchsetzbaren Bestimmung in Kraft, es sei denn, dieser Ausschluss w\'fcrde den vereinbarten Willen der Parteien vereiteln, in welchem Fall dieser }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 als sofort beendet gilt. -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 13.\tab INTEGRATION. Dieser }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{ -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 stellt in Bezug auf seinen Vertragsgegenstand den gesamten }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 zwischen Ihnen und }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 dar. Er hebt alle vorherigen oder gleichzeitigen m\'fc -ndlichen oder schriftlichen Mitteilungen, Vorschl\'e4ge, Zusicherungen und Gew\'e4hrleistungen auf und ist bei widerspr\'fcchlichen oder zus\'e4tzlichen Bestimmungen in Preisangaben, Bestellungen, Best\'e4 -tigungen oder sonstigen Kommunikationen zwischen den Parteien in Bezug auf den Vertragsgegenstand w\'e4hrend des Vertragszeitraums ausschlaggebend. Eine \'c4nderung dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrags}{ -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ist nicht bindend, es sein denn, sie erfolgt schriftlich und wird von einem Beauftragten beider Parteien unterzeichnet. -\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ZUS\'c4TZLICHE LIZENZBEDINGUNGEN -\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par Diese }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Zus\'e4tzlichen Lizenzbedingungen}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 erg\'e4nzen bzw. modifizieren die Bedingungen des }{\rtlch\fcs1 \ai\af52\afs16 -\ltrch\fcs0 \i\f52\fs16\insrsid1190314 Bin\'e4rcode-Lizenzvertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 . Begriffe, die in diesen }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Zusatzbedingungen}{\rtlch\fcs1 -\af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 nicht definiert sind, haben dieselbe Bedeutung wie im }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Bin\'e4rcode-Lizenzvertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 . Diese }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Zusatzbedingungen}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ersetzen alle unvereinbaren oder widerspr\'fcchlichen Bedingungen des }{ -\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Bin\'e4rcode-Lizenzvertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 oder der Lizenzen, die in der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 -Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 enthalten sind. -\par -\par }\pard \ltrpar\qj \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 A.\tab Lizenzgew\'e4hrung zur internen Nutzung und Entwicklung der Software. Gem\'e4\'df - den Bedingungen und Bestimmungen dieses Vertrags und den in der Software-\'84README\'93-Datei durch Verweis Bestandteil des Vertragstextes, als sei sie mit vollst\'e4ndigem Wortlaut aufgef\'fchrt vorgesehenen Beschr\'e4nkungen und Ausnahmen, einschlie -\'dflich, jedoch nicht beschr\'e4nkt auf Java-Technologiebeschr\'e4nkungen dieser Zusatzbedingungen, erteilt Sun Ihnen eine nicht ausschlie\'dfliche, nicht \'fcbertragbare, beschr\'e4nkte und geb\'fc -hrenfreie Lizenz zur internen Reproduktion und internen Verwendung der Software in ihrer vollst\'e4ndigen und unmodifizierten Form, und zwar lediglich zur Konstruktion, Entwicklung und zum Testen Ihrer Programme. -\par -\par B.\tab Lizenz f\'fcr den Vertrieb der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 . Gem\'e4\'df den Bedingungen und Bestimmungen dieses }{\rtlch\fcs1 -\ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 und den in der Software-\'84README\'93-Datei *durch Verweis Bestandteil des Vertragstextes, als sei sie mit vollst\'e4 -ndigem Wortlaut aufgef\'fchrt einschlie\'dflich, jedoch nicht beschr\'e4nkt auf Java-Technologiebeschr\'e4nkungen dieser }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Zusatzbedingungen}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 , erteilt }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 Ihnen eine nicht ausschlie\'dfliche, nicht \'fcbertragbare, beschr\'e4nkte und geb -\'fchrenfreie Lizenz zur Reproduktion und zum Vertrieb der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - (JavaFX Runtime ausgenommen) vorausgesetzt, (i) Sie vertreiben die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 in ihrer vollst\'e4 -ndigen und unmodifizierten Form, und zwar nur geb\'fcndelt als Teil und zum alleinigen Zweck der Ausf\'fchrung Ihrer }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Programme}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 , (ii) die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Programme}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 erweitern die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 um eine wesentliche und haupts\'e4chliche Funktionalit\'e4t, (iii) Sie vertreiben keine zus\'e4tzliche Software, die irgendwelche Komponente(n) der }{ -\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 ersetzen soll, (iv) Sie entfernen oder \'e4ndern keine in der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 enthaltenen Schutzrechts- oder eigentumsrechtlichen Hinweise, (v) Sie vertreiben die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 -Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 nur vorbehaltlich eines Lizenzvertrags, der die Interessen von }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 in \'dcbereinstimmung mit den Bestimmungen dieses }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 sch\'fc -tzt und (vi) Sie verpflichten sich, }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 und seine Lizenzgeber in Bezug auf - Schadensersatz, Kosten, Verbindlichkeiten, Vergleichssummen und/oder Ausgaben (einschlie\'df -lich Rechtsanwaltshonorare) zu verteidigen und freizustellen, die sich in Verbindung mit etwaigen Forderungen, Rechtsstreitigkeiten oder Klagen Dritter auf Grund der Verwendung oder des Vertriebs jeglicher oder aller }{\rtlch\fcs1 \ai\af52\afs16 -\ltrch\fcs0 \i\f52\fs16\insrsid1190314 Programme}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 und/oder }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\insrsid1190314 ergeben bzw. daraus erfolgen. -\par -\par C.\tab Java-Technologiebeschr\'e4nkungen. Sie d\'fcrfen keine Klassen, Schnittstellen oder Unterpakete erstellen, modifizieren oder \'c4nderungen an deren Verhalten vornehmen bzw. deren Erstellung, Modifizierung oder die \'c4 -nderung an deren Verhalten durch Ihre Lizenzgeber zulassen, die in irgendeiner Weise als \'84java\'93, \'84javax\'93 oder \'84sun\'93 oder durch \'e4hnliche Konventionen identifiziert werden, die von }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Sun}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 in Benennungskonventionen spezifiziert sind. -\par -\par D.\tab Quellcode. Die }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 kann Quellcode enthalten, der nur f\'fcr Referenzzwecke gem\'e4\'df den Bedingungen dieses }{ -\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 bereitgestellt wird, es sei denn, er wird ausdr\'fccklich f\'fcr andere Zwecke lizenziert. Der Quellcode dar -f nicht wiederver\'e4u\'dfert werden, es sei denn, dies wird ausdr\'fccklich in diesem }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Vertrag}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 gestattet. -\par -\par E.\tab Lizenzen Dritter. Zus\'e4tzliche Copyright-Informationen und Lizenzbedingungen, die sich auf Teile der }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 - beziehen, k\'f6nnen der THIRDPARTYLICENSEREADME.txt-Datei entnommen werden. Zus\'e4 -tzlich zu den in der THIRDPARTYLICENSEREADME.txt-Datei enthaltenen Opensource-/Freeware-Lizenzbestimmungen und -bedingungen Dritter gelten die in den Paragraphen 5 und 6 des }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 \i\f52\fs16\insrsid1190314 Bin\'e4 -rcode-Lizenzvertrags}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 enthaltenen Bestimmungen zum Gew\'e4hrleistungsausschluss und zu Haftungsbeschr\'e4nkungen f\'fcr die gesamte }{\rtlch\fcs1 \ai\af52\afs16 \ltrch\fcs0 -\i\f52\fs16\insrsid1190314 Software}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 in diesem Vertrieb. -\par -\par F.\tab K\'fcndigung auf Grund von Rechtsverletzung. Jede Vertragspartei kann diesen Vertrag mit sofortiger Wirkung k\'fcndigen, wenn die Software zum Gegenstand -eines Anspruchs wegen Verletzung gewerblicher Schutzrechte oder geistigen Eigentums wird oder nach Ermessen einer der Vertragsparteien werden k\'f6nnte. -\par -\par G.\tab Installationen und automatische Aktualisierungen. Im Rahmen von Installationen und automatischen Aktualisierungen werden eingeschr\'e4nkte Daten zu diesen Vorg\'e4ngen \'fcbermittelt, die Sun bei der Verbesserung dieser Vorg\'e4nge unterst\'fc -tzen. Sun verbindet solche Informationen nicht mit pers\'f6nlichen Daten. Weitere Informationen zur Daten\'fcbermittlung finden Sie unter http://java.com/data/. -\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\insrsid1190314 -\par Bei Fragen wenden Sie sich bitte an: Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, Kalifornien 95054, USA. -\par }} diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_es.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_es.rtf deleted file mode 100644 index fb1b5b3..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_es.rtf +++ /dev/null @@ -1,156 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1041{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f58\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Microsoft Sans Serif;} -{\f487\froman\fcharset238\fprq2 Times New Roman CE;}{\f488\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f490\froman\fcharset161\fprq2 Times New Roman Greek;}{\f491\froman\fcharset162\fprq2 Times New Roman Tur;} -{\f492\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f493\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f494\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f495\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\f1067\fswiss\fcharset238\fprq2 Microsoft Sans Serif CE;}{\f1068\fswiss\fcharset204\fprq2 Microsoft Sans Serif Cyr;}{\f1070\fswiss\fcharset161\fprq2 Microsoft Sans Serif Greek;}{\f1071\fswiss\fcharset162\fprq2 Microsoft Sans Serif Tur;} -{\f1072\fbidi \fswiss\fcharset177\fprq2 Microsoft Sans Serif (Hebrew);}{\f1073\fbidi \fswiss\fcharset178\fprq2 Microsoft Sans Serif (Arabic);}{\f1074\fswiss\fcharset186\fprq2 Microsoft Sans Serif Baltic;} -{\f1075\fswiss\fcharset163\fprq2 Microsoft Sans Serif (Vietnamese);}{\f1076\fswiss\fcharset222\fprq2 Microsoft Sans Serif (Thai);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255; -\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;} -{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1036\langfe1036\cgrid\langnp1036\langfenp1036 \snext0 Normal;}{\*\cs10 \additive \ssemihidden -Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}} -{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid2124635\rsid3813644\rsid4148580\rsid5141195}{\*\generator Microsoft Word 11.0.0000;}{\info{\operator Leo}{\creatim\yr2009\mo4\dy1\hr12\min33}{\revtim\yr2009\mo6\dy15\hr14\min54}{\version4} -{\edmins0}{\nofpages3}{\nofwords2390}{\nofchars13628}{\nofcharsws15987}{\vern24615}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} -\paperw12240\paperh15840\margl1417\margr1417\margt1417\margb1417\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\hyphhotz425\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 -\jcompress\viewkind4\viewscale150\rsidroot3813644 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1036\langfe1036\cgrid\langnp1036\langfenp1036 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\f58\fs16\lang1046\langfe1036\langnp1046\insrsid3813644\charrsid5141195 Contrato de Licencia de C\'f3digo Binario de Sun Microsystems, Inc. -\par -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\insrsid3813644 para -\par -\par JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6 y JAVAFX RUNTIME VERSI\'d3N 1 -\par -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid5141195 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 SUN MICROSYSTEMS, INC. (EN ADELANTE DENOMINADO \'93SUN\'94 -) LE CONCEDE LA LICENCIA DEL SOFTWARE DEFINIDO A CONTINUACI\'d3N \'daNICAMENTE CON LA CONDICI\'d3N DE QUE USTED ACEPTE TODOS LOS T\'c9RMINOS ESTIPULADOS EN EL PRESENTE CONTRATO DE LICENCIA DE C\'d3DIGO BINARIO Y T\'c9RMINO -S DE LICENCIA ADICIONALES (EN CONJUNTO DENOMINADOS \'93CONTRATO\'94).}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid5141195 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\f58\fs16\lang9226\langfe1036\langnp9226\insrsid5141195\charrsid5141195 EL USO DEL SOFTWARE SIGNIFICA QUE HA LE\'cdDO LAS CONDICIONES Y QUE LAS ACEPTA. SI ACEPTA ESTAS CONDICIONES EN REPRESENTACI\'d3N DE UNA COMPA\'d1\'cdA U OT -RA ENTIDAD LEGAL, SIGNIFICA QUE EST\'c1 EN POSESI\'d3N DE LA AUTORIDAD QUE LE PERMITE VINCULAR LA ENTIDAD LEGAL A ESTAS CONDICIONES. SI NO EST\'c1 EN POSESI\'d3 -N DE DICHA AUTORIDAD O SI NO DESEA QUEDAR VINCULADO A ESTAS CONDICIONES, NO DEBE UTILIZAR EL SOFTWARE EN ESTA INSTALACI\'d3N NI EN NING\'daN OTRO SOPORTE EN EL QUE SE UBIQUE EL SOFTWARE.}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -\par }\pard \ltrpar\ql \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 1.\tab }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\f58\fs16\lang1034\langfe1036\langnp1034\insrsid3813644 DEFINICIONES.}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang3082\langfe1036\langnp3082\insrsid3813644 El t\'e9rmino \'93Software\'94 - hace referencia al software identificado anteriormente, distribuido en forma binaria, a cualquier otro material en formato legible por equipos inform\'e1ticos (incluyendo, pero no de modo restrictivo, las bibliotecas, los arch -ivos fuente, los archivos de cabecera y los archivos de datos), toda actualizaci\'f3n o correcci\'f3n de errores suministrada por Sun, y los manuales del usuario, las gu\'edas de programaci\'f3n y toda otra documentaci\'f3 -n que le haya sido proporcionada por Sun bajo el presente Contrato. El t\'e9rmino \'93Computadoras y servidores de escritorio de uso general\'94 hace referencia a computadoras, entre ellas, computadoras de escritorio y port\'e1tiles}{\rtlch\fcs1 -\ai\af58\afs16 \ltrch\fcs0 \i\f58\fs16\lang3082\langfe1036\langnp3082\insrsid3813644 , }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang3082\langfe1036\langnp3082\insrsid3813644 o servidores, que se utilizan para funciones inform\'e1 -ticas generales ejecutadas por el usuario final (tales como, sin limitarse exclusivamente a ello, correo electr\'f3nico, navegaci\'f3n en Internet con m\'faltiples prop\'f3 -sitos y herramientas de productividad del paquete de oficina). Todo software utilizado en sistemas y soluciones que brindan una funcionalidad dedicada (a diferencia de las funciones mencionadas con anterioridad) o que ha sido dise\'f1 -ado para ser utilizado en aplicaciones con funciones espec\'edficas; por ejemplo, pero sin limitarse a ello: }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1034\langfe1036\langnp1034\insrsid3813644 software incluido o integrado en sistemas de c -ontrol industrial, tel\'e9fonos m\'f3viles inal\'e1mbricos, dispositivos inal\'e1mbricos de mano, equipos ultraport\'e1tiles, cabinas telef\'f3nicas, TV/STB, dispositivos Blu-ray Disc, equipos de conmutaci\'f3n de control de redes y telem\'e1 -tica, impresoras y sistemas de gesti\'f3n de almacenamiento, y otros sistemas relacionados queda excluido de esta definici\'f3n y no se otorga licencia para su uso bajo el presente Contrato.}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\f58\fs16\lang3082\langfe1036\langnp3082\insrsid3813644 El t\'e9rmino \'93Programas\'94 hace referencia a a) los }{\rtlch\fcs1 \ai\af58\afs16 \ltrch\fcs0 \i\f58\fs16\lang3082\langfe1036\langnp3082\insrsid3813644 applets}{\rtlch\fcs1 \af58\afs16 -\ltrch\fcs0 \f58\fs16\lang3082\langfe1036\langnp3082\insrsid3813644 y las aplicaciones de Java concebidos para ejecutarse - en la plataforma Java Platform, Standard Edition (Java SE) en computadoras y servidores de escritorio de uso general compatibles con Java, y b) las aplicaciones de tecnolog\'eda JavaFX dise\'f1 -adas para ejecutarse en JavaFX Runtime en computadoras y servidores de escritorio de uso general compatibles con JavaFX.}{\rtlch\fcs1 \af58\afs20 \ltrch\fcs0 \f58\fs20\lang9226\langfe1036\langnp9226\insrsid3813644 -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -\par 2.\tab LICENCIA DE USO. En virtud de los t\'e9rminos y condiciones dispuestos en el presente Contrato, incluidas, entre otras, las Restricciones de la Tecnolog\'eda Java de los T\'e9rminos de Licencia Adicionales, S -un le concede, sin tarifa de licencia, una licencia limitada, no exclusiva e intransferible para la reproducci\'f3n y el uso interno del Software completo y sin modificaciones con el \'fanico prop\'f3 -sito de ejecutar Programas. Las licencias adicionales para desarrolladores y/o editores se otorgan en los T\'e9rminos de Licencia Adicionales. -\par -\par 3.\tab RESTRICCIONES. El software es confidencial y se encuentra protegido por derechos de autor (Copyright). Sun y/o sus licenciantes mantienen la titularidad del Software, as\'ed - como todos los derechos de propiedad intelectual asociados. Queda prohibido modificar, descompilar o utilizar t\'e9cnicas de ingenier\'eda inversa en el Software, a menos que se estipule lo contrario en la legislaci\'f3 -n aplicable. El licenciatario acepta que el Software con licencia no se ha dise\'f1ado para ser utilizado en el dise\'f1o, construcci\'f3n, funcionamiento o mantenimiento de cualquier instalaci\'f3n nuclear, ni se tiene la intenci\'f3 -n de usarlo para dichos fines. Sun Microsystems, Inc. renuncia a cualquier garant\'eda expl\'edcita o impl\'edcita de adecuaci\'f3n del Software para dichos fines. El presente Contrato no otorga ning\'fan tipo de derecho, t\'ed -tulo o propiedad sobre o respecto a las marcas comerciales o de servicio, logotipos o nombres comerciales de Sun o de sus licenciantes. Las restricciones adicionales para las licencias de los desarrolladores y/o editores se estipulan en los T\'e9 -rminos de Licencia Adicionales. -\par -\par 4.\tab GARANT\'cdA LIMITADA. Sun garantiza que los medios en los que se proporciona el Software (si los hubiera) se encontrar\'e1n libres de defectos en los materiales o de fabricaci\'f3 -n, siempre y cuando se den circunstancias normales de uso, durante un per\'edodo de noventa (90) d\'edas a partir de la fecha de adquisici\'f3n, que se demostrar\'e1 con la presentaci\'f3n de una copia del -recibo de compra. Excepto en los casos especificados anteriormente, el Software se suministra "TAL CUAL". El \'fanico recurso a su disposici\'f3n y la responsabilidad total de Sun de conformidad con la presente garant\'eda limitada radicar\'e1 -n en el derecho que Sun se reserva para determinar la sustituci\'f3n de los medios del Software o la devoluci\'f3n del importe abonado por \'e9ste. Cualquiera de las garant\'edas implicadas en el Software est\'e1n limitadas a un t\'e9rmino de 90 d\'ed -as. Algunos Estados no permiten limitaciones en la duraci\'f3n de las garant\'edas impl\'edcitas, de modo que lo expresado anteriormente podr\'eda no corresponder para usted. Esta garant\'eda limitada le otorga a usted derechos legales espec\'ed -ficos. Es posible que tenga otros derechos que var\'edan de un Estado a otro. -\par -\par 5.\tab EXCLUSI\'d3N DE GARANT\'cdAS. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \v\f58\fs16\lang9226\langfe1036\sub\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -A MENOS QUE EN EL PRESENTE CONTRATO SE ESTIPULE LO CONTRARIO, SE RENUNCIA A TODAS LAS CONDICIONES, MANIFESTACIONES Y GARANT\'cdAS EXPL\'cdCITAS O IMPL\'cdCITAS, INCLUIDA CUALQUIER GARANT\'cdA IMPL\'cdCITA DE COMERCIABILIDAD, IDONEIDAD PARA UN PROP\'d3 -SITO DETERMINADO O PARA LA CONTRAVENCI\'d3N DEL PRESENTE CONTRATO, SALVO EN AQUELLOS CASOS EN LOS QUE ESTAS EXCLUSIONES CAREZCAN DE VALIDEZ JUR\'cdDICA. -\par -\par 6.\tab LIMITACI\'d3N DE RESPONSABILIDAD. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\sub\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -EN LA MEDIDA EN QUE LO PERMITA LA LEGISLACI\'d3N APLICABLE, EN NING\'daN CASO SUN O SUS LICENCIANTES ASUMIR\'c1N RESPONSABILIDAD ALGUNA POR LA P\'c9RDIDA DE INGRESOS, BENEFICIOS O INFORMACI\'d3N, AS\'cd COMO POR DA\'d1 -OS O PERJUICIOS ESPECIALES, INDIRECTOS, CONSECUENTES, INCIDENTALES, O PUNITIVOS, INDEPENDIENTEMENTE DEL MOTIVO QUE LOS ORIGINE Y DEL CONTENIDO DE SU RESPONSABILIDAD, O QUE SE DERIVEN O EST\'c9 -N RELACIONADOS CON EL USO DEL SOFTWARE O CON LA IMPOSIBILIDAD DE UTILIZARLO, INCLUSO EN AQUELLOS CASOS EN LOS QUE SE HAYA ADVERTIDO A SUN DE LA POSIBILIDAD DE QUE SE PRODUZCAN TALES DA\'d1OS. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\v\f58\fs16\lang9226\langfe1036\sub\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 En ning\'fan caso Sun asumir\'e1 la responsabilidad, ya sea por motivos contractuales o il\'ed -citos (incluida negligencia) o de cualquier otro tipo, de abonar una cantidad superior al pago realizado por usted por el Software, seg\'fan lo estipulado en el presente Contrato.}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\v\f58\fs16\lang9226\langfe1036\sub\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 Las limitaciones anteriores se aplicar\'e1 -n incluso en aquellos casos en los que la antedicha garant\'eda falte a su prop\'f3sito fundamental. Algunos Estados no permiten la exclusi\'f3n de da\'f1os incidentales o consecuentes, de modo que algunos de los t\'e9rminos anteriores podr\'ed -an no corresponder a usted. -\par -\par 7.\tab RESCISI\'d3N. El presente Contrato se mantendr\'e1 vigente hasta que se produzca su rescisi\'f3n. Usted podr\'e1 rescindir el presente Contrato en cualquier oportunidad por medio de la destrucci\'f3n de todas las copias del Software. Sun podr\'e1 - rescindir el presente Contrato en cualquier momento y sin notificaci\'f3n previa cuando usted no haya cumplido alguna de las cl\'e1usulas en \'e9l incluidas. Cualquiera de las partes podr\'e1 rescindir el presente Contrato de forma inmediata si el Soft -ware pasa a ser objeto, o en la opini\'f3n de cualquiera de las partes es probable que lo sea, de una reclamaci\'f3n por violaci\'f3n de los derechos de propiedad intelectual. Una vez rescindido el Contrato, deber\'e1 - destruir todas las copias del Software. -\par -\par 8.\tab NORMAS RELATIVAS A LA EXPORTACI\'d3N. El Software y toda la informaci\'f3n t\'e9cnica suministrada de conformidad con el presente Contrato se rigen por las leyes de control de exportaciones de Estados Unidos, as\'ed - como por las normas relativas a la exportaci\'f3n o importaci\'f3n de otros pa\'edses. Usted se compromete a cumplir de forma estricta dichas leyes y normas, y reconoce su responsabilidad en la obtenci\'f3n de las licencias correspondientes de exportaci -\'f3n, reexportaci\'f3n o importaci\'f3n que se requieran una vez que le haya sido efectuada la entrega. -\par -\par 9.\tab MARCAS COMERCIALES Y LOGOTIPOS.}{\rtlch\fcs1 \ab\af58\afs16 \ltrch\fcs0 \b\f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -El licenciatario y Sun acuerdan y reconocen que Sun es propietaria de las marcas comerciales SUN, SOLARIS, JAVA, JINI, FORTE e iPLANET, as\'ed - como de todas las marcas comerciales, marcas de servicio, logotipos y otras designaciones de marcas relacionadas con SUN, SOLARIS, JAVA, JINI, FORTE e iPLANET (en adelante denominadas \'93Marcas Sun\'94 -). El licenciatario se compromete a cumplir los Requisitos de uso de logotipos y marcas de Sun (Sun Trademark and Logo Usage Requirements) que encontrar\'e1 en el sitio Web de Sun en http://www.sun.com/policies/trademarks. Todo uso que d\'e9 - a las marcas Sun redundar\'e1 en beneficio de Sun. -\par -\par 10.\tab DERECHOS RESTRINGIDOS DEL GOBIERNO DE ESTADOS UNIDOS.}{\rtlch\fcs1 \ab\af58\afs16 \ltrch\fcs0 \b\f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -Si el Software con licencia es adquirido por o en nombre del Gobierno de Estados Unidos, o bien por uno de sus contratistas o subcontratistas principales (a cualquier escala), los derechos del Gobierno sobre el Software y la documentaci\'f3 -n adjunta quedar\'e1n limitados a lo establecido en el presente Contrato, conforme a lo estipulado en 48 CFR 227.7201 hasta 227.7202-4 (relativo a las adquisiciones del Departamento de Defensa) y en 48 CFR 2.101 y 12.212 (sobre las adquisiciones qu -e no sean por parte del Departamento de Defensa). -\par -\par 11.\tab LEGISLACI\'d3N APLICABLE.}{\rtlch\fcs1 \ab\af58\afs16 \ltrch\fcs0 \b\f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 Toda acci\'f3 -n judicial que pudiera emprenderse en relaci\'f3n con este Contrato se someter\'e1 a la jurisdicci\'f3n del estado de California, as\'ed como a la legislaci\'f3n federal aplicable de los Estados Unidos. Por consiguiente, no se aplicar\'e1 - ninguna norma de elecci\'f3n de leyes correspondiente a cualquier jurisdicci\'f3n. -\par -\par 12.\tab INDEPENDENCIA DE LAS CL\'c1USULAS CONTRACTUALES. La imposibilidad de cumplir alguna de las cl\'e1usulas del presente Contrato no afectar\'e1 al resto del Contrato, que seguir\'e1 siendo v\'e1lido sin dicha cl\'e1usula a menos que la omisi\'f3 -n de la misma pudiera perjudicar los prop\'f3sitos de las partes, en cuyo caso se considerar\'e1 rescindido el Contrato de forma inmediata. -\par -\par 13.\tab TOTALIDAD DEL CONTRATO.}{\rtlch\fcs1 \ab\af58\afs16 \ltrch\fcs0 \b\f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -A todos los efectos el presente Contrato se considerar\'e1 como el contrato \'fanico establecido entre usted y Sun en relaci\'f3n con el objeto descrito. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \v\f58\fs16\lang9226\langfe1036\sub\langnp9226\insrsid3813644 -}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 Por consiguiente, el presente Contrato invalida todo contacto, propuesta, manifestaci\'f3n o garant\'eda q -ue se haya efectuado entre las partes, anterior o actual, oral o escrito, y prevalecer\'e1 en todo momento sobre los t\'e9rminos adicionales o contradictorios de cualquier texto, acuerdo, aceptaci\'f3 -n o contacto relativos al objeto del Contrato y que pudieran llevar a cabo las partes durante el per\'edodo de vigencia de \'e9ste. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \v\f58\fs16\lang9226\langfe1036\sub\langnp9226\insrsid3813644 }{\rtlch\fcs1 -\af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 Las modificaciones efectuadas sobre el presente Contrato no resultar\'e1 -n en modo alguno vinculantes si no se presentan por escrito y firmadas por un representante autorizado de cada parte. -\par -\par }\pard \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 T\'c9RMINOS ADICIONALES DE LA LICENCIA -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -\par Estos T\'e9rminos Adicionales de la Licencia ampl\'edan o modifican los t\'e9rminos del Contrato de Licencia de C\'f3digo Binario. Los t\'e9rminos en may\'fasculas que no se definan en los presentes T\'e9rminos Adicionales mantendr\'e1n el mismo si -gnificado que se les ha atribuido en el Contrato de Licencia de C\'f3digo Binario. Los presentes T\'e9rminos Adicionales sustituyen cualquier t\'e9rmino del Contrato de Licencia de C\'f3 -digo Binario o de cualquier licencia contenida dentro del Software con los que sean contradictorios o incongruentes. -\par -\par }\pard \ltrpar\ql \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 A.\tab -Uso interno del software y otorgamiento de la licencia de desarrollo. Sujeto a los t\'e9rminos y condiciones de este Acuerdo y a las restricciones y excepciones que se establecen en el archivo \'93README\'94 - del Software que se incorpora al presente por referencia, incluidas, sin limitaci\'f3n, las Restricciones de la Tecnolog\'eda Java de estos T\'e9 -rminos Adicionales, Sun le otorga una licencia no exclusiva, no transferible y limitada sin derechos de licencia, para reproducir y usar de manera interna el Software completo y sin modificar a los efectos de dise\'f1 -ar, desarrollar y probar sus Programas. -\par -\par B.\tab Licencia para la distribuci\'f3n del Software.}{\rtlch\fcs1 \ab\af58\afs16 \ltrch\fcs0 \b\f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -En virtud de los t\'e9rminos y condiciones del presente Contrato y las restricciones y excepciones estipuladas en el archivo README del Software, incluidas, aunque no exclusivamente, las Restricciones de la Tecnolog\'eda Java de estos T\'e9 -rminos Adicionales, Sun le concede una licencia limitada, no exclusiva e intransferible, sin tarif -a de licencia, para reproducir y distribuir el Software (excepto para JavaFX Runtime), siempre y cuando: i) distribuya el Software completo y sin modificar y \'fanicamente integrado como parte de sus Programas y con el s\'f3 -lo objeto de ejecutarlos, ii) los Programas a\'f1adan una funcionalidad sustancial y primaria al Software, iii) no distribuya software adicional con el prop\'f3 -sito de sustituir cualquier componente del Software iv) no elimine ni modifique las notificaciones ni los avisos de propiedad incluidos en el Software; v) distribuya el Software s\'f3 -lo mediante un contrato de licencia que proteja los intereses de Sun de conformidad con los t\'e9rminos establecidos en el Contrato, y vi) acuerde defender e indemnizar a Sun y a sus licenciantes por cualquier da\'f1o, costo, responsabilidad, transacci -\'f3n extrajudicial o gasto (incluidos honorarios de abogados) que se deriven de cualquier reclamaci\'f3n, litigio o acci\'f3n de terceros como consecuencia del uso o distribuci\'f3n de cualquiera o de todos los Programas y/o Software. -\par -\par C.\tab Restricciones de la tecnolog\'eda Java.}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\sub\langnp9226\insrsid3813644 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 -Usted se compromete a no crear, modificar ni alterar el desempe\'f1o, ni autorizar a sus licenciatarios para crear, modificar ni alterar el desempe\'f1o de clases, interfaces ni subpaquetes que en cualquier modo se identifiquen como \'93java\'94, \'93 -javax\'94, \'93sun\'94 o similares seg\'fan especifique Sun en cualquier designaci\'f3n de la convenci\'f3n de denominaci\'f3n. -\par -\par D.\tab C\'f3digo fuente. El Software puede contener c\'f3digo fuente que, a menos que se otorgue una licencia expresa para otros fines, se proporciona \'fanicamente con fines de referencia en virtud de los t\'e9rminos del presente Contrato. El c\'f3 -digo fuente no podr\'e1 redistribuirse a menos que as\'ed se estipule expl\'edcitamente en el presente Contrato. -\par -\par E.\tab C\'f3digo de terceros. En el archivo THIRDPARTYLICENSEREADME.txt se exponen avisos adicionales de derechos de autor y t\'e9rminos de licencia aplicables a partes del software. Adem\'e1s de cualquiera de los t\'e9 -rminos y condiciones de cualquier fuente abierta/licencia de freeware de terceros identificados en el archivo THIRDPARTYLICENSEREADME.txt, las disposiciones de la exclusi\'f3n de garant\'eda y limitaci\'f3n de responsabilidades comprendidas en los p\'e1 -rrafos 5 y 6 del Contrato de licencia de c\'f3digo binario se aplicar\'e1 a la totalidad del Software en lo concerniente a su distribuci\'f3n. -\par -\par F.\tab Resoluci\'f3n por violaci\'f3n. Cualquiera de las partes podr\'e1 resolver este Contrato de inmediato si alg\'fan Software es objeto de un reclamo por violaci\'f3 -n de un derecho de propiedad intelectual o, a criterio de alguna de las partes, pudiese serlo. -\par -\par G.\tab Instalaci\'f3n y actualizaci\'f3n autom\'e1tica. Los procesos de instalaci\'f3n y actualizaci\'f3n autom\'e1tica del Software transmiten una cantidad limitada de datos a Sun (o a su prestador de servicios) sobre esos procesos espec\'ed -ficos para ayudar a Sun a comprenderlos y optimizarlos. Sun no asocia los datos con informaci\'f3n personal susceptible de ser identificada. Encontrar\'e1 m\'e1s informaci\'f3n sobre los datos recabados por Sun en http://java.com/data/. -\par -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang9226\langfe1036\langnp9226\insrsid3813644 Si tuviera alguna duda, escriba a: Sun Microsystems, Inc. 415 -0 Network Circle, Santa Clara, California 95054, USA -\par }} diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_fr.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_fr.rtf deleted file mode 100644 index 326db56..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_fr.rtf +++ /dev/null @@ -1,195 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch13\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1041{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ?????????????\'a1\'ec???????};} -{\f37\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f52\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Microsoft Sans Serif;}{\f53\froman\fcharset238\fprq2 Times New Roman CE;}{\f54\froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f56\froman\fcharset161\fprq2 Times New Roman Greek;}{\f57\froman\fcharset162\fprq2 Times New Roman Tur;}{\f58\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f59\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f60\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f61\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f185\fnil\fcharset0\fprq2 SimSun Western{\*\falt ?????????????\'a1\'ec???????};}{\f425\fnil\fcharset0\fprq2 @SimSun Western;} -{\f573\fswiss\fcharset238\fprq2 Microsoft Sans Serif CE;}{\f574\fswiss\fcharset204\fprq2 Microsoft Sans Serif Cyr;}{\f576\fswiss\fcharset161\fprq2 Microsoft Sans Serif Greek;}{\f577\fswiss\fcharset162\fprq2 Microsoft Sans Serif Tur;} -{\f578\fbidi \fswiss\fcharset177\fprq2 Microsoft Sans Serif (Hebrew);}{\f579\fbidi \fswiss\fcharset178\fprq2 Microsoft Sans Serif (Arabic);}{\f580\fswiss\fcharset186\fprq2 Microsoft Sans Serif Baltic;} -{\f581\fswiss\fcharset163\fprq2 Microsoft Sans Serif (Vietnamese);}{\f582\fswiss\fcharset222\fprq2 Microsoft Sans Serif (Thai);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255; -\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;} -{\stylesheet{\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f52\hich\af52\dbch\af13\cgrid\langnp1033\langfenp2052 \snext0 Normal;}{ -\s1\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f52\hich\af52\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext0 heading 1;}{\*\cs10 -\additive \ssemihidden Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}} -{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid2448003\rsid3366009\rsid3476231\rsid15534201}{\*\generator Microsoft Word 11.0.0000;}{\info{\operator Leo}{\creatim\yr2009\mo4\dy1\hr19\min22}{\revtim\yr2009\mo6\dy15\hr16\min15}{\version4} -{\edmins0}{\nofpages3}{\nofwords2282}{\nofchars13014}{\nofcharsws15266}{\vern24615}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} -\paperw12240\paperh15840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 -\jcompress\viewkind1\viewscale170\rsidroot3366009 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\af52\hich\af52\dbch\af13\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 -\af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 Sun Microsystems, Inc. -\par \hich\af52\dbch\af13\loch\f52 Contrat de Licence de Code Objet -\par -\par \hich\af52\dbch\af13\loch\f52 pour -\par -\par \hich\af52\dbch\af13\loch\f52 JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6 et JAVAFX RUNTIME VERSION 1}{\rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \f0\fs16\lang1036\langfe2052\langnp1036\insrsid3366009 -\par -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid3476231 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 \hich\f52 SUN MICROSYSTEMS, INC. (\'ab -\loch\f52 \hich\f52 SUN \'bb\loch\f52 \hich\f52 ) VOUS CONC\'c8\loch\f52 \hich\f52 DE EN VERTU DU PR\'c9\loch\f52 \hich\f52 SENT CONTRAT UNE LICENCE DU LOGICIEL IDENTIFI\'c9\loch\f52 \hich\f52 CI-APR\'c8\loch\f52 \hich\f52 S, \'c0\loch\f52 L\hich\f52 -\rquote \hich\af52\dbch\af13\loch\f52 UNIQUE CONDITION QUE VOUS ACCEPTIEZ L\hich\f52 \rquote \loch\f52 \hich\f52 ENSEMBLE DES DISPOSITIONS CONTENUES DANS LE PR\'c9\loch\f52 \hich\f52 -SENT CONTRAT DE LICENCE DE CODE OBJET ET DANS LES DISPOSITIONS ADDITIONNELLES (COLLECTIVEMENT, LE \'ab\loch\f52 \hich\f52 CONTRAT \'bb\loch\f52 \hich\f52 ). VEUILLEZ LIRE ATTENTIVEMENT LE PR\'c9\loch\f52 SENT CONTRAT.}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3476231 \hich\af52\dbch\af13\loch\f52 }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3476231\charrsid3476231 \hich\af52\dbch\af13\loch\f52 -EN UTILISANT LE LOGICIEL, VOUS RECONNAISSEZ QUE VOUS AVEZ LU ET QUE VOUS ACCEPTEZ LES DISPOSITIONS DU CONTRAT. SI VOUS ACCEPTEZ LESDITES DISPOSITIONS AU NOM D'UNE ENTREPRISE OU DE TOUTE \hich\af52\dbch\af13\loch\f52 \hich\f52 -AUTRE PERSONNE MORALE, VOUS INDIQUEZ QUE VOUS DISPOSEZ DE L'AUTORIT\'c9\loch\f52 \hich\f52 L\'c9\loch\f52 \hich\f52 GALE POUR LIER CETTE PERSONNE MORALE \'c0\loch\f52 \hich\f52 CES DISPOSITIONS. SI VOUS NE DISPOSEZ PAS D'UNE TELLE AUTORIT\'c9\loch\f52 -\hich\f52 OU SI VOUS NE SOUHAITEZ PAS \'ca\loch\f52 \hich\f52 TRE LI\'c9\loch\f52 \hich\f52 PAR LES PR\'c9\loch\f52 SENTES DISPOSITIONS, VOUS NE DEVEZ\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 -PAS UTILISER LE LOGICIEL DISPONIBLE SUR CE SITE, NI AUCUN SUPPORT CONTENANT LE LOGICIEL.}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 -\par }\pard \ltrpar\ql \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 1.\tab \hich\f52 D\'c9\loch\f52 \hich\f52 -FINITIONS. Le terme \'ab\loch\f52 \hich\f52 Logiciel \'bb\loch\f52 \hich\f52 d\'e9\loch\f52 \hich\f52 signe le logiciel indiqu\'e9\loch\f52 ci-dessus, sous forme de code objet, toutes autres informations assimilables par\hich\af52\dbch\af13\loch\f52 -\hich\f52 machine, y compris notamment, des biblioth\'e8\loch\f52 ques, fichiers source, fichiers d\hich\f52 \rquote \loch\f52 \hich\f52 en-t\'ea\loch\f52 \hich\f52 te et fichiers de donn\'e9\loch\f52 \hich\f52 es, des mises \'e0\loch\f52 - jour ou corrections d\hich\f52 \rquote \loch\f52 erreurs fournies par Sun, ainsi que des manuels d\hich\f52 \rquote \loch\f52 utilisateur, des guides de programmation et tous autres docum\hich\af52\dbch\af13\loch\f52 e\hich\af52\dbch\af13\loch\f52 -\hich\f52 nts qui vous sont fournis par Sun en vertu du pr\'e9\loch\f52 \hich\f52 sent Contrat. Les termes \'ab\loch\f52 \hich\f52 Ordinateurs de bureau et serveurs universels \'bb\loch\f52 \hich\f52 d\'e9\loch\f52 \hich\f52 -signent les ordinateurs, y compris les ordinateurs de bureau et ordinateurs portables, ou serveurs, utilis\'e9\loch\f52 s pour des fonctions in\hich\af52\dbch\af13\loch\f52 f\hich\af52\dbch\af13\loch\f52 \hich\f52 ormatiques g\'e9\loch\f52 \hich\f52 n\'e9 -\loch\f52 rales d\hich\f52 \rquote \loch\f52 \hich\f52 utilisateur final (notamment, le courrier \'e9\loch\f52 \hich\f52 lectronique, la navigation Internet g\'e9\loch\f52 \hich\f52 n\'e9\loch\f52 \hich\f52 rale et les outils de productivit\'e9\loch\f52 - de suite bureautique). L\hich\f52 \rquote \loch\f52 \hich\f52 utilisation du Logiciel dans des syst\'e8\loch\f52 \hich\f52 mes et des solutions fournissant des fonctionnalit\'e9\hich\af52\dbch\af13\loch\f52 s\hich\af52\dbch\af13\loch\f52 \hich\f52 d\'e9 -\loch\f52 \hich\f52 di\'e9\loch\f52 \hich\f52 es (autres que celles susmentionn\'e9\loch\f52 \hich\f52 es) ou con\'e7\loch\f52 \hich\f52 us pour \'ea\loch\f52 \hich\f52 tre utilis\'e9\loch\f52 \hich\f52 s dans des applications logicielles int\'e9 -\loch\f52 \hich\f52 gr\'e9\loch\f52 \hich\f52 es ou \'e0\loch\f52 \hich\f52 fonctions sp\'e9\loch\f52 cifiques, telles que, notamment\~\hich\f52 : Les logiciel int\'e9\loch\f52 \hich\f52 gr\'e9\loch\f52 \hich\f52 s ou regroup\'e9\loch\f52 \hich\f52 -s avec syst\'e8\loch\f52 \hich\f52 mes de contr\'f4\loch\f52 \hich\f52 le industriels, t\'e9\loch\f52 \hich\f52 l\'e9\loch\f52 phones m\hich\af52\dbch\af13\loch\f52 o\hich\af52\dbch\af13\loch\f52 \hich\f52 biles sans fil, p\'e9\loch\f52 \hich\f52 riph\'e9 -\loch\f52 \hich\f52 riques de poche sans fils, mini-ordinateurs portables, services \'e0\loch\f52 \hich\f52 revenus partag\'e9\loch\f52 \hich\f52 s, t\'e9\loch\f52 \hich\f52 l\'e9\loch\f52 \hich\f52 viseur avec bo\'ee\loch\f52 \hich\f52 tier d\'e9 -\loch\f52 \hich\f52 codeur, lecteurs de disques Blu-ray, \'e9\loch\f52 \hich\f52 quipement de commutation de t\'e9\loch\f52 \hich\f52 l\'e9\loch\f52 \hich\f52 matique et de r\'e9\loch\f52 \hich\f52 seau, imprimantes et syst\'e8\loch\f52 mes de ges -\hich\af52\dbch\af13\loch\f52 t\hich\af52\dbch\af13\loch\f52 \hich\f52 ion de stockage et autres syst\'e8\loch\f52 \hich\f52 mes associ\'e9\loch\f52 \hich\f52 s, sont exclus de cette d\'e9\loch\f52 finition et ne font pas l\hich\f52 \rquote \loch\f52 -objet d\hich\f52 \rquote \loch\f52 \hich\f52 une licence en vertu du pr\'e9\loch\f52 \hich\f52 sent contrat. Le terme \'ab\loch\f52 \hich\f52 Programmes \'bb\loch\f52 \hich\f52 d\'e9\loch\f52 \hich\f52 -signe (a) les applets de technologie Java et les applications destin\'e9\loch\f52 \hich\f52 es \'e0\loch\f52 fonctionner \hich\af52\dbch\af13\loch\f52 s\hich\af52\dbch\af13\loch\f52 \hich\f52 -ur une plate-forme Java Platform, Standard Edition (Java SE), sur les ordinateurs de bureau ou les serveurs universels, sous Java et (b) les applications de technologie JavaFX destin\'e9\loch\f52 \hich\f52 es \'e0\loch\f52 - fonctionner sous JavaFX, sur les ordinateurs de bureau ou les serve\hich\af52\dbch\af13\loch\f52 u\hich\af52\dbch\af13\loch\f52 rs universels et compatibles JavaFX. -\par }{\rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \f0\fs16\lang1036\langfe2052\langnp1036\insrsid3366009 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 2.\tab \hich\f52 LICENCE D'UTILISATION. Sous r\'e9\loch\f52 \hich\f52 serve des dispositions du pr\'e9\loch\f52 \hich\f52 -sent Contrat, y compris notamment les Restrictions Relatives \'e0\loch\f52 \hich\f52 la Technologie Java des Dispositions Additionnelles \'e0\loch\f52 \hich\f52 la Licence, Sun vous conc\'e8\loch\f52 de une licenc\hich\af52\dbch\af13\loch\f52 \hich\f52 -e gratuite, limit\'e9\loch\f52 \hich\f52 e, non exclusive et non transf\'e9\loch\f52 rable, pour la reproduction et l\hich\f52 \rquote \loch\f52 \hich\f52 utilisation interne du Logiciel, complet et non modifi\'e9\loch\f52 , dans le seul but d\hich\f52 -\rquote \loch\f52 \hich\f52 ex\'e9\loch\f52 cuter des Programmes. -\par -\par \hich\af52\dbch\af13\loch\f52 3.\tab \hich\f52 LIMITATIONS. Le Logiciel est de nature confidentiel et prot\'e9\loch\f52 \hich\f52 g\'e9\loch\f52 par c\hich\af52\dbch\af13\loch\f52 \hich\f52 -opyright et/ou droit d'auteur. Le Logiciel et tous les droits de propri\'e9\loch\f52 \hich\f52 t\'e9\loch\f52 \hich\f52 intellectuelle qui y sont attach\'e9\loch\f52 \hich\f52 s demeurent la propri\'e9\loch\f52 \hich\f52 t\'e9\loch\f52 \hich\f52 - de Sun et/ou de ses Conc\'e9\loch\f52 \hich\f52 dants. Sous r\'e9\loch\f52 serve de la loi applicable, vous n\hich\f52 \rquote \'ea\loch\f52 \hich\f52 tes pas autoris\'e9\loch\f52 \hich\f52 \'e0\loch\f52 \hich\f52 modifier ou \'e0\loch\f52 \hich\f52 d -\'e9\loch\f52 compiler le \hich\af52\dbch\af13\loch\f52 L\hich\af52\dbch\af13\loch\f52 \hich\f52 ogiciel, ou \'e0\loch\f52 effectuer de l\hich\f52 \rquote \loch\f52 \hich\f52 ing\'e9\loch\f52 \hich\f52 nierie inverse. Le Titulaire de la Licence reconna -\'ee\loch\f52 \hich\f52 t que le Logiciel sous licence n'a pas \'e9\loch\f52 \hich\f52 t\'e9\loch\f52 \hich\f52 ni con\'e7\loch\f52 \hich\f52 u, ni destin\'e9\loch\f52 \hich\f52 pour \'ea\loch\f52 \hich\f52 tre utilis\'e9\loch\f52 - pour la conception, la construction, l'exploitation ou la maintenance d'installations nuc\hich\af52\dbch\af13\loch\f52 l\loch\af52\dbch\af13\hich\f52 \'e9\loch\f52 \hich\f52 -aires. Sun Microsystems, Inc. ne fournie aucune garantie expresse ou tacite quant \'e0\loch\f52 \hich\f52 la convenance \'e0\loch\f52 \hich\f52 ce type d'utilisation. Aucun droit, titre ou int\'e9\loch\f52 \hich\f52 r\'ea\loch\f52 -t, quel qu'il soit, concernant toute marque commerciale, marque de service, logo ou nom commercial de S\hich\af52\dbch\af13\loch\f52 u\hich\af52\dbch\af13\loch\f52 \hich\f52 n ou de ses conc\'e9\loch\f52 \hich\f52 dants n'est conc\'e9\loch\f52 \hich\f52 d -\'e9\loch\f52 \hich\f52 en vertu du pr\'e9\loch\f52 \hich\f52 sent Contrat. Des dispositions additionnelles aux licences pour les d\'e9\loch\f52 \hich\f52 veloppeurs et/ou les \'e9\loch\f52 \hich\f52 diteurs figurent dans les Dispositions Additionnelles -\'e0\loch\f52 la Licence. -\par -\par \hich\af52\dbch\af13\loch\f52 4.\tab \hich\f52 LIMITATION DE GARANTIE. Sous r\'e9\loch\f52 serve d\hich\f52 \rquote \loch\f52 u\hich\af52\dbch\af13\loch\f52 \hich\f52 ne utilisation normale du Logiciel, Sun garantit, sur pr\'e9\loch\f52 sentation d -\hich\f52 \rquote \loch\f52 une preuve d\hich\f52 \rquote \loch\f52 \hich\f52 achat, durant une p\'e9\loch\f52 \hich\f52 riode de quatre-vingt-dix (90) jours \'e0\loch\f52 \hich\f52 - compter de sa date d'acquisition, le support sur lequel le Logiciel est fourni (le cas \'e9\loch\f52 \hich\f52 ch\'e9\loch\f52 ant) est exempt de tout\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 \hich\f52 vice de mati\'e8\loch\f52 -re et de fabrication. A l\hich\f52 \rquote \loch\f52 \hich\f52 exception de la garantie qui pr\'e9\loch\f52 \hich\f52 c\'e8\loch\f52 \hich\f52 de, le Logiciel est fourni \'ab\~\loch\f52 \hich\f52 EN L'\'c9\loch\f52 \hich\f52 TAT\'bb\loch\f52 .\~ -\hich\f52 La seule indemnit\'e9\loch\f52 \hich\f52 et la seule responsabilit\'e9\loch\f52 \hich\f52 de Sun au titre de la pr\'e9\loch\f52 sente se limite, au choix de Sun, au remplacement du Logiciel ou au\hich\af52\dbch\af13\loch\f52 -\hich\af52\dbch\af13\loch\f52 \hich\f52 remboursement de la redevance vers\'e9\loch\f52 \hich\f52 e pour le Logiciel. Toute garantie implicite relative au Logiciel est limit\'e9\loch\f52 \hich\f52 e \'e0\loch\f52 \hich\f52 90 jours. Certains \'c9 -\loch\f52 tats n\hich\f52 \rquote \loch\f52 \hich\f52 autorisent pas la limitation de la dur\'e9\loch\f52 \hich\f52 e des garanties implicites. Il est donc possible que ce qui pr\'e9\loch\f52 \hich\f52 c\'e8\loch\f52 de ne s\hich\f52 \rquote \loch\f52 a -\hich\af52\dbch\af13\loch\f52 p\hich\af52\dbch\af13\loch\f52 \hich\f52 plique pas \'e0\loch\f52 vous}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \scaps\fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 .}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 \hich\f52 La pr\'e9\loch\f52 \hich\f52 sente garantie limit\'e9\loch\f52 \hich\f52 e vous conf\'e8\loch\f52 \hich\f52 re des droits l\'e9\loch\f52 \hich\f52 -gaux sp\'e9\loch\f52 cifiques. Il se peut que vous en ayez d\hich\f52 \rquote \loch\f52 autres, susceptibles de varier d\hich\f52 \rquote \loch\f52 \hich\f52 un \'c9\loch\f52 \hich\f52 tat \'e0\loch\f52 un autre. -\par -\par \hich\af52\dbch\af13\loch\f52 5.\tab \hich\f52 EXCLUSION DE GARANTIE. SAUF DISPOSITION CONTRAIRE DU PR\'c9\loch\f52 SENT CONTRAT, TOUTES\hich\af52\dbch\af13\loch\f52 \hich\f52 GARANTIES EXPRESSES OU TACITES, Y COMPRIS TOUTE GARANTIE IMPLICITE DE QUALIT -\'c9\loch\f52 MARCHANDE OU D\hich\f52 \rquote \loch\f52 \hich\f52 AD\'c9\loch\f52 \hich\f52 QUATION \'c0\loch\f52 \hich\f52 UN USAGE PARTICULIER OU DE NON-CONTREFA\'c7\loch\f52 \hich\f52 -ON SONT EXCLUES, SAUF DANS LA MESURE OU DE TELLES EXCLUSIONS NE SONT PAS AUTORIS\'c9\loch\f52 ES PAR LA LOI. -\par -\par \hich\af52\dbch\af13\loch\f52 6.\tab LIMITATIO\hich\af52\dbch\af13\loch\f52 \hich\f52 N DE RESPONSABILIT\'c9\loch\f52 \hich\f52 . DANS LES LIMITES AUTORIS\'c9\loch\f52 \hich\f52 ES PAR LA LOI, SUN OU SES CONC\'c9\loch\f52 \hich\f52 -DANTS NE POURRONT EN AUCUN CAS \'ca\loch\f52 \hich\f52 TRE RESPONSABLES DE TOUTES PERTE DE REVENUES, PERTE DE PROFITS OU PERTE DE DONN\'c9\loch\f52 \hich\f52 ES, NI DE TOUT DOMMAGE SP\'c9\loch\f52 \hich\f52 CIAL, INCIDENT, CONS\'c9\loch\f52 -CUTIF, INDIRECT OU \hich\af52\dbch\af13\loch\f52 P\hich\af52\dbch\af13\loch\f52 \hich\f52 UNITIF, QUELLE QUE SOIT LA CAUSE ET LE FONDEMENT DE LA RESPONSABILIT\'c9\loch\f52 \hich\f52 , R\'c9\loch\f52 SULTANT DE L\hich\f52 \rquote \loch\f52 -UTILISATION OU DE L\hich\f52 \rquote \loch\f52 \hich\f52 IMPOSSIBILIT\'c9\loch\f52 D\hich\f52 \rquote \loch\f52 UTILISER LE LOGICIEL, Y COMPRIS LORSQUE SUN AVAIT CONNAISSANCE DE L\hich\f52 \rquote \'c9\loch\f52 \hich\f52 VENTUALIT\'c9\loch\f52 - DE TELS DOMMAGES. Dans tous les cas, la responsabilit\loch\af52\dbch\af13\hich\f52 \'e9\hich\af52\dbch\af13\loch\f52 \hich\f52 de Sun \'e0\loch\f52 \hich\f52 votre \'e9\loch\f52 gard, qu\hich\f52 \rquote \loch\f52 \hich\f52 -elle soit de nature contractuelle, d\'e9\loch\f52 \hich\f52 lictuelle ou autre, ne pourra exc\'e9\loch\f52 \hich\f52 der le montant pay\'e9\loch\f52 , ou en l\hich\f52 \rquote \loch\f52 \hich\f52 absence de paiement, le montant d\'fb\loch\f52 \hich\f52 - en vertu du pr\'e9\loch\f52 \hich\f52 sent Contrat. Les limitations stipul\'e9\loch\f52 es ci-dessus s\hich\f52 \rquote \loch\f52 \hich\f52 appliquent m\'ea\loch\f52 me en cas de n\hich\af52\dbch\af13\loch\f52 o\hich\af52\dbch\af13\loch\f52 -n-respect de l\hich\f52 \rquote \loch\f52 \hich\f52 objet principal de la garantie mentionn\'e9\loch\f52 \hich\f52 e ci-dessus. Certains \'c9\loch\f52 tats ne permettent pas l\hich\f52 \rquote \loch\f52 \hich\f52 exclusion des dommages incidents ou cons -\'e9\loch\f52 cutifs\~; il est donc possible que certaines des dispositions ci-dessus ne s\hich\f52 \rquote \loch\f52 \hich\f52 appliquent pas \'e0\loch\f52 vous. -\par -\par \hich\af52\dbch\af13\loch\f52 7.\tab \hich\f52 R\'c9\loch\f52 SILIAT\hich\af52\dbch\af13\loch\f52 \hich\f52 ION. Le pr\'e9\loch\f52 \hich\f52 sent Contrat reste en vigueur jusqu'\'e0\loch\f52 \hich\f52 sa date de r\'e9\loch\f52 \hich\f52 -siliation. Vous pouvez, \'e0\loch\f52 \hich\f52 tout moment, r\'e9\loch\f52 \hich\f52 silier le pr\'e9\loch\f52 \hich\f52 sent Contrat, en d\'e9\loch\f52 \hich\f52 truisant toutes les copies du Logiciel. Le pr\'e9\loch\f52 \hich\f52 sent Contrat sera r -\'e9\loch\f52 \hich\f52 sili\'e9\loch\f52 par Sun de plein droit, et sans mise en demeure \hich\af52\dbch\af13\loch\f52 p\hich\af52\dbch\af13\loch\f52 \hich\f52 r\'e9\loch\f52 \hich\f52 -alable, en cas de non-respect de votre part d'une quelconque disposition du pr\'e9\loch\f52 \hich\f52 sent Contrat. Chaque partie peut de plein droit et sans mise en demeure pr\'e9\loch\f52 \hich\f52 alable, r\'e9\loch\f52 \hich\f52 silier le pr\'e9 -\loch\f52 \hich\f52 sent Contrat dans le cas o\'f9\loch\f52 le Logiciel deviendrait, ou risquerait de deveni\hich\af52\dbch\af13\loch\f52 r\hich\af52\dbch\af13\loch\f52 , selon l\hich\f52 \rquote \loch\f52 avis de l\hich\f52 \rquote \loch\f52 une ou l -\hich\f52 \rquote \loch\f52 autre des parties, l\hich\f52 \rquote \loch\f52 objet d\hich\f52 \rquote \loch\f52 \hich\f52 une action en contrefa\'e7\loch\f52 on d\hich\f52 \rquote \loch\f52 \hich\f52 un droit de propri\'e9\loch\f52 \hich\f52 t\'e9 -\loch\f52 \hich\f52 intellectuelle. En cas de R\'e9\loch\f52 \hich\f52 siliation, vous devez d\'e9\loch\f52 truire toutes les copies du Logiciel. -\par -\par \hich\af52\dbch\af13\loch\f52 8.\tab \hich\f52 DISPOSITIONS APPLICABLES \'c0\loch\f52 L'EXPORTATION. Tout Logicie\hich\af52\dbch\af13\loch\f52 \hich\f52 l et donn\'e9\loch\f52 \hich\f52 es techniques livr\'e9\loch\f52 \hich\f52 s dans le cadre du pr\'e9 -\loch\f52 \hich\f52 sent Contrat sont soumis \'e0\loch\f52 \hich\f52 la l\'e9\loch\f52 \hich\f52 gislation des \'c9\loch\f52 \hich\f52 tats-Unis sur le contr\'f4\loch\f52 \hich\f52 le des exportations, et peuvent \'e9\loch\f52 \hich\f52 galement \'ea -\loch\f52 tre soumis aux lois d'autres pays relatives aux importations et aux exportations. Vous vous\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 \hich\f52 engagez \'e0\loch\f52 \hich\f52 respecter strictement ces lois et ces r\'e8 -\loch\f52 \hich\f52 glements et reconnaissez qu'il vous appartient d'obtenir toutes les licences n\'e9\loch\f52 cessaires en vue de l\hich\f52 \rquote \loch\f52 \hich\f52 exportation, de la r\'e9\loch\f52 exportation ou de l\hich\f52 \rquote \loch\f52 -\hich\f52 importation de ces Logiciels et donn\'e9\loch\f52 \hich\f52 e technique apr\'e8\loch\f52 s leur li\hich\af52\dbch\af13\loch\f52 v\hich\af52\dbch\af13\loch\f52 raison. -\par -\par \hich\af52\dbch\af13\loch\f52 9.\tab \hich\f52 MARQUES D\'c9\loch\f52 \hich\f52 POS\'c9\loch\f52 \hich\f52 ES ET LOGOS. Vous reconnaissez et acceptez que Sun est propri\'e9\loch\f52 \hich\f52 taire des marques d\'e9\loch\f52 \hich\f52 pos\'e9\loch\f52 -es suivantes\~: SUN, SOLARIS, JAVA, JINI, FORTE et iPLANET, ainsi que de toutes les marques commerciales, marques de service, logos et autres sig\hich\af52\dbch\af13\loch\f52 \hich\f52 nes distinctifs associ\'e9\loch\f52 \hich\f52 s \'e0\loch\f52 -\hich\f52 SUN, SOLARIS, JAVA, JINI, FORTE et iPLANET (les \'ab\loch\f52 \hich\f52 Marques Sun \'bb\loch\f52 \hich\f52 ) et vous acceptez de respecter les r\'e8\loch\f52 \hich\f52 gles relatives \'e0\loch\f52 l\hich\f52 \rquote \loch\f52 -utilisation des Marques Sun telles qu'elles figurent sur le site: http://www.sun.com/policies/trademarks. To\hich\af52\dbch\af13\loch\f52 u\hich\af52\dbch\af13\loch\f52 tes les utilisations que vous ferez des Marques Sun devront l\hich\f52 \rquote \'ea -\loch\f52 \hich\f52 tre dans un sens favorable \'e0\loch\f52 Sun. -\par -\par \hich\af52\dbch\af13\loch\f52 10.\tab \hich\f52 UTILISATEURS DU GOUVERNEMENT DES \'c9\loch\f52 \hich\f52 TATS-UNIS. Conform\'e9\loch\f52 \hich\f52 ment aux dispositions 48 CFR 227.7201 \'e0\loch\f52 \hich\f52 227.7202-4 (acquisitions du Minist\'e8 -\loch\f52 \hich\f52 re de la D\'e9\loch\f52 fense (DOD)) e\hich\af52\dbch\af13\loch\f52 \hich\f52 t aux dispositions 48 CFR 2.101 et 12.212 (acquisitions non-DOD), si le Logiciel a \'e9\loch\f52 \hich\f52 t\'e9\loch\f52 \hich\f52 - acquis par le gouvernement des \'c9\loch\f52 \hich\f52 tats-Unis ou pour le compte de celui-ci, ou par un fournisseur ou sous-traitant principal du gouvernement des \'c9\loch\f52 \hich\f52 tats-Unis (\'e0\loch\f52 tout niveau) -\hich\af52\dbch\af13\loch\f52 ,\hich\af52\dbch\af13\loch\f52 \hich\f52 les droits du gouvernement sur le Logiciel et sa documentation seront uniquement ceux stipul\'e9\loch\f52 \hich\f52 s dans le pr\'e9\loch\f52 sent Contrat. -\par -\par \hich\af52\dbch\af13\loch\f52 11.\tab \hich\f52 LOI APPLICABLE. Tout litige relatif au pr\'e9\loch\f52 \hich\f52 sent Contrat est soumis \'e0\loch\f52 la loi de l\hich\f52 \rquote \loch\f52 \hich\f52 Etat de Californie et \'e0\loch\f52 \hich\f52 la r -\'e9\loch\f52 \hich\f52 glementation f\'e9\loch\f52 \hich\f52 d\'e9\loch\f52 ral\hich\af52\dbch\af13\loch\f52 \hich\f52 e am\'e9\loch\f52 \hich\f52 ricaine applicable. Aucune r\'e8\loch\f52 gle de conflit de loi ne sera applicable. -\par -\par \hich\af52\dbch\af13\loch\f52 12.\tab \hich\f52 NON-VALIDIT\'c9\loch\f52 PARTIELLE. Si l\hich\f52 \rquote \loch\f52 \hich\f52 une quelconque des dispositions du pr\'e9\loch\f52 \hich\f52 -sent Contrat est nulle ou inopposable, le Contrat demeura applicable, \'e0\loch\f52 l'exception de cette disposition. To\hich\af52\dbch\af13\loch\f52 \hich\f52 utefois, si la nullit\'e9\loch\f52 ou l\hich\f52 \rquote \loch\f52 \hich\f52 inopposabilit -\'e9\loch\f52 \hich\f52 de cette disposition \'e9\loch\f52 \hich\f52 tait contraire \'e0\loch\f52 \hich\f52 l'intention des parties, ce Contrat serait alors r\'e9\loch\f52 \hich\f52 sili\'e9\loch\f52 \hich\f52 de plein droit et sans mise en demeure pr -\'e9\loch\f52 alable. -\par -\par \hich\af52\dbch\af13\loch\f52 13.\tab \hich\f52 INT\'c9\loch\f52 \hich\f52 GRALIT\'c9\loch\f52 \hich\f52 DE L'ACCORD. Le pr\'e9\loch\f52 \hich\f52 sent Contrat constitue l'int\'e9\hich\af52\dbch\af13\loch\f52 \hich\f52 gralit\'e9\loch\f52 \hich\f52 - de l'accord entre vous et Sun concernant son objet. Il annule et remplace toutes les communications \'e9\loch\f52 \hich\f52 crites ou orales, propositions, d\'e9\loch\f52 \hich\f52 clarations et garanties, pr\'e9\loch\f52 \hich\f52 sentes ou pass\'e9 -\loch\f52 \hich\f52 es, et pr\'e9\loch\f52 vaut sur toute disposition contradictoire ou additionnelle \hich\af52\dbch\af13\loch\f52 d\hich\af52\dbch\af13\loch\f52 \hich\f52 -e tout autre devis, commande, confirmation ou communication entre les parties concernant l'objet du Contrat, et ce, pendant toute la dur\'e9\loch\f52 \hich\f52 e du Contrat. Le pr\'e9\loch\f52 \hich\f52 sent contrat ne peut \'ea\loch\f52 \hich\f52 -tre modifi\'e9\loch\f52 \hich\f52 que par un avenant \'e9\loch\f52 \hich\f52 crit et sign\'e9\loch\f52 \hich\f52 e par un repr\'e9\loch\f52 \hich\f52 sentant habilit\'e9\loch\f52 \hich\af52\dbch\af13\loch\f52 d\hich\af52\dbch\af13\loch\f52 -e chacune des parties. -\par -\par }\pard\plain \ltrpar\s1\ql \li0\ri0\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel0\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\af52\hich\af52\dbch\af13\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 -\af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 DISPOSITIONS ADDITIONNELLES AU CONTRAT DE LICENCE -\par }\pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\af52\hich\af52\dbch\af13\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af0\afs16 \ltrch\fcs0 -\f0\fs16\lang1036\langfe2052\langnp1036\insrsid3366009 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 \hich\f52 Les pr\'e9\loch\f52 \hich\f52 sentes Dispositions Additionnelles \'e0\loch\f52 \hich\f52 la Licence compl\'e8\loch\f52 -\hich\f52 tent ou modifient les dispositions du Contrat de Licence de Code Objet. Les termes en majuscules non d\'e9\loch\f52 finis dans les pr\loch\af52\dbch\af13\hich\f52 \'e9\loch\f52 \hich\f52 sentes Dispositions Additionnelles ont la m\'ea\loch\f52 -\hich\f52 me signification que celle qui leur a \'e9\loch\f52 \hich\f52 t\'e9\loch\f52 \hich\f52 attribu\'e9\loch\f52 \hich\f52 e dans le Contrat de Licence de Code Objet. Les dispositions des pr\'e9\loch\f52 -sentes Dispositions Additionnelles annulent et remplacent toute disposition incompatible ou \hich\af52\dbch\af13\loch\f52 c\hich\af52\dbch\af13\loch\f52 ontradictoire du Contrat de Licence de Code Objet ou de toute licence jointe au Logiciel. -\par -\par }\pard \ltrpar\ql \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 A.\tab Octroi de licence pour l\hich\f52 \rquote -\loch\f52 \hich\f52 usage interne et le d\'e9\loch\f52 \hich\f52 veloppement du logiciel. Sous r\'e9\loch\f52 \hich\f52 serve des conditions g\'e9\loch\f52 \hich\f52 n\'e9\loch\f52 \hich\f52 rales du pr\'e9\loch\f52 -sent contrat et des restrictions et exception\hich\af52\dbch\af13\loch\f52 \hich\f52 s stipul\'e9\loch\f52 \hich\f52 es dans le fichier LISEZMOI (README) ci-inclus pour r\'e9\loch\f52 \hich\f52 f\'e9\loch\f52 rence du logiciel, y compris, mais sans s -\hich\f52 \rquote \loch\f52 \hich\f52 y limiter, les restrictions de Java Technology aux pr\'e9\loch\f52 \hich\f52 sentes conditions compl\'e9\loch\f52 \hich\f52 mentaires, Sun vous conc\'e8\loch\f52 \hich\f52 de sans suppl\'e9\loch\f52 \hich\f52 -ment une licence limit\'e9\loch\f52 e non-ex\hich\af52\dbch\af13\loch\f52 c\hich\af52\dbch\af13\loch\f52 \hich\f52 lusive et non transf\'e9\loch\f52 rable vous donnant droit de reproduire et d\hich\f52 \rquote \loch\f52 \hich\f52 -utiliser en interne le logiciel dans son int\'e9\loch\f52 \hich\f52 gralit\'e9\loch\f52 \hich\f52 et non modifi\'e9\loch\f52 \hich\f52 aux fins de conception, de d\'e9\loch\f52 veloppement et d\hich\f52 \rquote \loch\f52 essai de vos programmes. -\par -\par \hich\af52\dbch\af13\loch\f52 B.\tab \hich\f52 Licence de Distribution de Logiciel. Sous r\'e9\loch\f52 serv\hich\af52\dbch\af13\loch\f52 \hich\f52 e des dispositions du pr\'e9\loch\f52 \hich\f52 sent Contrat et des restrictions et exclusions stipul\'e9 -\loch\f52 \hich\f52 es dans le fichier README du Logiciel, et notamment des Restrictions Relatives \'e0\loch\f52 \hich\f52 la Technologie Java des pr\'e9\loch\f52 \hich\f52 sentes Dispositions Additionnelles, Sun vous conc\'e8\loch\f52 de une licence gra -\hich\af52\dbch\af13\loch\f52 t\hich\af52\dbch\af13\loch\f52 \hich\f52 uite non exclusive, non transf\'e9\loch\f52 \hich\f52 rable et limit\'e9\loch\f52 \hich\f52 e de reproduire et distribuer le Logiciel (\'e0\loch\f52 \hich\f52 - l'exception de JavaFX Runtime), sous r\'e9\loch\f52 \hich\f52 serve des conditions suivantes : (i) vous distribuez le Logiciel dans son int\'e9\loch\f52 \hich\f52 gralit\'e9\loch\f52 et exempt de toute modification et uniq\hich\af52\dbch\af13\loch\f52 u -\hich\af52\dbch\af13\loch\f52 \hich\f52 ement s'il est int\'e9\loch\f52 \hich\f52 gr\'e9\loch\f52 \hich\f52 \'e0\loch\f52 \hich\f52 vos Programmes et dans le seul but de leur ex\'e9\loch\f52 \hich\f52 -cution, (ii) les Programmes ajoutent une fonctionnalit\'e9\loch\f52 \hich\f52 significative et essentielle au Logiciel, (iii) vous ne distribuez pas de logiciel suppl\'e9\loch\f52 \hich\f52 mentaire visant \'e0\loch\f52 se substituer aux com -\hich\af52\dbch\af13\loch\f52 p\hich\af52\dbch\af13\loch\f52 \hich\f52 osants du Logiciel, (iv) vous ne supprimez et ne modifiez aucune mention ou notice relative \'e0\loch\f52 \hich\f52 la propri\'e9\loch\f52 \hich\f52 t\'e9\loch\f52 \hich\f52 - du Logiciel, (v) vous ne distribuez le Logiciel qu'en vertu d'un contrat de licence prot\'e9\loch\f52 \hich\f52 geant les int\'e9\loch\f52 \hich\f52 r\'ea\loch\f52 ts de Sun et se conformant aux dispositions\hich\af52\dbch\af13\loch\f52 -\hich\af52\dbch\af13\loch\f52 \hich\f52 du pr\'e9\loch\f52 \hich\f52 sent Contrat, et (vi) vous acceptez de d\'e9\loch\f52 \hich\f52 fendre, garantir et indemniser Sun et ses conc\'e9\loch\f52 \hich\f52 dants contre tous dommages, co\'fb\loch\f52 -\hich\f52 ts, responsabilit\'e9\loch\f52 \hich\f52 s, tout montant et/ou d\'e9\loch\f52 \hich\f52 pense li\'e9\loch\f52 \hich\f52 (e) \'e0\loch\f52 \hich\f52 une transaction (y compris les honoraires d'avocats), r\'e9\loch\f52 sultant d'une ac -\hich\af52\dbch\af13\loch\f52 t\hich\af52\dbch\af13\loch\f52 \hich\f52 ion, r\'e9\loch\f52 \hich\f52 clamation ou de poursuites intent\'e9\loch\f52 es par un tiers du fait de l'utilisation ou de la distribution des Programmes et/ou du Logiciel. -\par -\par \hich\af52\dbch\af13\loch\f52 C.\tab \hich\f52 Restrictions Relatives \'e0\loch\f52 \hich\f52 la Technologie Java. Vous ne pouvez pas d\'e9\loch\f52 velopper, modifier, ni changer, ni autoriser v\hich\af52\dbch\af13\loch\f52 \hich\f52 os licenci\'e9 -\loch\f52 \hich\f52 s \'e0\loch\f52 \hich\f52 d\'e9\loch\f52 \hich\f52 velopper ou \'e0\loch\f52 \hich\f52 modifier ou changer le comportement des classes, interfaces ou sous-progiciels pouvant \'ea\loch\f52 \hich\f52 tre identifi\'e9\loch\f52 -\hich\f52 es, de quelque fa\'e7\loch\f52 \hich\f52 on que ce soit, comme \'ab\loch\f52 \hich\f52 java\'bb\loch\f52 \hich\f52 , \'ab\loch\f52 \hich\f52 javax\'bb\loch\f52 \hich\f52 , \'ab\loch\f52 \hich\f52 sun\'bb\loch\f52 \hich\f52 ou autres d\'e9 -\loch\f52 \hich\f52 nominations similaires, telles que sp\'e9\loch\f52 \hich\f52 cifi\'e9\loch\f52 es pa\hich\af52\dbch\af13\loch\f52 r\hich\af52\dbch\af13\loch\f52 \hich\f52 Sun dans toute convention ayant trait \'e0\loch\f52 \hich\f52 une d\'e9 -\loch\f52 nomination commerciale. -\par -\par \hich\af52\dbch\af13\loch\f52 D.\tab \hich\f52 Code source. Le Logiciel peut contenir des codes sources, lesquelles ne sont fournies qu'\'e0\loch\f52 \hich\f52 titre de r\'e9\loch\f52 \hich\f52 f\'e9\loch\f52 \hich\f52 rence, conform\'e9\loch\f52 -\hich\f52 ment aux dispositions du pr\'e9\loch\f52 sent Contrat. Sauf disposition exp\hich\af52\dbch\af13\loch\f52 \hich\f52 resse contraire du pr\'e9\loch\f52 \hich\f52 sent Contrat, les codes sources ne peuvent pas \'ea\loch\f52 \hich\f52 tre redistribu -\'e9\loch\f52 s. -\par -\par \hich\af52\dbch\af13\loch\f52 E.\tab Code de tiers. Des mentions de droit d\hich\f52 \rquote \loch\f52 \hich\f52 auteur et des dispositions suppl\'e9\loch\f52 \hich\f52 mentaires de licence applicables \'e0\loch\f52 - des parties du Logiciel figurent dans le fichier THIRDPAR\hich\af52\dbch\af13\loch\f52 \hich\f52 TYLICENSEREADME.txt. En plus de toutes les conditions g\'e9\loch\f52 \hich\f52 n\'e9\loch\f52 \hich\f52 -rales de licence de logiciel libre/logiciel gratuit de tiers identifi\'e9\loch\f52 \hich\f52 es dans le fichier THIRDPARTYLICENSEREADME.txt, les dispositions en mati\'e8\loch\f52 re d\hich\f52 \rquote \loch\f52 \hich\f52 exon\'e9\loch\f52 -ration et de limitation de garantie des para\hich\af52\dbch\af13\loch\f52 g\hich\af52\dbch\af13\loch\f52 raphes 5 et 6 du Contrat de Licence de Code Objet s\hich\f52 \rquote \loch\f52 \hich\f52 appliqueront \'e0\loch\f52 \hich\f52 - tout Logiciel contenu dans la pr\'e9\loch\f52 sente distribution. -\par -\par \hich\af52\dbch\af13\loch\f52 F.\tab \hich\f52 R\'e9\loch\f52 siliation pour non-respect. L\hich\f52 \rquote \loch\f52 une ou l\hich\f52 \rquote \loch\f52 \hich\f52 autre partie a le droit de r\'e9\loch\f52 \hich\f52 silier le pr\'e9\loch\f52 \hich\f52 -sent contrat imm\'e9\loch\f52 \hich\f52 diatement dans le cas o\'f9\loch\f52 un logi\hich\af52\dbch\af13\loch\f52 \hich\f52 ciel deviendrait, ou serait cens\'e9\loch\f52 devenir de l\hich\f52 \rquote \loch\f52 avis de l\hich\f52 \rquote \loch\f52 -une ou l\hich\f52 \rquote \loch\f52 autre partie, l\hich\f52 \rquote \loch\f52 objet d\hich\f52 \rquote \loch\f52 \hich\f52 une r\'e9\loch\f52 \hich\f52 clamation pour non-respect du droit de la propri\'e9\loch\f52 \hich\f52 t\'e9\loch\f52 - intellectuelle. -\par -\par \hich\af52\dbch\af13\loch\f52 G.\tab \hich\f52 Installation et mise \'e0\loch\f52 \hich\f52 jour automatique. Les proc\'e9\loch\f52 \hich\f52 d\'e9\loch\f52 s d\hich\f52 \rquote \loch\f52 \hich\f52 installation et de mise \'e0\loch\f52 jour -\hich\af52\dbch\af13\loch\f52 \hich\f52 automatique du logiciel transmettent \'e0\loch\f52 \hich\f52 Sun (ou ses prestataires de services) un volume restreint de donn\'e9\loch\f52 \hich\f52 es sur lesdits proc\'e9\loch\f52 \hich\f52 d\'e9\loch\f52 -s, et ce dans le seul et unique but d\hich\f52 \rquote \loch\f52 \hich\f52 aider Sun \'e0\loch\f52 mieux les comprendre et les optimiser. Sun ne saurait aucunement associer les \hich\af52\dbch\af13\loch\f52 d\hich\af52\dbch\af13\loch\f52 \hich\f52 onn -\'e9\loch\f52 \hich\f52 es avec des informations personnellement identifiables. Pour plus de d\'e9\loch\f52 \hich\f52 tails sur les donn\'e9\loch\f52 \hich\f52 es collect\'e9\loch\f52 es par Sun, consultez http://java.com/data/. -\par -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\langnp1036\insrsid3366009 \hich\af52\dbch\af13\loch\f52 \hich\f52 -Pour toute demande d'informations, veuillez vous adresser \'e0\loch\f52 : Sun Microsystems, Inc. 4150 Network Circle,\hich\af52\dbch\af13\loch\f52 \hich\f52 Santa Clara, CA 95054, \'c9\loch\f52 tats-Unis. -\par }} diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_it.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_it.rtf deleted file mode 100644 index 088947d..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_it.rtf +++ /dev/null @@ -1,160 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1041{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} -{\f11\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f55\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;} -{\f58\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Microsoft Sans Serif;}{\f59\froman\fcharset238\fprq2 Times New Roman CE;}{\f60\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f62\froman\fcharset161\fprq2 Times New Roman Greek;} -{\f63\froman\fcharset162\fprq2 Times New Roman Tur;}{\f64\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f65\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f66\froman\fcharset186\fprq2 Times New Roman Baltic;} -{\f67\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f79\fmodern\fcharset238\fprq1 Courier New CE;}{\f80\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f82\fmodern\fcharset161\fprq1 Courier New Greek;} -{\f83\fmodern\fcharset162\fprq1 Courier New Tur;}{\f84\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f85\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f86\fmodern\fcharset186\fprq1 Courier New Baltic;} -{\f87\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f171\fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f169\fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} -{\f170\fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f172\fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};} -{\f173\fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f176\fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt \'82\'6c\'82\'72 \'96\'be\'92\'a9};}{\f611\fmodern\fcharset0\fprq1 @MS Mincho Western;} -{\f609\fmodern\fcharset238\fprq1 @MS Mincho CE;}{\f610\fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f612\fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f613\fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f616\fmodern\fcharset186\fprq1 @MS Mincho Baltic;} -{\f639\fswiss\fcharset238\fprq2 Microsoft Sans Serif CE;}{\f640\fswiss\fcharset204\fprq2 Microsoft Sans Serif Cyr;}{\f642\fswiss\fcharset161\fprq2 Microsoft Sans Serif Greek;}{\f643\fswiss\fcharset162\fprq2 Microsoft Sans Serif Tur;} -{\f644\fbidi \fswiss\fcharset177\fprq2 Microsoft Sans Serif (Hebrew);}{\f645\fbidi \fswiss\fcharset178\fprq2 Microsoft Sans Serif (Arabic);}{\f646\fswiss\fcharset186\fprq2 Microsoft Sans Serif Baltic;} -{\f647\fswiss\fcharset163\fprq2 Microsoft Sans Serif (Vietnamese);}{\f648\fswiss\fcharset222\fprq2 Microsoft Sans Serif (Thai);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255; -\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;} -{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden -Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{ -\s15\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe1041\loch\f2\hich\af2\dbch\af11\langnp1033\langfenp1041 \sbasedon0 \snext15 \styrsid4288573 -Plain Text;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid4288573\rsid6441717\rsid7895303\rsid13057328}{\*\generator Microsoft Word 11.0.0000;}{\info{\author ac}{\operator Leo}{\creatim\yr2009\mo4\dy2\hr17\min9} -{\revtim\yr2009\mo6\dy15\hr13\min54}{\version4}{\edmins7}{\nofpages3}{\nofwords2335}{\nofchars13315}{\*\company Alpha}{\nofcharsws15619}{\vern24615}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} -\paperw12240\paperh15840\margl1701\margr1701\margt1417\margb1417\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120 -\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind4\viewscale180\nolnhtadjtbl\rsidroot13057328 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1 -\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5 -\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 -\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 Sun Microsystems, Inc. -\par Contratto di licenza del codice binario -\par -\par per -\par -\par JAVA SE RUNTIME ENVIRONMENT (JRE) VERSIONE 6 e JAVAFX RUNTIME VERSIONE 1 -\par -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4288573 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -LA SUN MICROSYSTEMS, INC. (QUI DI SEGUITO CHIAMATA "SUN") CONCEDE ALL'UTENTE LA LICENZA PER L'USO DEL S -OFTWARE DI SEGUITO INDICATO, SOLO PREVIA ACCETTAZIONE DI TUTTE LE CONDIZIONI RIPORTATE NEL PRESENTE CONTRATTO DI LICENZA DEL CODICE BINARIO E NELLE CONDIZIONI AGGIUNTIVE ALLA LICENZA FORNITE (COLLETTIVAMENTE QUI DI SEGUITO CHIAMATE "CONTRATTO").}{ -\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid4288573\charrsid4288573 L'UTILIZZO DEL SOFTWARE IMPLICA LA LETTURA E L'ACCETTAZIONE DEI TERMINI. SE I TERMINI VENGONO ACCETTATI PER CONTO DI UNA SOCIET\'c0 O DI UN'AL -TRA ENTIT\'c0 LEGALE, \'c8 IMPLICITO CHE IL SOGGETTO CHE LI ACCETTA SIA IN POSSESSO DELL'AUTORIT\'c0 LEGALE PER VINCOLARE L'ENTIT\'c0 LEGALE A TALI TERMINI. QUALORA NON SI FOSSE IN POSSESSO DI TALE AUTORIT\'c0 - O NON SI DESIDERASSE ESSERE VINCOLATI DA TALI TERMINI, IL SOFTWARE NON POTR\'c0 ESSERE UTILIZZATO N\'c9 IN QUESTO SITO, N\'c9 IN NESSUN SUPPORTO IN CUI POSSA ESSERE CONTENUTO.}{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 -\f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }\pard \ltrpar\ql \fi-270\li720\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }\pard \ltrpar\ql \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 1.\tab -DEFINIZIONI. "Software" indica quello descritto sopra in forma binaria, qualsiasi altro materiale ric -onoscibile mediante computer (ivi compresi a titolo puramente indicativo librerie, file sorgente, file di intestazione e file di dati), aggiornamenti o correzioni di errori forniti da Sun e eventuali manuali per l'utente, guide per la programmazione o alt -r -a documentazione fornita all'utente da Sun nell'ambito del presente Contratto. "Computer fissi e server destinati a scopi generici" indica computer, tra cui computer fissi e portatili o server, utilizzati per funzioni generiche di elaborazione sotto il co -ntrollo dell'utente finale (ivi compresi a titolo puramente esemplificativo posta elettronica, navigazione in Internet per scopi generici e strumenti di produttivit\'e0 - per ufficio). Sono esclusi dalla presente definizione e dalla licenza concessa mediante il presente Contratto l'uso del Software nei sistemi e nelle soluzioni che offrono funzionalit\'e0 - dedicate (diverse da quelle indicate sopra) o progettati per essere utilizzati in applicazioni software integrate o specifiche, ivi compresi a titolo puramente ese -mplificativo software integrati o forniti insieme a sistemi di controllo industriali, telefonia mobile wireless, dispositivi portatili wireless, netbook, chioschi, TV/STB, dispositivi per Blu-ray Disc, apparecchiature di selezione del controllo di rete e -t -elematiche, stampanti e sistemi di gestione del materiale archiviato e altri sistemi correlati. "Programmi" indica: a) applicazioni e applet con tecnologia Java ideate per essere utilizzate sulla piattaforma Java Platform, Standard Edition (Java SE) in Co -mputer fissi e server destinati a scopi generici abilitati Java e (b) applicazioni JavaFX ideate per essere utilizzate sulla piattaforma JavaFX Runtime in Computer fissi e server destinati a scopi generici abilitati JavaFX.}{\rtlch\fcs1 \af0\afs16 -\ltrch\fcs0 \fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 \line -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 2.\tab LICENZA D'USO. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 In conformit\'e0 -alle condizioni e ai termini di cui al presente Contratto, comprese, a titolo esemplificativo ma non limitativo, le Limitazioni relative alla Tecnologia Java,}{\rtlch\fcs1 \ab\af58\afs16 \ltrch\fcs0 -\b\f58\fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -riportate nelle Condizioni Aggiuntive alla Licenza, la Sun concede all'Utente una licenza limitata non esclusiva e non trasferibile, senza corresponsione di oneri di licenza, per la riproduzione e l'utilizzo interno del }{\rtlch\fcs1 \af58\afs16 -\ltrch\fcs0 \f58\fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 Software, completo e non modificato, al solo scopo di eseguire i Programmi. Ulteriori licenze per sviluppatori e/o editori sono conce -sse secondo le disposizioni riportate nelle Condizioni Aggiuntive alla Licenza. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }{\rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 3.\tab LIMITAZIONI. Il Software \'e8 - riservato e tutelato dalle norme che regolano il diritto d'autore. La Sun e i suoi concessori di licenza conservano la titolarit\'e0 del Software e di tutti i diritti di propriet\'e0 - intellettuale ad esso correlati. Salvo nel caso in cui tale divieto sia contrario alle leggi vigenti, \'e8 vietato modificare, decompilare o decodificare (reverse engineering) il Software. L'Utente riconosce che il Software ricevuto in licenza non \'e8 - progettato o destinato all'uso per la progettazione, la costruzione, il funzionamento o la manutenzione di qualunque tipo di impianto nucleare. La Sun Microsystems, Inc. non si assume alcuna garanzia, esplicita o implicita, di idoneit\'e0 - per tali finalit\'e0 d'uso. Il presente Contratto non implica la concessione di alcun diritto, propriet\'e0 - o interesse relativamente a qualunque marchio, marchio di servizio, logo o marca della Sun o dei suoi concessori di licenza. Ulteriori limitazioni riguardanti gli sviluppatori e/o gli editori sono riportate nelle Condizioni Aggiuntive alla Licenza. - -\par -\par 4.\tab LIMITAZIONI DI GARANZIA. La Sun garantisce che il supporto (eventuale) su cui viene fornito il Software, sar\'e0 privo di vizi nel materiale e difetti di f -abbricazione, in condizioni d'uso normali, per un periodo di novanta (90) giorni a decorrere dalla data di acquisto, indicata sullo scontrino fiscale di acquisto. Salva la garanzia sopraccitata, il Software viene fornito "COS\'cc COM'\'c8 -". Ai sensi della garanzia limitata, l'unica tutela dell'Utente, nonch\'e9 unica responsabilit\'e0 - della Sun, comporta la sostituzione del supporto del Software oppure il rimborso del prezzo di acquisto del Software, a discrezione della Sun. Tutte le garanzie implicite per il Software hanno una validit\'e0 - limitata a 90 giorni. Alcuni Stati vietano le limitazioni di durata alle garanzie implicite; pertanto, le suddette limitazioni potrebbero non riguardare tutti gli Utenti. La presente garanzia limitata conferisce all'Utente diritti legali - ben precisi. L'Utente pu\'f2 godere di altri diritti, variabili da Stato a Stato. -\par -\par 5.\tab ESCLUSIONE DI GARANZIA. AD ECCEZIONE DI QUANTO RIPORTATO NEL PRESENTE CONTRATTO, \'c8 ESCLUSA QUALUNQUE ALTRA CONDIZIONE, DICHIARAZIONE E GARANZIA, ESPRESSA O IMPLICITA, COMPRESE LE GARANZIE IMPLICITE DI COMMERCIABILIT\'c0 E DI IDONEIT\'c0 - AD UNO SCOPO SPECIFICO O DI NON VIOLAZIONE DI DIRITTI ALTRUI, SALVO NEL CASO IN CUI TALI ESCLUSIONI DI GARANZIA SIANO RITENUTE NULLE AI SENSI DELLE LEGGI VIGENTI. -\par -\par 6.\tab LIMITAZIONI DI RESPONSABILIT\'c0. ENTRO I LIMITI PREVISTI DALLA LEGGE, LA SUN O I SUOI CONCESSORI DI LICENZA NON SARANNO IN ALCUN CASO RESPONSABILI PER EVENTUALI PERDITE DI RICAVI, PROFITTI O DATI, N\'c9 - PER DANNI SPECIALI, INDIRETTI, EMERGENTI, INCIDENTALI O PER RISARCIMENTI ESEMPLARI, QUALUNQUE SIA LA CAUSA, INDIPENDENTEMENTE DALLA TEORIA DELLA RESPONSABILIT\'c0 CORRELATA O DERIVANTE DALL'USO DEL SOFTWARE O ALL'IMPOSSIBILIT\'c0 - AD UTILIZZARLO, ANCHE QUALORA LA SUN SIA STATA INFORMATA DELLA POSSIBILIT\'c0 DEL VERIFICARSI DI TALI DANNI. Ai sensi del presente Contratto, in nessun caso, inclusi i casi di colpa (compresa la negligenza) o l'adempimento contrattuale, la responsabilit -\'e0 della Sun nei confronti dell'Utente potr\'e0 eccedere l'importo pagato dall'Utente per il Software. Le limitazioni sopraccitat -e vengono applicate anche nel caso in cui la garanzia citata non adempia al suo scopo essenziale. Alcuni Stati vietano l'esclusione dei danni incidentali o consequenziali; pertanto, alcune delle suddette condizioni potrebbero non riguardare alcuni Utenti. - -\par -\par 7.\tab RISOLUZIONE. Il presente Contratto rimane in vigore fino alla sua risoluzione. L'Utente pu\'f2 - risolvere il Contratto in qualunque momento mediante la distruzione di tutte le copie del Software in suo possesso. L'inosservanza di una qualsiasi condizione -o disposizione del presente Contratto comporta la sua risoluzione immediata senza preavviso da parte della Sun. }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 Ciascuna parte potr\'e0 - risolvere il presente Contratto con effetto immediato qualora il Software costituisca, o possa costituire secondo il giudizio di una delle parti, oggetto di una rivendicazione per violazione di diritti di propriet\'e0 intellettuale. }{\rtlch\fcs1 -\af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 All'atto della risoluzione del Contratto, l'Utente \'e8 tenuto a distruggere tutte le copie del Software in suo possesso. -\par -\par 8.\tab NORMATIVE SULLE ESPORTAZIO -NI. Tutto il Software e i dati tecnici forniti ai sensi del presente Contratto sono soggetti alle leggi sulle esportazioni degli Stati Uniti d'America e possono essere soggetti alle leggi sulle esportazioni e importazioni in altri paesi. L'Utente si impeg -na a rispettare rigorosamente tutte le normative e le leggi in materia; inoltre, si assume la responsabilit\'e0 - di procurarsi eventuali licenze di esportazione, riesportazione o importazione che risultassero necessarie ad la avvenuta consegna del Software. -\par -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 9.\tab MARCHI E LOGO. L'Utente accetta e riconosce nei confronti della Sun che i marchi SUN, SOLARIS, JAVA, JINI, FORTE e iPLANET, nonch\'e9 - tutti i marchi, marchi di servizio, i logo e le altre designazioni di marchio correlate a SUN, SOLARIS, JAVA, JINI, FORTE e iPLANET (qui di seguito chiamati "Marchi Sun") sono di propriet\'e0 della Sun. L'Utente accetta altres\'ec - di rispettare le condizioni d'utilizzo dei marchi e dei logo Sun attualmente riportate nel sito http://www.sun.com/policies/trademarks. Qualunque uso dei Marchi Sun da parte dell'Utente andr\'e0 a beneficio della Sun.}{\rtlch\fcs1 \af58\afs16 -\ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\cf1\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 10.\tab -DIRITTI LIMITATI DEL GOVERNO DEGLI STATI UNITI. Se il Software viene acquistato da parte o per conto del Governo degli Stati Uniti o da parte di un suo committente primario o subappaltatore ( -di qualsiasi livello), i diritti del Governo sul Software e la relativa documentazione sono quelli specificati nel presente Contratto, ai sensi delle norme da 48 CFR 227.7201 fino a 227.7202-4 (per acquisti destinati al Ministero della Difesa, ovvero DOD) -, e da 48 CFR 2.101 a 12.212 (per acquisti non destinati al Ministero della Difesa, ovvero DOD). -\par -\par 11.\tab LEGISLAZIONE APPLICABILE. Ogni azione giudiziaria relativa al presente Contratto sar\'e0 soggetta alla legislazione dello Stato della California e alle leggi -federali applicabili degli Stati Uniti. La scelta di altre legislazioni o giurisdizioni non \'e8 prevista. -\par }{\rtlch\fcs1 \ab\af0\afs16 \ltrch\fcs0 \b\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 12.\tab INVALIDIT\'c0 PARZIALE. Se una qualunque disposizione del presente Contratto risultasse non valida, il Contratto resta in vigore con tale disposizione - omessa, salvo i casi in cui tale omissione faccia s\'ec che il Contratto non rappresenti pi\'f9 la volont\'e0 delle parti, nel qual caso il Contratto viene immediatamente risolto. -\par -\par 13.\tab INTEGRAZIONE. Il presente Contratto costituisce l'intero accordo stipulato tra -la Sun e l'Utente in relazione all'oggetto contrattuale. Il presente Contratto sostituisce eventuali comunicazioni, proposte, dichiarazione e garanzie, passate o presenti, scritte od orali, e prevale su qualunque condizione aggiuntiva o contrastante ripor -t -ata in qualsiasi offerta, ordine di acquisto, conferma d'ordine o altro tipo di comunicazione tra le parti relativamente all'oggetto del contratto per tutta la sua durata. Eventuali modifiche al presente Contratto sono vincolanti solo se redatte in forma -scritta e debitamente firmate da un incaricato debitamente autorizzato di ciascuna delle parti. -\par }\pard \ltrpar\ql \fi-264\li690\ri0\nowidctlpar\tx690\wrapdefault\faauto\rin0\lin690\itap0 {\rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 CONDIZIONI AGGIUNTIVE ALLA LICENZA -\par -\par Le condizioni aggiuntive alla licenza riportate di seguito integrano o modificano le condizioni del Contratto di Licenza del - Codice Binario. I termini con l'iniziale maiuscola che non sono definite nelle presenti Condizioni Aggiuntive avranno il significato ad esse attribuito nel Contratto di Licenza del Codice Binario. Le presenti Condizioni Aggiuntive sostituiscono eventuali - condizioni contrastanti o contraddittorie eventualmente riportate nel Contratto di Licenza del Codice Binario o in qualunque licenza in seno al Software. -\par -\par }\pard \ltrpar\ql \fi-284\li710\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin710\itap0 {\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 A.\tab -Utilizzo interno del software e concessione della licenza di sviluppo. Secondo i termini di questo - contratto e le restrizioni e le eccezioni stabilite nel file "README" del software, integrato qui per riferimento, ivi comprese a titolo esemplificativo ma non esaustivo le restrizioni alla tecnologia Java di questi termini supplementari, Sun concede all -'utente una licenza gratuita limitata, non esclusiva e non trasferibile, per riprodurre e utilizzare internamente il software, completo e non modificato, allo scopo di progettare, sviluppare e collaudare i suoi programmi. -\par -\par B.\tab Licenza per la distribuzione del Software. In conformit\'e0 - alle condizioni e ai termini riportati nel presente Contratto e soggetto alle limitazioni ed eccezioni di cui al file "README" del Software, comprese, a titolo esemplificativo ma non limitativo, le Limitazioni relative alla Tecnol -ogia Java di queste Condizioni Aggiuntive, Sun concede all'Utente una licenza limitata, non esclusiva e non trasferibile, senza corresponsione di oneri, per la riproduzione e la distribuzione del Software (a esclusione di JavaFX Runtime) a condizione che: - (i) l'Utente distribuisca il Software completo e non modificato, unito ("bundled") ai Programmi dell'Utente ed esclusivamente allo scopo di eseguirli, (ii) i Programmi aggiungano funzionalit\'e0 - significativa e primaria al Software, (iii) l'Utente non distribuisca altro software che sia inteso a sostituire un qualsiasi componente del Software, (iv) l'Utente non rimuova n\'e9 alteri avvisi o legende di propriet\'e0 - esclusiva inclusi nel Software, (v) l'Utente distribuisca il Software solamente a seguito di un contratto di licenza che protegga gli interessi della Sun in conformit\'e0 - alle condizioni di cui al presente Contratto, e (vi) l'Utente acconsenta a tenere indenne e ad indennizzare la Sun e i suoi concedenti di licenze contro richieste di risarcimenti danni, costi, responsabilit\'e0 -, somme e/o costi dovuti a titolo di composizione di eventuali vertenze (compresi oneri legali), sostenuti n connessione a rivendicazioni, azioni legali o azioni di terzi, risultanti o derivanti dall'uso o dalla distribuzione di uno o pi\'f9 P -rogrammi e/o del Software. -\par -\par C.\tab Limitazioni relative alla Tecnologia Java}{\rtlch\fcs1 \ab\af58\afs16 \ltrch\fcs0 \b\f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 . }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -L'Utente s'impegna a non creare, modificare o cambiare il comportamento, n\'e9 ad autorizzare i propri licenziatari a creare, modificare, o cambiare il comportamento, di classi, interfa -cce o pacchetti secondari che siano in qualsiasi modo identificati come "java", "javax", "sun" o nomi simili, secondo quanto specificato dalla Sun nelle convenzioni di denominazione. -\par -\par D.\tab Codice sorgente. Il Software potrebbe contenere un codice sorgente che, se non espressamente concesso in licenza per altri scopi, viene fornito esclusivamente a scopo di riferimento, ai sensi delle condizioni del presente Contratto. \'c8 - vietata la ridistribuzione del codice sorgente, salvo nei casi espressamente previsti dal presente Contratto. -\par -\par E.\tab Codice di terzi. Ulteriori avvisi di copyright e condizioni di concessione d'uso in licenza applicabili a parti del Software sono riportati nel file THIRDPARTYLICENSEREADME.txt. Il Software oggetto di questa distribuzione \'e8 soggett -o, oltre ad eventuali termini e condizioni di licenza opensource/freeware di terzi identificati nel file THIRDPARTYLICENSEREADME.txt, anche alle disposizioni relative all'esclusione della garanzia e alla limitazione delle responsabilit\'e0 - di cui ai paragrafi 5 e 6 del Contratto di Licenza del Codice Binario. -\par -\par F.\tab Rescissione per violazione. Entrambe le parti possono rescindere immediatamente il contratto nel caso in cui il software diventi (o sia probabile che il software diventi, secondo l'opinione di una del -le parti) oggetto di un reclamo per violazione di qualsiasi diritto di propriet\'e0 intellettuale. -\par -\par G.\tab Installazione e aggiornamento automatico. Le procedure di installazione e aggiornamento automatico del software trasmettono a Sun (o al suo fornitore di servizi) una quantit\'e0 - limitata di dati su questi processi specifici, per facilitarne la comprensione e l'ottim -izzazione da parte di Sun. Sun non associa i dati a informazioni che permettano l'identificazione degli utenti. Ulteriori informazioni sulle procedure di raccolta dei dati effettuate da Sun sono disponibili all'indirizzo http://java.com/data/. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16\lang1040\langfe1033\langnp1040\insrsid13057328 -\par }{\rtlch\fcs1 \af58\afs16 \ltrch\fcs0 \f58\fs16\lang1040\langfe1033\langnp1040\insrsid13057328 Per ulteriori informazioni contattare: Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, CA 95054, Stati Uniti -\par }} diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_ja.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_ja.rtf deleted file mode 100644 index 6c871f3..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_ja.rtf +++ /dev/null @@ -1,590 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch11\stshfloch21\stshfhich21\stshfbi0\deflang1033\deflangfe1041{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f11\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt MS Mincho};} -{\f21\froman\fcharset0\fprq2{\*\panose 02040604050505020304}Century;}{\f37\fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}MS UI Gothic;}{\f38\fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}@MS UI Gothic;} -{\f39\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\f52\froman\fcharset238\fprq2 Times New Roman CE;}{\f53\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f55\froman\fcharset161\fprq2 Times New Roman Greek;} -{\f56\froman\fcharset162\fprq2 Times New Roman Tur;}{\f57\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f58\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f59\froman\fcharset186\fprq2 Times New Roman Baltic;} -{\f60\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f164\fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt MS Mincho};}{\f162\fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt MS Mincho};} -{\f163\fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt MS Mincho};}{\f165\fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt MS Mincho};}{\f166\fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt MS Mincho};} -{\f169\fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt MS Mincho};}{\f262\froman\fcharset238\fprq2 Century CE;}{\f263\froman\fcharset204\fprq2 Century Cyr;}{\f265\froman\fcharset161\fprq2 Century Greek;}{\f266\froman\fcharset162\fprq2 Century Tur;} -{\f269\froman\fcharset186\fprq2 Century Baltic;}{\f424\fswiss\fcharset0\fprq2 MS UI Gothic Western;}{\f422\fswiss\fcharset238\fprq2 MS UI Gothic CE;}{\f423\fswiss\fcharset204\fprq2 MS UI Gothic Cyr;}{\f425\fswiss\fcharset161\fprq2 MS UI Gothic Greek;} -{\f426\fswiss\fcharset162\fprq2 MS UI Gothic Tur;}{\f429\fswiss\fcharset186\fprq2 MS UI Gothic Baltic;}{\f434\fswiss\fcharset0\fprq2 @MS UI Gothic Western;}{\f432\fswiss\fcharset238\fprq2 @MS UI Gothic CE;} -{\f433\fswiss\fcharset204\fprq2 @MS UI Gothic Cyr;}{\f435\fswiss\fcharset161\fprq2 @MS UI Gothic Greek;}{\f436\fswiss\fcharset162\fprq2 @MS UI Gothic Tur;}{\f439\fswiss\fcharset186\fprq2 @MS UI Gothic Baltic;} -{\f444\fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f442\fmodern\fcharset238\fprq1 @MS Mincho CE;}{\f443\fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f445\fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f446\fmodern\fcharset162\fprq1 @MS Mincho Tur;} -{\f449\fmodern\fcharset186\fprq1 @MS Mincho Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255; -\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{ -\qj \li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs21\lang1033\langfe1041\kerning2\loch\f21\hich\af21\dbch\af11\cgrid\langnp1033\langfenp1041 \snext0 Normal;}{\*\cs10 -\additive \ssemihidden Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f21\hich\af21\dbch\af11\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}} -{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid6425320\rsid11286785\rsid13652454}{\*\generator Microsoft Word 11.0.0000;}{\info{\operator Leo}{\creatim\yr2009\mo6\dy12\hr15\min14}{\revtim\yr2009\mo6\dy15\hr15\min6}{\version3}{\edmins1} -{\nofpages4}{\nofwords924}{\nofchars5269}{\nofcharsws6181}{\vern24615}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1701\margr1701\margt1985\margb1701\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 -\jcompress\viewkind4\viewscale120\rsidroot6425320 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs21\lang1033\langfe1041\kerning2\loch\af21\hich\af21\dbch\af11\cgrid\langnp1033\langfenp1041 {\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 SUN MICROSYSTEMS, INC. -\par -\par }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12496\'83\'6f\u12452\'83\'43\u12490\'83\'69\u12522\'83\'8a\u12467\'83\'52\u12540\'81\'5b\u12489 -\'83\'68\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u22865\'8c\'5f\u32004\'96\'f1\u26360\'8f\'91}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JAVA SE RUNTIME ENVIRONMENT(JRE) 6 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JAVAFX RUNTIME VERSION 1 }{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u29992\'97\'70}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13652454 {\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 SUN MICROSYSTEMS, INC (}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u20197\'88\'c8\u19979\'89\'ba\u12300\'81\'75}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 SUN}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12301\'81\'76\u12392\'82\'c6\u12377\'82\'b7\u12427\'82\'e9}{ -\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u26412\'96\'7b\u12496\'83\'6f\u12452\'83\'43\u12490\'83\'69\u12522\'83\'8a\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68}{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u22865\'8c\'5f\u32004\'96\'f1\u12362\'82\'a8\u12424\'82\'e6 -\u12403\'82\'d1\u-30500\'95\'e2\u-29261\'91\'ab\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u20197\'88\'c8\u19979\'89\'ba\u-26938\'8f\'57\u21512\'8d\'87\u30340\'93\'49\u12395\'82\'c9\u12300\'81\'75\u22865\'8c\'5f\u32004 -\'96\'f1\u26360\'8f\'91\u12301\'81\'76\u12392\'82\'c6\u12377\'82\'b7\u12427\'82\'e9}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u12434\'82\'f0\u21463\'8e\'f3\u-29954\'91\'f8\u12377\'82\'b7\u12427\'82\'e9 -\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u26465\'8f\'f0\u20214\'8c\'8f\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12289\'81\'41\u20197\'88\'c8 -\u19979\'89\'ba\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u20351\'8e\'67\u29992\'97\'70\u27177\'8c\'a0\u12434\'82\'f0\u-30159\'8b\'96\u-29954\'91\'f8\u12375\'82\'b5\u12414 -\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12372\'82\'b2\u20351\'8e\'67\u29992\'97\'70\u21069\'91\'4f\u12395\'82\'c9\u22865\'8c\'5f\u32004\'96\'f1\u26360\'8f\'91\u12434\'82\'f0\u12424\'82\'e6\u12367\'82\'ad\u12362\'82\'a8\u-30035\'93\'c7\u12415\'82\'dd -\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid13652454\charrsid13652454 \loch\af37\hich\af21\dbch\f37 \uc2\u26412 -\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12289\'81\'41\u22865\'8c\'5f\u32004 -\'96\'f1\u26360\'8f\'91\u26465\'8f\'f0\u-26619\'8d\'80\u12434\'82\'f0\u-30035\'93\'c7\u12435\'82\'f1\u12391\'82\'c5\u21463\'8e\'f3\u-29954\'91\'f8\u12375\'82\'b5\u12383\'82\'bd\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12415\'82\'dd\u12394\'82\'c8 -\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u20225\'8a\'e9\u26989\'8b\'c6\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398\'82\'cc\u27861\'96\'40\u30340\'93\'49\u32068\'91\'67 -\u32340\'90\'44\u12434\'82\'f0\u20195\'91\'e3\u-30616\'95\'5c\u12375\'82\'b5\u12390\'82\'c4\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u26465\'8f\'f0\u-26619\'8d\'80\u12434\'82\'f0\u21463\'8e\'f3\u-29954\'91\'f8\u12377\'82\'b7\u12427 -\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12399\'82\'cd\u12289\'81\'41\u27861\'96\'40\u30340\'93\'49\u32068\'91\'67\u32340\'90\'44\u12434\'82\'f0\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9 -\u25304\'8d\'53\u26463\'91\'a9\u12377\'82\'b7\u12427\'82\'e9\u27861\'96\'40\u30340\'93\'49\u27177\'8c\'a0\u-27056\'8c\'c0\u12434\'82\'f0\u25345\'8e\'9d\u12387\'82\'c1\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12434 -\'82\'f0\u-30616\'95\'5c\u26126\'96\'be\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12395\'82\'c9\u12394\'82\'c8\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12381\'82\'bb\u12398\'82\'cc\u12424\'82\'e6\u12358\'82\'a4 -\u12394\'82\'c8\u27177\'8c\'a0\u-27056\'8c\'c0\u12434\'82\'f0\u25345\'8e\'9d\u12383\'82\'bd\u12394\'82\'c8\u12356\'82\'a2\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u25215\'8f\'b3\u-29954\'91\'f8\u12391 -\'82\'c5\u12365\'82\'ab\u12394\'82\'c8\u12356\'82\'a2\u26465\'8f\'f0\u-26619\'8d\'80\u12364\'82\'aa\u12354\'82\'a0\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u12371\'82\'b1\u12398\'82\'cc\u12469\'83\'54\u12452\'83\'43\u12488\'83\'67 -\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41 -\u12364\'82\'aa\u26684\'8a\'69\u32013\'94\'5b\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398\'82\'cc\u12513\'83\'81\u12487\'83\'66\u12451\'83\'42\u12450\'83\'41\u12434\'82\'f0 -\u20351\'8e\'67\u29992\'97\'70\loch\af37\hich\af21\dbch\f37 \u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 1.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u23450\'92\'e8\u32681\'8b\'60\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12300\'81\'75\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12301\'81\'76\u12392\'82\'c6 -\u12399\'82\'cd\u12289\'81\'41\u19978\'8f\'e3\u-30184\'8b\'4c\u12398\'82\'cc\u12496\'83\'6f\u12452\'83\'43\u12490\'83\'69\u12522\'83\'8a\u24418\'8c\'60\u24335\'8e\'ae\u12391\'82\'c5\u25552\'92\'f1\u20379\'8b\'9f\u12373\'82\'b3\u12428\'82\'ea\u12427 -\'82\'e9\u12289\'81\'41\u27231\'8b\'40\u26800\'8a\'42\u21487\'89\'c2\u-30035\'93\'c7\u12398\'82\'cc\u-29497\'8e\'91\u26009\'97\'bf}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12521\'83\'89\u12452\'83\'43\u12502\'83\'75\u12521\'83\'89\u12522\'83\'8a\u12289\'81\'41\u12477\'83\'5c\u12540\'81\'5b\u12473\'83\'58 -\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12289\'81\'41\u12504\'83\'77\u12483\'83\'62\u12480\'83\'5f\u12540\'81\'5b\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1 -\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12434\'82\'f0\u21547\'8a\'dc\u12416\'82\'de\u12364\'82\'aa\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u12395\'82\'c9\u-27056\'8c\'c0\u23450 -\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12420\'82\'e2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 -Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12364\'82\'aa\u25552\'92\'f1\u20379\'8b\'9f\u12377\'82\'b7\u12427\'82\'e9\u26368\'8d\'c5\u26032 -\'90\'56\u24773\'8f\'ee\u22577\'95\'f1\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-30044\'8c\'eb\u-29908\'95\'54\u20462\'8f\'43\u27491\'90\'b3\u12289\'81\'41\u12518\'83\'86\u12540\'81\'5b\u12470\'83\'55\u21462\'8e\'e6\u25201\'88\'b5\u-30036\'90\'e0 -\u26126\'96\'be\u26360\'8f\'91\u12289\'81\'41\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12511\'83\'7e\u12531\'83\'93\u12464\'83\'4f\u12460\'83\'4b\u12452\'83\'43\u12489\'83\'68\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1}{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12364\'82\'aa\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u26360\'8f\'91\u12398\'82\'cc\u19979 -\'89\'ba\loch\af37\hich\af21\dbch\f37 \u12395\'82\'c9\u25552\'92\'f1\u20379\'8b\'9f\u12377\'82\'b7\u12427\'82\'e9\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398\'82\'cc\u25991\'95\'b6\u26360\'8f\'91\u12434\'82\'f0\u24847\'88\'d3\u21619\'96\'a1\u12375 -\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12300\'81\'75\u27726\'94\'c4\u29992\'97\'70\u12487\'83\'66\u12473\'83\'58\u12463\'83\'4e\u12488\'83\'67\u12483\'83\'62\u12503\'83\'76\u12467\'83\'52\u12531\'83\'93\u12500\'83\'73\u12517\'83\'85\u12540 -\'81\'5b\u12479\'83\'5e\u12354\'82\'a0\u12427\'82\'e9\u12356\'82\'a2\u12399\'82\'cd\u12469\'83\'54\u12540\'81\'5b\u12496\'83\'6f\u12301\'81\'76\u12392\'82\'c6\u12399\'82\'cd\u12289\'81\'41\u12487\'83\'66\u12473\'83\'58\u12463\'83\'4e\u12488\'83\'67\u12483 -\'83\'62\u12503\'83\'76\u22411\'8c\'5e\u12289\'81\'41\u12521\'83\'89\u12483\'83\'62\u12503\'83\'76\u12488\'83\'67\u12483\'83\'62\u12503\'83\'76\u22411\'8c\'5e\u12398\'82\'cc\u12467\'83\'52\u12531\'83\'93\u12500\'83\'73\u12517\'83\'85\u12540\'81\'5b\u12479 -\'83\'5e\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12469\'83\'54\u12540\'81\'5b\u12496\'83\'6f\u12434\'82\'f0\u25351\'8e\'77\u12375\'82\'b5\u12289\'81\'41\u12456\'83\'47\u12531\'83\'93\u12489\'83\'68\u12518\'83\'86\u12540\'81\'5b\u12470 -\'83\'55\u12540\'81\'5b\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u19968\'88\'ea\u-32212\'94\'ca\u30340\'93\'49\u12394\'82\'c8\u12467\'83\'52\u12531\'83\'93\u12500\'83\'73\u12517\'83\'85\u12540\'81\'5b\u12479\'83\'5e\u12398\'82\'cc -\u29992\'97\'70\u-28652\'93\'72\u-248\'81\'69}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 e-mail}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41\u12452\'83\'43\u12531\'83\'93\u12479\'83\'5e\u12540\'81\'5b\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67\u12398\'82\'cc -\u19968\'88\'ea\u-32212\'94\'ca\u30340\'93\'49\u21033\'97\'98\u29992\'97\'70\u12289\'81\'41\u12458\'83\'49\u12501\'83\'74\u12451\'83\'42\u12473\'83\'58\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12398\'82\'cc\u21033\'97\'98\u29992\'97\'70\u12434 -\'82\'f0\u21547\'8a\'dc\u12416\'82\'de\u12364\'82\'aa\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u-247\'81\'6a\u12395\'82\'c9\u20351\'8e\'67\u29992 -\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u19978\'8f\'e3\u-30184\'8b\'4c\u20197\'88\'c8\u22806\'8a\'4f\u12398\'82\'cc\u23554\'90\'ea -\u29992\'97\'70\u27231\'8b\'40\u-32515\'94\'5c\u24615\'90\'ab\u12434\'82\'f0\u12418\'82\'e0\u12388\'82\'c2\u12471\'83\'56\u12473\'83\'58\u12486\'83\'65\u12512\'83\'80\u12420\'82\'e2\u12477\'83\'5c\u12522\'83\'8a\u12517\'83\'85\u12540\'81\'5b\u12471 -\'83\'56\u12519\'83\'87\u12531\'83\'93\u12289\'81\'41\u12394\'82\'c8\u12425\'82\'e7\u12403\'82\'d1\u12395\'82\'c9\u32068\'91\'67\u-28740\'8d\'9e\u12415\'82\'dd\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u29305\'93\'c1\u23450\'92\'e8 -\u27231\'8b\'40\u-32515\'94\'5c\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12450\'83\'41\u12503\'83\'76\u12522\'83\'8a\u12465\'83\'50\u12540\'81\'5b\u12471\'83\'56\u12519\'83\'87\u12531 -\'83\'93\u12391\'82\'c5\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u20351\'8e\'67\u29992\'97\'70\u12399\'82\'cd\u23450\'92\'e8\u32681\'8b\'60\u12363\'82\'a9\u12425\'82\'e7 -\u-27036\'8f\'9c\u22806\'8a\'4f\u12373\'82\'b3\u12428\'82\'ea\u12289\'81\'41\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473 -\'83\'58\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u12418\'82\'e0\u12398\'82\'cc\loch\af37\hich\af21\dbch\f37 \u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12371\'82\'b1\u12428\'82\'ea\u12395\'82\'c9\u12399 -\'82\'cd\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12364\'82\'aa\u12289\'81\'41\u20363\'97\'e1\u12360\'82\'a6\u12400\'82\'ce\u12289\'81\'41\u29987\'8e\'59\u26989\'8b\'c6\u29992\'97\'70\u21046\'90\'a7\u24481 -\'8c\'e4\u12471\'83\'56\u12473\'83\'58\u12486\'83\'65\u12512\'83\'80\u12289\'81\'41\u25658\'8c\'67\u24111\'91\'d1\u-26885\'93\'64\u-30095\'98\'62\u12289\'81\'41\u28961\'96\'b3\u32218\'90\'fc\u25658\'8c\'67\u24111\'91\'d1\u27231\'8b\'40\u22120\'8a\'ed -\u12289\'81\'41\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67\u12502\'83\'75\u12483\'83\'62\u12463\'83\'4e\u12289\'81\'41\u12452\'83\'43\u12531\'83\'93\u12479\'83\'5e\u12540\'81\'5b\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67\u12539\'81\'45\u12461\'83\'4c -\u12458\'83\'49\u12473\'83\'58\u12463\'83\'4e\u12289\'81\'41\u12475\'83\'5a\u12483\'83\'62\u12488\'83\'67\u12488\'83\'67\u12483\'83\'62\u12503\'83\'76\u12508\'83\'7b\u12483\'83\'62\u12463\'83\'4e\u12473\'83\'58\u12289\'81\'41\u12502\'83\'75\u12523\'83\'8b -\u12540\'81\'5b\u12524\'83\'8c\u12452\'83\'43\u12487\'83\'66\u12451\'83\'42\u12473\'83\'58\u12463\'83\'4e\u27231\'8b\'40\u22120\'8a\'ed\u12289\'81\'41\u12486\'83\'65\u12524\'83\'8c\u12510\'83\'7d\u12486\'83\'65\u12451\'83\'42\u12483\'83\'62\u12463\'83\'4e -\u12473\'83\'58\u27231\'8b\'40\u22120\'8a\'ed\u12289\'81\'41\u12493\'83\'6c\u12483\'83\'62\u12488\'83\'67\u12527\'83\'8f\u12540\'81\'5b\u12463\'83\'4e\u21046\'90\'a7\u24481\'8c\'e4\u27231\'8b\'40\u22120\'8a\'ed\u12289\'81\'41\u12503\'83\'76\u12522\'83\'8a -\u12531\'83\'93\u12479\'83\'5e\u12540\'81\'5b\u12289\'81\'41\u-29521\'92\'99\u-31435\'91\'a0\u31649\'8a\'c7\u29702\'97\'9d\u12471\'83\'56\u12473\'83\'58\u12486\'83\'65\u12512\'83\'80\u12289\'81\'41\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398 -\'82\'cc\u-27230\'8a\'d6\u-28637\'98\'41\u12471\'83\'56\u12473\'83\'58\u12486\'83\'65\u12512\'83\'80\u12395\'82\'c9\u32068\'91\'67\u-28740\'8d\'9e\u12414\'82\'dc\u12428\'82\'ea\u12427\'82\'e9\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd -\u12289\'81\'41\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12392\'82\'c6\u12475\'83\'5a\u12483\'83\'62\u12488\'83\'67\u12391\'82\'c5\u20379\'8b\'9f\u32102\'8b\'8b\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa -\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12364\'82\'aa\u12289\'81\'41\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12379 -\'82\'b9\u12435\'82\'f1\u12290\'81\'42\u12300\'81\'75\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12301\'81\'76\u12392\'82\'c6\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (a) Java }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u21487 -\'89\'c2\u-32515\'94\'5c\u12394\'82\'c8\u27726\'94\'c4\u29992\'97\'70\u12487\'83\'66\u12473\'83\'58\u12463\'83\'4e\u12488\'83\'67\u12483\'83\'62\u12503\'83\'76\u12467\'83\'52\u12531\'83\'93\u12500\'83\'73\u12517\'83\'85\u12540\'81\'5b\u12479\'83\'5e -\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12469\'83\'54\u12540\'81\'5b\u12496\'83\'6f\u12395\'82\'c9\u25645\'93\'8b\u-28919\'8d\'da\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Java Platform Standard Edit -\hich\af21\dbch\af37\loch\f21 ion (Java SE) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u19978\'8f\'e3\u12391\'82\'c5\u20316\'8d\'ec\u21205 -\'93\'ae\u12377\'82\'b7\u12427\'82\'e9\u12424\'82\'e6\u12358\'82\'a4\u24847\'88\'d3\u22259\'90\'7d\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Java }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12450\'83\'41\u12503\'83\'76\u12524\'83\'8c\u12483\'83\'62\u12488\'83\'67\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12450 -\'83\'41\u12503\'83\'76\u12522\'83\'8a\u12465\'83\'50\u12540\'81\'5b\u12471\'83\'56\u12519\'83\'87\u12531\'83\'93\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (b) JavaFX }{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u21487\'89\'c2\u-32515\'94\'5c\u12394\'82\'c8\u27726\'94\'c4\u29992\'97\'70\u12487\'83\'66\u12473 -\'83\'58\u12463\'83\'4e\u12488\'83\'67\u12483\'83\'62\u12503\'83\'76\u12467\'83\'52\u12531\'83\'93\u12500\'83\'73\u12517\'83\'85\u12540\'81\'5b\u12479\'83\'5e\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12469\'83\'54\u12540\'81\'5b\u12496\'83\'6f\u12395 -\'82\'c9\u25645\'93\'8b\u-28919\'8d\'da\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 -\af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JavaFX Runtime }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u19978\'8f\'e3\u12391\'82\'c5\u20316\'8d\'ec\u21205\'93\'ae\u12377\'82\'b7\u12427\'82\'e9\u12424\'82\'e6\u12358\'82\'a4\u24847\'88\'d3\u22259\'90\'7d\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JavaFX }{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12450\'83\'41\u12503\'83\'76\u12522\'83\'8a\u12465\'83\'50\u12540\'81\'5b\u12471\'83\'56\u12519\'83\'87\u12531 -\'83\'93\u12434\'82\'f0\u25351\'8e\'77\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par -\par }{\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 2.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u20351\'8e\'67\u29992\'97\'70\u12398\'82\'cc\u-30159\'8b\'96\u-29954\'91\'f8\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u-30500\'95\'e2\u-29261\'91\'ab\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12398\'82\'cc\u12300\'81\'75}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Java }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12486\'83\'65\u12463 -\'83\'4e\u12494\'83\'6d\u12525\'83\'8d\u12472\'83\'57\u12540\'81\'5b\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u21046\'90\'a7\u32004\'96\'f1\u20107\'8e\'96\u-26619\'8d\'80\u12301\'81\'76\u12434\'82\'f0\u21547\'8a\'dc\u12416\'82\'de -\u12364\'82\'aa\u12381\'82\'bb\u12428\'82\'ea\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u26360\'8f\'91\u26465\'8f\'f0\u-26619\'8d\'80\u12395 -\'82\'c9\u22522\'8a\'ee\u12389\'82\'c3\u12356\'82\'a2\u12390\'82\'c4\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12399\'82\'cd\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12289\'81\'41\u28961\'96\'b3 -\u20767\'8f\'9e\u12391\'82\'c5\u12289\'81\'41\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12398\'82\'cc\u20316\'8d\'ec\u21205\'93\'ae\u12434\'82\'f0\u21807\'97\'42\u19968\'88\'ea\u12398\'82\'cc\u30446\'96\'da\u30340\'93\'49 -\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12289\'81\'41\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u23436\'8a\'ae\u20840\'91\'53\loch\af37\hich\af21\dbch\f37 \u12391\'82\'c5\u25913\'89\'fc -\u22793\'95\'cf\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u12414\'82\'dc\u12414\'82\'dc\u12289\'81\'41\u31038\'8e\'d0\u20869\'93\'e0\u12391\'82\'c5\u12398\'82\'cc\u12415\'82\'dd\u20877\'8d\'c4\u29983\'90\'b6\u12362\'82\'a8\u12424\'82\'e6 -\u12403\'82\'d1\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12383\'82\'bd\u12417\'82\'df\u12398\'82\'cc\u-26786\'94\'f1\u29420\'93\'c6\u21344\'90\'e8\u30340\'93\'49\u12391\'82\'c5\u-29838\'8f\'f7\u28193\'93\'6e\u19981\'95\'73\u-32515 -\'94\'5c\u12394\'82\'c8\u-27056\'8c\'c0\u23450\'92\'e8\u30340\'93\'49\u20351\'8e\'67\u29992\'97\'70\u27177\'8c\'a0\u12434\'82\'f0\u-30159\'8b\'96\u-29954\'91\'f8\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u-27253\'8a\'4a\u30330\'94\'ad -\u26989\'8b\'c6\u-32763\'8e\'d2\u12420\'82\'e2\u20986\'8f\'6f\u29256\'94\'c5\u26989\'8b\'c6\u-32763\'8e\'d2\u29992\'97\'70\u12398\'82\'cc\u-28675\'92\'c7\u21152\'89\'c1\u30340\'93\'49\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473 -\'83\'58\u12399\'82\'cd\u12289\'81\'41\u-30500\'95\'e2\u-29261\'91\'ab\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u12362\'82\'a8\u12356\'82\'a2\u12390\'82\'c4\u20184\'95\'74 -\u19982\'97\'5e\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 3.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u21046\'90\'a7\u-27056\'8c\'c0\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u12399\'82\'cd -\u31192\'94\'e9\u23494\'96\'a7\u24773\'8f\'ee\u22577\'95\'f1\u12364\'82\'aa\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12390\'82\'c4\u12362\'82\'a8\u12426\'82\'e8\u12289\'81\'41\u-31657\'92\'98\u20316\'8d\'ec\u27177\'8c\'a0\u12399\'82\'cd\u20445 -\'95\'db\u-29833\'8c\'ec\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc -\u27177\'8c\'a0\u-27056\'8c\'c0\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20184\'95\'74\u-26993\'90\'8f\u12377\'82\'b7\u12427\'82\'e9\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u12398\'82\'cc\u30693\'92\'6d\u30340\'93\'49\u-29535\'8d\'e0\u29987 -\'8e\'59\u27177\'8c\'a0\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12392\'82\'c6\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12469\'83\'54\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd -\u12399\'82\'cd\u12381\'82\'bb\u12398\'82\'cc\u12356\'82\'a2\u12378\'82\'b8\u12428\'82\'ea\u12363\'82\'a9\u12364\'82\'aa\u20445\'95\'db\u26377\'97\'4c\u12375\'82\'b5\u12390\'82\'c4\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u28310\'8f\'80 -\u25312\'8b\'92\u27861\'96\'40\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u12363\'82\'a9\u12363\'82\'a9\u12427\'82\'e9\u21046\'90\'a7\u-27056\'8c\'c0\u12364\'82\'aa\u31105\'8b\'d6\u12376\'82\'b6\u12425\'82\'e7\u12428\'82\'ea\u12390 -\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12434\'82\'f0\u-27036\'8f\'9c\u12365\'82\'ab\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0 -\u25913\'89\'fc\u22793\'95\'cf\u12289\'81\'41\u-28666\'8b\'74\u12467\'83\'52\u12531\'83\'93\u12497\'83\'70\u12452\'83\'43\u12523\'83\'8b\u12289\'81\'41\u12418\'82\'e0\u12375\'82\'b5\u12367\'82\'ad\u12399\'82\'cd\u12522\'83\'8a\u12496\'83\'6f\u12540 -\'81\'5b\u12473\'83\'58\u12456\'83\'47\u12531\'83\'93\u12472\'83\'57\u12491\'83\'6a\u12450\'83\'41\u12522\'83\'8a\u12531\'83\'93\u12464\'83\'4f\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u31105\'8b\'d6 -\loch\af37\hich\af21\dbch\f37 \u27490\'8e\'7e\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12471\'83\'56\u12399\'82\'cd\u12289\'81\'41 -\u20351\'8e\'67\u29992\'97\'70\u27177\'8c\'a0\u12398\'82\'cc\u20184\'95\'74\u19982\'97\'5e\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12364\'82\'aa\u12289\'81\'41 -\u26680\'8a\'6a\u26045\'8e\'7b\u-30163\'90\'dd\u12398\'82\'cc\u-30163\'90\'dd\u-30200\'8c\'76\u12289\'81\'41\u24314\'8c\'9a\u-30163\'90\'dd\u12289\'81\'41\u-28597\'89\'5e\u-28958\'93\'5d\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u20445\'95\'db\u23432 -\'8e\'e7\u12391\'82\'c5\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12424\'82\'e6\u12358\'82\'a4\u12395\'82\'c9\u-30163\'90\'dd\u-30200\'8c\'76\u12289\'81\'41\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58 -\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u24847\'88\'d3\u22259\'90\'7d\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u-30067\'94\'46\u-29864 -\'8e\'af\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 -Sun Microsystems, Inc. }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12399\'82\'cd\u12289\'81\'41\u12381\'82\'bb\u12398\'82\'cc\u12424\'82\'e6 -\u12358\'82\'a4\u12394\'82\'c8\u30446\'96\'da\u30340\'93\'49\u12398\'82\'cc\u-28567\'93\'4b\u21512\'8d\'87\u24615\'90\'ab\u12395\'82\'c9\u-27230\'8a\'d6\u12375\'82\'b5\u12390\'82\'c4\u12289\'81\'41\u26126\'96\'be\u31034\'8e\'a6\u12289\'81\'41\u-24871 -\'96\'d9\u31034\'8e\'a6\u12434\'82\'f0\u21839\'96\'e2\u12431\'82\'ed\u12378\'82\'b8\u12356\'82\'a2\u12363\'82\'a9\u12394\'82\'c8\u12427\'82\'e9\u20445\'95\'db\u-30148\'8f\'d8\u12418\'82\'e0\u-32268\'92\'76\u12375\'82\'b5\u12414\'82\'dc\u12379\'82\'b9 -\u12435\'82\'f1\u12290\'81\'42\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12391\'82\'c5\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12469 -\'83\'54\u12398\'82\'cc\u21830\'8f\'a4\u27161\'95\'57\u12289\'81\'41\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12510\'83\'7d\u12540\'81\'5b\u12463\'83\'4e\u12289\'81\'41\u12525\'83\'8d\u12468\'83\'53\u12414\'82\'dc\u12383\'82\'bd\u12399 -\'82\'cd\u21830\'8f\'a4\u21495\'8d\'86\u12398\'82\'cc\u27177\'8c\'a0\u21033\'97\'98\u12289\'81\'41\u27177\'8c\'a0\u-27056\'8c\'c0\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u21033\'97\'98\u30410\'89\'76\u12399\'82\'cd\u19968\'88\'ea -\u20999\'90\'d8\u19982\'97\'5e\u12360\'82\'a6\u12425\'82\'e7\u12428\'82\'ea\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42\u-27253\'8a\'4a\u30330\'94\'ad\u26989\'8b\'c6\u-32763\'8e\'d2\u12420\'82\'e2\u20986\'8f\'6f\u29256\'94\'c5\u26989 -\'8b\'c6\u-32763\'8e\'d2\u21521\'8c\'fc\u12369\'82\'af\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u12395\'82\'c9\u23550\'91\'ce\u12377\'82\'b7\u12427\'82\'e9\u-28675\'92\'c7\u21152\'89\'c1\u21046\'90\'a7\u-27056\'8c\'c0 -\u20107\'8e\'96\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u-30500\'95\'e2\u-29261\'91\'ab\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u12362\'82\'a8\u12356\'82\'a2\u12390 -\'82\'c4\u-30184\'8b\'4c\loch\af37\hich\af21\dbch\f37 \u-28688\'8f\'71\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 4.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u-27056\'8c\'c0\u23450\'92\'e8\u20445\'95\'db\u-30148\'8f\'d8\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12399\'82\'cd\u12289 -\'81\'41\u-26600\'97\'cc\u21454\'8e\'fb\u-30148\'8f\'d8\u12395\'82\'c9\u-30184\'8b\'4c\u20837\'93\'fc\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u-29444\'8d\'77\u20837\'93\'fc\u26085\'93\'fa\u12363\'82\'a9\u12425\'82\'e7}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 90 }{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26085\'93\'fa\u-27245\'8a\'d4\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454 -\'83\'45\u12455\'83\'46\u12450\'83\'41\u12364\'82\'aa\u27491\'90\'b3\u24120\'8f\'ed\u12395\'82\'c9\u20351\'8e\'67\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12395\'82\'c9\u-27056\'8c\'c0\u12426\'82\'e8 -\u12289\'81\'41\u-26600\'97\'cc\u21454\'8e\'fb\u26360\'8f\'91\u12398\'82\'cc\u20889\'8e\'ca\u12375\'82\'b5\u12434\'82\'f0\u-30148\'8f\'d8\u25312\'8b\'92\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501 -\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12364\'82\'aa\u20445\'95\'db\u23384\'91\'b6\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u23186\'94\'7d\u20307\'91\'cc}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u23384\'91\'b6\u22312\'8d\'dd\u12377\'82\'b7\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87}{\rtlch\fcs1 \af21\afs20 -\ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc -\u26448\'8d\'de\u-29462\'8e\'bf\u19978\'8f\'e3\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-30467\'90\'bb\u-28640\'91\'a2\u19978\'8f\'e3\u12398\'82\'cc\u29781\'e0\'ea\u30133\'e1\'72\u12364\'82\'aa\u12394\'82\'c8\u12356\'82\'a2\u12371\'82\'b1\u12392 -\'82\'c6\u12434\'82\'f0\u20445\'95\'db\u-30148\'8f\'d8\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u19978\'8f\'e3\u-30184\'8b\'4c\u12398\'82\'cc\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u-27036\'8f\'9c\u12356\'82\'a2\u12390\'82\'c4 -\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12399\'82\'cd\u12300\'81\'75\u29694\'8c\'bb\u29366\'8f\'f3\u12398\'82\'cc\u12414\'82\'dc\u12414\'82\'dc\u12301\'81\'76\u12391\'82\'c5 -\u25552\'92\'f1\u20379\'8b\'9f\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12371\'82\'b1\u12398\'82\'cc\u-27056\'8c\'c0\u23450\'92\'e8\u20445\'95\'db\u-30148\'8f\'d8\u12391\'82\'c5\u12399\'82\'cd\u12289\'81\'41\u12362 -\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u23550\'91\'ce\u12377\'82\'b7\u12427\'82\'e9\u20840\'91\'53\u-26782\'96\'ca\u30340\'93\'49\u12394\'82\'c8\u-30500\'95\'e2\u20767\'8f\'9e\u12392\'82\'c6}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u20840\'91\'53\u-29524\'90\'d3\u20219\'94\'43\u12399\'82\'cd\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501 -\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u-30467\'90\'bb\u21697\'95\'69\u12398\'82\'cc\u20132\'8c\'f0\u25563\'8a\'b7\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67 -\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12390\'82\'c4\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u25903\'8e\'78\u25173\'95\'a5\u12387\'82\'c1\u12383\'82\'bd\u20195\'91\'e3\u-28207 -\'8b\'e0\u12398\'82\'cc\u25173\'95\'a5\u12356\'82\'a2\u25147\'96\'df\u12375\'82\'b5\u12395\'82\'c9\u-27056\'8c\'c0\u12425\'82\'e7\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45 -\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u-27230\'8a\'d6\u12375\'82\'b5\u12390\'82\'c4\u21547\'8a\'dc\loch\af37\hich\af21\dbch\f37 \u24847\'88\'d3\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u20445\'95\'db\u-30148\'8f\'d8\u12399\'82\'cd\u12377 -\'82\'b7\u12409\'82\'d7\u12390\'82\'c4}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 90 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26085\'93\'fa\u-27245 -\'8a\'d4\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u24030\'8f\'42\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u12399\'82\'cd\u-24871\'96\'d9\u31034\'8e\'a6 -\u20445\'95\'db\u-30148\'8f\'d8\u26399\'8a\'fa\u-27245\'8a\'d4\u12408\'82\'d6\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12364\'82\'aa\u-30067\'94\'46\u21487\'89\'c2\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356 -\'82\'a2\u12383\'82\'bd\u12417\'82\'df\u12289\'81\'41\u19978\'8f\'e3\u-30184\'8b\'4c\u12399\'82\'cd\u-30094\'8a\'59\u24403\'93\'96\u12375\'82\'b5\u12394\'82\'c8\u12356\'82\'a2\u22580\'8f\'ea\u21512\'8d\'87\u12418\'82\'e0\u12354\'82\'a0\u12426\'82\'e8 -\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12371\'82\'b1\u12398\'82\'cc\u-27056\'8c\'c0\u23450\'92\'e8\u20445\'95\'db\u-30148\'8f\'d8\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u29305\'93\'c1\u23450 -\'92\'e8\u12398\'82\'cc\u27861\'96\'40\u30340\'93\'49\u27177\'8c\'a0\u21033\'97\'98\u12434\'82\'f0\u19982\'97\'5e\u12360\'82\'a6\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12391\'82\'c5\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096 -\'97\'6c\u12399\'82\'cd\u24030\'8f\'42\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u30064\'88\'d9\u12394\'82\'c8\u12427\'82\'e9\u20182\'91\'bc\u12398\'82\'cc\u27177\'8c\'a0\u21033\'97\'98\u12434\'82\'f0\u20445\'95\'db\u26377\'97\'4c\u12377 -\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12418\'82\'e0\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 5.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u20445\'95\'db\u-30148\'8f\'d8\u12398\'82\'cc\u21542\'94\'db\u-30067\'94\'46\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u26126\'96\'be\u-30184\'8b\'4c\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4 -\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u-27056\'8c\'c0\u12426\'82\'e8\u12289\'81\'41\u21830\'8f\'a4\u21697\'95\'69\u24615\'90\'ab\u12289\'81\'41\u29305\'93\'c1\u23450\'92\'e8\u30446\'96\'da\u30340\'93\'49\u12408\'82\'d6\u12398\'82\'cc\u-28567 -\'93\'4b\u21512\'8d\'87\u24615\'90\'ab\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u27177\'8c\'a0\u21033\'97\'98\u12398\'82\'cc\u-26786\'94\'f1\u20405\'90\'4e\u23475\'8a\'51\u24615\'90\'ab\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7 -\u12427\'82\'e9\u-24871\'96\'d9\u31034\'8e\'a6\u12398\'82\'cc\u20445\'95\'db\u-30148\'8f\'d8\u12434\'82\'f0\u21547\'8a\'dc\u12416\'82\'de\u12289\'81\'41\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u12398\'82\'cc\u26126\'96\'be\u31034\'8e\'a6\u30340 -\'93\'49\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-24871\'96\'d9\u31034\'8e\'a6\u30340\'93\'49\u12394\'82\'c8\u26465\'8f\'f0\u20214\'8c\'8f\u12289\'81\'41\u-30616\'95\'5c\u26126\'96\'be\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20445\'95\'db -\u-30148\'8f\'d8\u12434\'82\'f0\u21542\'94\'db\u-30067\'94\'46\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12383\'82\'bd\u12384\'82\'be\u12375\'82\'b5\u12289\'81\'41\u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u21542 -\'94\'db\u-30067\'94\'46\u12364\'82\'aa\u27861\'96\'40\u20196\'97\'df\u12391\'82\'c5\u-30067\'94\'46\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u22580\'8f\'ea\u21512\'8d\'87\u12399\'82\'cd -\u12371\'82\'b1\u12398\'82\'cc\u-27056\'8c\'c0\u12426\'82\'e8\u12391\'82\'c5\u12399\'82\'cd\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 6.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u-29524\'90\'d3\u20219\'94\'43\u12398\'82\'cc\u-27056\'8c\'c0\u24230\'93\'78\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12414\'82\'dc\u12383 -\'82\'bd\u12399\'82\'cd\u12381\'82\'bb\u12398\'82\'cc\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12469\'83\'54\u12399\'82\'cd\u12289\'81\'41\u12383\'82\'bd\u12392\'82\'c6\u12360\'82\'a6\u25613\'91\'b9\u23475\'8a\'51\u12398\'82\'cc\u21487 -\'89\'c2\u-32515\'94\'5c\u24615\'90\'ab\u12434\'82\'f0\u30693\'92\'6d\u12425\'82\'e7\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12383\'82\'bd\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12418\'82\'e0\u12289\'81\'41\u26412\'96\'7b -\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u20351\'8e\'67\u29992\'97\'70\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u20351\'8e\'67\u29992\'97\'70\u19981\'95\'73\u-32515\'94\'5c\u12434 -\'82\'f0\u21407\'8c\'b4\u22240\'88\'f6\u12392\'82\'c6\u12377\'82\'b7\u12427\'82\'e9\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12381\'82\'bb\u12428\'82\'ea\u12395\'82\'c9\u-27230\'8a\'d6\u-28637\'98\'41\u12377\'82\'b7\u12427\'82\'e9 -\u12289\'81\'41\u21454\'8e\'fb\u30410\'89\'76\u12289\'81\'41\u21033\'97\'98\u30410\'89\'76\u12289\'81\'41\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12398\'82\'cc\u21930\'91\'72\u22833\'8e\'b8\u12289\'81\'41\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc -\u19968\'88\'ea\u20999\'90\'d8\u12398\'82\'cc\u25613\'91\'b9\u23475\'8a\'51}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 -\ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u29305\'93\'c1 -\u21029\'95\'ca\u25613\'91\'b9\u23475\'8a\'51\u12289\'81\'41\u-27245\'8a\'d4\u25509\'90\'da\u25613\'91\'b9\u23475\'8a\'51\u12289\'81\'41\u20598\'8b\'f4\u30330\'94\'ad\u30340\'93\'49\u25613\'91\'b9\u23475\'8a\'51\u12289\'81\'41\u20184\'95\'74\u-26993 -\'90\'8f\u30340\'93\'49\u25613\'91\'b9\u23475\'8a\'51\u12289\'81\'41\u25074\'92\'a6\u32624\'94\'b1\u30340\'93\'49\u25613\'91\'b9\u23475\'8a\'51\u12434\'82\'f0\u21839\'96\'e2\u12356\'82\'a2\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1}{\rtlch\fcs1 -\af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 -\uc2\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12390\'82\'c4\u12289\'81\'41\u27861\'96\'40\u20196\'97\'df\u12364\'82\'aa\u-30067\'94\'46\u12417\'82\'df\u12427\'82\'e9\u31684\'94\'cd\u22258\'88\'cd\u12391\'82\'c5\u12289\'81\'41\u12381\'82\'bb\u12398 -\'82\'cc\u-29524\'90\'d3\u20219\'94\'43\u20869\'93\'e0\u23481\'97\'65\u12395\'82\'c9\u-27230\'8a\'d6\u12431\'82\'ed\u12425\'82\'e7\u12378\'82\'b8\u19968\'88\'ea\u20999\'90\'d8\u-29524\'90\'d3\u20219\'94\'43\u12434\'82\'f0\u-29536\'95\'89\u12356\'82\'a2 -\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u23450\'92\'e8\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12383\'82\'bd\u-30644\'8d\'73\u28858\'88\'d7\u12395\'82\'c9\u12424\'82\'e6\u12427 -\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12391\'82\'c5\u12354\'82\'a0\u12427\'82\'e9\u12363\'82\'a9\u12289\'81\'41\u23450\'92\'e8\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u-30644\'8d\'73 -\u28858\'88\'d7}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u-28594\'89\'df\u22833\'8e\'b8\u12434\'82\'f0\u21547\'8a\'dc\u12417 -\'82\'df\u12390\'82\'c4}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12391\'82\'c5\u12354\'82\'a0\u12427\'82\'e9\u12363\'82\'a9\u12395\'82\'c9\u-27230\'8a\'d6\u12431\'82\'ed\u12425\'82\'e7\u12378\'82\'b8\u12289 -\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u23550\'91\'ce\u12377\'82\'b7\u12427\'82\'e9}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u-29524\'90\'d3\u20219\'94\'43\u12399\'82\'cd\u12289\'81\'41\u12356\'82\'a2\u12363\'82\'a9\u12394\'82\'c8\u12427\'82\'e9 -\u22580\'8f\'ea\loch\af37\hich\af21\dbch\f37 \u21512\'8d\'87\u12418\'82\'e0\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u22522\'8a\'ee\u12389\'82\'c3\u12356\'82\'a2\u12390\'82\'c4\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa -\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12390\'82\'c4\u25903\'8e\'78\u25173\'95\'a5\u12387\'82\'c1\u12383\'82\'bd\u-28207\'8b\'e0\u-26547 -\'8a\'7a\u12434\'82\'f0\u-29307\'92\'b4\u12360\'82\'a6\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42\u19978\'8f\'e3\u-30184\'8b\'4c\u12398\'82\'cc -\u21046\'90\'a7\u-27056\'8c\'c0\u12399\'82\'cd\u12289\'81\'41\u21069\'91\'4f\u-28688\'8f\'71\u12398\'82\'cc\u20445\'95\'db\u-30148\'8f\'d8\u20869\'93\'e0\u23481\'97\'65\u12424\'82\'e6\u12426\'82\'e8\u12418\'82\'e0\u20778\'97\'44\u20808\'90\'e6\u12373 -\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u24030\'8f\'42\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u12399\'82\'cd\u20598\'8b\'f4\u30330 -\'94\'ad\u30340\'93\'49\u25613\'91\'b9\u23475\'8a\'51\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u20184\'95\'74\u-26993\'90\'8f\u30340\'93\'49\u25613\'91\'b9\u23475\'8a\'51\u12398\'82\'cc\u-27036\'8f\'9c\u22806\'8a\'4f\u12364\'82\'aa\u-30067\'94\'46 -\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u12383\'82\'bd\u12417\'82\'df\u12289\'81\'41\u19978\'8f\'e3\u-30184\'8b\'4c\u12399\'82\'cd\u-30094\'8a\'59\u24403\'93\'96\u12375\'82\'b5\u12394 -\'82\'c8\u12356\'82\'a2\u22580\'8f\'ea\u21512\'8d\'87\u12418\'82\'e0\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 7.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u32066\'8f\'49\u20102\'97\'b9\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12399\'82\'cd\u32066\'8f\'49\u20102\'97\'b9\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9 -\u12414\'82\'dc\u12391\'82\'c5\u26377\'97\'4c\u21177\'8c\'f8\u12391\'82\'c5\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45 -\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u29289\'95\'a8\u12434\'82\'f0\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u24259\'94\'70\u26820\'8a\'fc\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12395 -\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u12289\'81\'41\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12434\'82\'f0\u12356\'82\'a2\u12388\'82\'c2\u12391\'82\'c5\u12418\'82\'e0\u32066\'8f\'49\u20102\'97\'b9\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392 -\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12398\'82\'cc\u26465\'8f\'f0\u-26619\'8d\'80 -\u12395\'82\'c9\u24467\'8f\'5d\u12431\'82\'ed\u12394\'82\'c8\u12363\'82\'a9\u12387\'82\'c1\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12363\'82\'a9\u12425\'82\'e7\u-28646\'92\'ca\u30693\'92\'6d\u12373 -\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12394\'82\'c8\u12367\'82\'ad\u12289\'81\'41\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12399\'82\'cd\u12383\'82\'bd\u12384\'82\'be\u12385\'82\'bf\u12395\'82\'c9\u32066\'8f\'49\u20102 -\'97\'b9\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\loch\af37\hich\af21\dbch\f37 \u12455\'83\'46\u12450 -\'83\'41\u12364\'82\'aa\u20309\'89\'bd\u12425\'82\'e7\u12363\'82\'a9\u12398\'82\'cc\u30693\'92\'6d\u30340\'93\'49\u25152\'8f\'8a\u26377\'97\'4c\u27177\'8c\'a0\u20405\'90\'4e\u23475\'8a\'51\u12398\'82\'cc\u30003\'90\'5c\u12375\'82\'b5\u31435\'97\'a7\u12390 -\'82\'c4\u12398\'82\'cc\u23550\'91\'ce\u-29599\'8f\'db\u12392\'82\'c6\u12394\'82\'c8\u12387\'82\'c1\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12356\'82\'a2\u12378\'82\'b8\u12428\'82\'ea -\u12363\'82\'a9\u12398\'82\'cc\u24403\'93\'96\u20107\'8e\'96\u-32763\'8e\'d2\u12364\'82\'aa\u12363\'82\'a9\u12363\'82\'a9\u12427\'82\'e9\u23550\'91\'ce\u-29599\'8f\'db\u12392\'82\'c6\u12394\'82\'c8\u12427\'82\'e9\u21487\'89\'c2\u-32515\'94\'5c\u24615 -\'90\'ab\u12364\'82\'aa\u12354\'82\'a0\u12427\'82\'e9\u12392\'82\'c6\u21028\'94\'bb\u26029\'92\'66\u12375\'82\'b5\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u12356\'82\'a2\u12378\'82\'b8\u12428\'82\'ea\u12398\'82\'cc\u24403\'93\'96\u20107 -\'8e\'96\u-32763\'8e\'d2\u12418\'82\'e0\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12434\'82\'f0\u30452\'92\'bc\u12385\'82\'bf\u12395\'82\'c9\u32066\'8f\'49\u20102\'97\'b9\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa -\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u32066\'8f\'49\u20102\'97\'b9\u26178\'8e\'9e\u12395\'82\'c9\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12477\'83\'5c\u12501\'83\'74 -\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u-30457\'95\'a1\u-30467\'90\'bb\u29289\'95\'a8\u12434\'82\'f0\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u24259\'94\'70\u26820\'8a\'fc\u12375\'82\'b5\u12394\'82\'c8\u12369 -\'82\'af\u12428\'82\'ea\u12400\'82\'ce\u12394\'82\'c8\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 8.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u-28872\'97\'41\u20986\'8f\'6f\u-30321\'8b\'4b\u21046\'90\'a7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12391\'82\'c5\u25552\'92\'f1\u20379\'8b\'9f\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9 -\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u25216\'8b\'5a\u-30637\'8f\'70\u30340\'93\'49\u12487 -\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12399\'82\'cd\u12289\'81\'41\u31859\'95\'c4\u22269\'8d\'91\u-28872\'97\'41\u20986\'8f\'6f\u31649\'8a\'c7\u29702\'97\'9d\u27861\'96\'40\u12398\'82\'cc\u23550\'91\'ce\u-29599\'8f\'db\u12392\'82\'c6\u12394\'82\'c8 -\u12387\'82\'c1\u12390\'82\'c4\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12414\'82\'dc\u12383\'82\'bd\u12289\'81\'41\u20182\'91\'bc\u22269\'8d\'91\u12395\'82\'c9\u12362\'82\'a8\u12356\'82\'a2\u12390\'82\'c4\u12418\'82\'e0\u-28872 -\'97\'41\u20986\'8f\'6f\u20837\'93\'fc\u31649\'8a\'c7\u29702\'97\'9d\u27861\'96\'40\u-30321\'8b\'4b\u12398\'82\'cc\u23550\'91\'ce\u-29599\'8f\'db\u12392\'82\'c6\u12394\'82\'c8\u12387\'82\'c1\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u22580\'8f\'ea -\u21512\'8d\'87\u12364\'82\'aa\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u12377\'82\'b7 -\u12409\'82\'d7\u12390\'82\'c4\u12398\'82\'cc\u27861\'96\'40\u20196\'97\'df\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-30321\'8b\'4b\u21046\'90\'a7\u12434\'82\'f0\u21427\'8c\'b5\u23432\'8e\'e7\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392 -\'82\'c6\u12395\'82\'c9\u21516\'93\'af\u24847\'88\'d3\u12375\'82\'b5\u12289\'81\'41\u32013\'94\'5b\u21697\'95\'69\u24460\'8c\'e3\u12395\'82\'c9\u-28872\'97\'41\loch\af37\hich\af21\dbch\f37 \u20986\'8f\'6f\u12289\'81\'41\u20877\'8d\'c4\u-28872\'97\'41 -\u20986\'8f\'6f\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-28872\'97\'41\u20837\'93\'fc\u12398\'82\'cc\u-30159\'8b\'96\u21487\'89\'c2\u12364\'82\'aa\u24517\'95\'4b\u-30335\'97\'76\u12392\'82\'c6\u12394\'82\'c8\u12387\'82\'c1\u12383 -\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12395\'82\'c9\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u12434\'82\'f0\u21462\'8e\'e6\u24471\'93\'be\u12377\'82\'b7\u12427 -\'82\'e9\u-29524\'90\'d3\u20219\'94\'43\u12364\'82\'aa\u12354\'82\'a0\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 9.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u21830\'8f\'a4\u27161\'95\'57\u12392\'82\'c6\u12525\'83\'8d\u12468\'83\'53\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12364\'82\'aa}{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 SUN}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 SOLARIS}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{ -\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JAVA}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JINI}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 FORTE}{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 iPLANET }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u21830\'8f\'a4\u27161\'95\'57\u12392\'82\'c6\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 SUN}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{\rtlch\fcs1 -\af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 SOLARIS}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 -\uc2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JAVA}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 JINI}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 FORTE}{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 iPLANET }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u12354\'82\'a0\u12425\'82\'e7\u12422\'82\'e4\u12427\'82\'e9\u-27230\'8a\'d6\u-28637\'98\'41\u21830\'8f\'a4 -\u27161\'95\'57\u12289\'81\'41\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12510\'83\'7d\u12540\'81\'5b\u12463\'83\'4e\u12289\'81\'41\u12525\'83\'8d\u12468\'83\'53\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u12398\'82\'cc\u12502\'83\'75 -\u12521\'83\'89\u12531\'83\'93\u12489\'83\'68\u21517\'96\'bc}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u20197\'88\'c8\u19979\'89\'ba -\u12300\'81\'75}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12510\'83\'7d\u12540\'81\'5b\u12463\'83\'4e\u12301\'81\'76\u12392\'82\'c6\u12377\'82\'b7\u12427\'82\'e9}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u25152\'8f\'8a\u26377\'97\'4c\u-32763\'8e\'d2\u12391\'82\'c5\u12354\'82\'a0\u12427 -\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u-30067\'94\'46\u-29864\'8e\'af\u12375\'82\'b5\u12289\'81\'41\u21516\'93\'af\u24847\'88\'d3\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc -\u12377\'82\'b7\u12290\'81\'42\u12414\'82\'dc\u12383\'82\'bd\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41\u29694\'8c\'bb\u22312\'8d\'dd}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 http://www.sun.com\hich\af21\dbch\af37\loch\f21 /policies/trademarks }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 -\uc2\u12395\'82\'c9\u25522\'8c\'66\u-28919\'8d\'da\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun Trademark and Logo Usage Requirements (Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u21830\'8f\'a4\u27161\'95\'57\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12525\'83\'8d\u12468\'83\'53\u20351\'8e\'67\u29992\'97\'70 -\u-30335\'97\'76\u20214\'8c\'8f}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12395\'82\'c9\u24467\'8f\'5d\u12358\'82\'a4\u12371\'82\'b1\u12392\'82\'c6\u12395\'82\'c9\u21516\'93\'af\u24847\'88\'d3\u12375\'82\'b5 -\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12510\'83\'7d\u12540\'81\'5b\u12463\'83\'4e\u12398\'82\'cc\u12372\'82\'b2\u20351\'8e\'67\u29992\'97\'70\u12399\'82\'cd\u12289\'81\'41 -\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u21033 -\'97\'98\u30410\'89\'76\u12398\'82\'cc\u12383\'82\'bd\u12417\'82\'df\u12395\'82\'c9\u21177\'8c\'f8\u21147\'97\'cd\u12434\'82\'f0\u29983\'90\'b6\u12376\'82\'b6\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377 -\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 10.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12450\'83\'41\u12513\'83\'81\u12522\'83\'8a\u12459\'83\'4a\u21512\'8d\'87\u-30650\'8f\'4f\u22269\'8d\'91\u-28637\'98\'41\u-28506\'96\'4d -\u25919\'90\'ad\u24220\'95\'7b\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u27177\'8c\'a0\u21033\'97\'98\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12364\'82\'aa\u31859\'95\'c4 -\u22269\'8d\'91\u-28637\'98\'41\u-28506\'96\'4d\u25919\'90\'ad\u24220\'95\'7b\u12420\'82\'e2\u12381\'82\'bb\u12398\'82\'cc\u20195\'91\'e3\u29702\'97\'9d\u27231\'8b\'40\u-27230\'8a\'d6\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u31859\'95\'c4\u22269 -\'8d\'91\u-28637\'98\'41\u-28506\'96\'4d\u25919\'90\'ad\u24220\'95\'7b\u12392\'82\'c6\u30452\'92\'bc\u25509\'90\'da\u30340\'93\'49\u12354\'82\'a0\u12427\'82\'e9\u12356\'82\'a2\u12399\'82\'cd\u-27245\'8a\'d4\u25509\'90\'da\u30340\'93\'49\u12395\'82\'c9 -\u22865\'8c\'5f\u32004\'96\'f1\u12434\'82\'f0\u32080\'8c\'8b\u12435\'82\'f1\u12384\'82\'be\u27231\'8b\'40\u-27230\'8a\'d6\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u21462\'8e\'e6\u24471\'93\'be\u12373\'82\'b3\u12428\'82\'ea\u12383 -\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20184\'95\'74\u-26993\'90\'8f\u12377\'82\'b7\u12427\'82\'e9 -\u25991\'95\'b6\u26360\'8f\'91\u12395\'82\'c9\u23550\'91\'ce\u12377\'82\'b7\loch\af37\hich\af21\dbch\f37 \u12427\'82\'e9\u31859\'95\'c4\u22269\'8d\'91\u-28637\'98\'41\u-28506\'96\'4d\u25919\'90\'ad\u24220\'95\'7b\u12398\'82\'cc\u27177\'8c\'a0\u-27056 -\'8c\'c0\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 48 CFR 227.7201 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12394\'82\'c8\u12356\'82\'a2\u12375\'82\'b5}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 227.7202-4 (}{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u31859\'95\'c4\u22269\'8d\'91\u22269\'8d\'91\u-27086\'96\'68\u32207\'91\'8d\u30465\'8f\'c8\u12395\'82\'c9\u12424 -\'82\'e6\u12427\'82\'e9\u21462\'8e\'e6\u24471\'93\'be}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u20006\'95\'c0\u12403\'82\'d1\u12395\'82\'c9}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 48 CFR 2.101 }{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 12.212 (}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u31859\'95\'c4\u22269\'8d\'91\u22269\'8d\'91\u-27086\'96\'68\u32207\'91\'8d\u30465\'8f\'c8\u20197\'88\'c8\u22806\'8a\'4f\u12395 -\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u21462\'8e\'e6\u24471\'93\'be}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12395\'82\'c9\u24467\'8f\'5d\u12387\'82\'c1\u12390\'82\'c4\u12289\'81\'41\u12371\'82\'b1\u12398\'82\'cc\u22865\'8c\'5f\u32004\'96\'f1 -\u26360\'8f\'91\u12395\'82\'c9\u-30184\'8b\'4c\u-28919\'8d\'da\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u20869\'93\'e0\u23481\'97\'65\u12395\'82\'c9\u21046\'90\'a7\u-27056\'8c\'c0\u12373\'82\'b3\u12428\'82\'ea\u12414 -\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 11.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u28310\'8f\'80\u25312\'8b\'92\u27861\'96\'40\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12399\'82\'cd\u12289\'81\'41\u12459\'83\'4a\u12522\'83\'8a\u12501\'83\'74\u12457\'83\'48 -\u12523\'83\'8b\u12491\'83\'6a\u12450\'83\'41\u24030\'8f\'42\u27861\'96\'40\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12381\'82\'bb\u12428\'82\'ea\u12434\'82\'f0\u32113\'93\'9d\u25324\'8a\'87\u12375\'82\'b5\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9 -\u31859\'95\'c4\u22269\'8d\'91\u-28637\'98\'41\u-28506\'96\'4d\u27861\'96\'40\u12395\'82\'c9\u28310\'8f\'80\u25312\'8b\'92\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290 -\'81\'42\u31649\'8a\'c7\u-28860\'8a\'8d\u12420\'82\'e2\u28310\'8f\'80\u25312\'8b\'92\u27861\'96\'40\u12434\'82\'f0\u-28552\'91\'49\u25246\'91\'f0\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12391\'82\'c5\u12365\'82\'ab -\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 12.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u21487\'89\'c2\u20998\'95\'aa\u24615\'90\'ab\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12398\'82\'cc\u19968\'88\'ea\u-28440\'95\'94\u20998\'95\'aa\u12364\'82\'aa\u24375\'8b\'ad -\u21046\'90\'a7\u21147\'97\'cd\u12434\'82\'f0\u25345\'8e\'9d\u12383\'82\'bd\u12394\'82\'c8\u12356\'82\'a2\u12392\'82\'c6\u21028\'94\'bb\u26126\'96\'be\u12375\'82\'b5\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12391\'82\'c5\u12418\'82\'e0\u12289\'81\'41 -\u27531\'8e\'63\u12426\'82\'e8\u12398\'82\'cc\u-28440\'95\'94\u20998\'95\'aa\u12399\'82\'cd\u24341\'88\'f8\u12365\'82\'ab\u32154\'91\'b1\u12365\'82\'ab\u26377\'97\'4c\u21177\'8c\'f8\u12395\'82\'c9\u12394\'82\'c8\u12426\'82\'e8\u12414\'82\'dc\u12377 -\'82\'b7\u12290\'81\'42\loch\af37\hich\af21\dbch\f37 \u12383\'82\'bd\u12384\'82\'be\u12375\'82\'b5\u12289\'81\'41\u12381\'82\'bb\u12398\'82\'cc\u26465\'8f\'f0\u-26619\'8d\'80\u12434\'82\'f0\u-27036\'8f\'9c\u12367\'82\'ad\u12371\'82\'b1\u12392\'82\'c6 -\u12391\'82\'c5\u24403\'93\'96\u20107\'8e\'96\u-32763\'8e\'d2\u12398\'82\'cc\u30446\'96\'da\u30340\'93\'49\u12364\'82\'aa\u-28588\'92\'42\u25104\'90\'ac\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12367\'82\'ad\u12394\'82\'c8\u12427\'82\'e9\u22580 -\'8f\'ea\u21512\'8d\'87\u12399\'82\'cd\u12289\'81\'41\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12399\'82\'cd\u12383\'82\'bd\u12384\'82\'be\u12385\'82\'bf\u12395\'82\'c9\u32066\'8f\'49\u20102\'97\'b9\u12377\'82\'b7\u12427\'82\'e9\u12418\'82\'e0\u12398 -\'82\'cc\u12392\'82\'c6\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 13.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u23436\'8a\'ae\u20840\'91\'53\u24615\'90\'ab\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12399\'82\'cd\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12392\'82\'c6}{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12395\'82\'c9\u12362\'82\'a8\u12369\'82\'af\u12427\'82\'e9\u12289 -\'81\'41\u12381\'82\'bb\u12398\'82\'cc\u22865\'8c\'5f\u32004\'96\'f1\u20869\'93\'e0\u23481\'97\'65\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u23436\'8a\'ae\u20840\'91\'53\u12394\'82\'c8\u21512\'8d\'87\u24847\'88\'d3\u12391\'82\'c5 -\u12354\'82\'a0\u12426\'82\'e8\u12289\'81\'41\u20107\'8e\'96\u21069\'91\'4f\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u21516\'93\'af\u26178\'8e\'9e\u12395\'82\'c9\u12394\'82\'c8\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u21475\'8c\'fb\u-26579 -\'93\'aa\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u26360\'8f\'91\u-26782\'96\'ca\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u21332\'8b\'a6\u-29840\'8b\'63\u12289\'81\'41\u25552\'92\'f1\u26696\'88\'c4\u12289\'81\'41\u-30616\'95\'5c\u26126\'96\'be -\u12289\'81\'41\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20445\'95\'db\u-30148\'8f\'d8\u12424\'82\'e6\u12426\'82\'e8\u12418\'82\'e0\u20778\'97\'44\u20808\'90\'e6\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u12414 -\'82\'dc\u12383\'82\'bd\u12289\'81\'41\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u26399\'8a\'fa\u-27245\'8a\'d4\u20013\'92\'86\u12395\'82\'c9\u24403\'93\'96\u20107\'8e\'96\u-32763\'8e\'d2\u-27245\'8a\'d4\u12391\'82\'c5\u20132\'8c\'f0\u12431\'82\'ed -\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u12289\'81\'41\u22865\'8c\'5f\u32004\'96\'f1\u20869\'93\'e0\u23481\'97\'65\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u-30325\'8c\'a9\u31309\'90\'cf\u12426\'82\'e8\u12289\'81\'41\u27880 -\'92\'8d\u25991\'95\'b6\u12289\'81\'41\u25215\'8f\'b3\u-30067\'94\'46\u12289\'81\'41\u12381\'82\'bb\u12398\'82\'cc\u20182\'91\'bc\u19968\'88\'ea\u20999\'90\'d8\u12398\'82\'cc\u21332\'8b\'a6\u-29840\'8b\'63\u12392\'82\'c6\u12398\'82\'cc\u-27245\'8a\'d4 -\u12391\'82\'c5\u12289\'81\'41\u30683\'96\'b5\u30462\'8f\'82\u12420\'82\'e2\u-28675\'92\'c7\u21152\'89\'c1\u26465\'8f\'f0\u-26619\'8d\'80\u12364\'82\'aa\u12354\'82\'a0\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u26412\'96\'7b\u22865 -\'8c\'5f\u32004\'96\'f1\u12364\'82\'aa\u20778\'97\'44\u20808\'90\'e6\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12399\'82\'cd\u12289\'81\'41\u21508\'8a\'65\u24403\'93\'96\u20107 -\'8e\'96\u-32763\'8e\'d2\u12398\'82\'cc\u27177\'8c\'a0\u-27056\'8c\'c0\u12398\'82\'cc\u12354\'82\'a0\u12427\'82\'e9\u20195\'91\'e3\u-30616\'95\'5c\u-32763\'8e\'d2\u12364\'82\'aa\u32626\'8f\'90\u21517\'96\'bc\u12375\'82\'b5\u12383\'82\'bd\u26360\'8f\'91 -\u-26782\'96\'ca\u12395\'82\'c9\u12424\'82\'e6\u12387\'82\'c1\u12390\'82\'c4\u12398\'82\'cc\u12415\'82\'dd\u12289\'81\'41\u12381\'82\'bb\u12398\'82\'cc\loch\af37\hich\af21\dbch\f37 \u20869\'93\'e0\u23481\'97\'65\u12434\'82\'f0\u22793\'95\'cf\u26356 -\'8d\'58\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par -\par }\pard \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u-30500\'95\'e2\u-29261\'91\'ab\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473 -\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12371\'82\'b1\u12398\'82\'cc\u-30500\'95\'e2\u-29261\'91\'ab\u12521\'83\'89\u12452\'83\'43\u12475 -\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u12496\'83\'6f\u12452\'83\'43\u12490\'83\'69\u12522\'83\'8a\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u22865\'8c\'5f\u32004\'96\'f1\u26360\'8f\'91\u12395\'82\'c9\u-28675\'92\'c7\u21152\'89\'c1\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u20462 -\'8f\'43\u27491\'90\'b3\u12434\'82\'f0\u21152\'89\'c1\u12360\'82\'a6\u12427\'82\'e9\u12418\'82\'e0\u12398\'82\'cc\u12391\'82\'c5\u12377\'82\'b7\u12290\'81\'42\u12371\'82\'b1\u12398\'82\'cc\u-30500\'95\'e2\u-29261\'91\'ab\u26465\'8f\'f0\u-26619\'8d\'80 -\u12395\'82\'c9\u23450\'92\'e8\u32681\'8b\'60\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u22826\'91\'be\u25991\'95\'b6\u23383\'8e\'9a\u12398\'82\'cc\u29992\'97\'70\u-30050\'8c\'ea\u12399\'82\'cd\u12289 -\'81\'41\u22865\'8c\'5f\u32004\'96\'f1\u26360\'8f\'91\u12391\'82\'c5\u12398\'82\'cc\u23450\'92\'e8\u32681\'8b\'60\u12392\'82\'c6\u21516\'93\'af\u32681\'8b\'60\u12391\'82\'c5\u12377\'82\'b7\u12290\'81\'42\u12371\'82\'b1\u12398\'82\'cc\u-30500\'95\'e2 -\u-29261\'91\'ab\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41\u12496\'83\'6f\u12452\'83\'43\u12490\'83\'69\u12522\'83\'8a\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u22865\'8c\'5f\u32004\'96\'f1\u26360\'8f\'91\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454 -\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12427\'82\'e9\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u20869\'93\'e0\u12398\'82\'cc\u30683\'96\'b5\u30462\'8f\'82\u12377 -\'82\'b7\u12427\'82\'e9\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u30456\'91\'8a\u21453\'94\'bd\u12377\'82\'b7\u12427\'82\'e9\u26465\'8f\'f0\u-26619\'8d\'80\u12398\'82\'cc\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u12395\'82\'c9 -\u20778\'97\'44\u20808\'90\'e6\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 A.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u20869\'93\'e0\u-28440\'95\'94 -\u30340\'93\'49\u20351\'8e\'67\u29992\'97\'70\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-27253\'8a\'4a\u30330\'94\'ad\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473 -\'83\'58\u-30159\'8b\'96\u-29954\'91\'f8\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u-30500\'95\'e2\u-29261\'91\'ab -\u26465\'8f\'f0\u-26619\'8d\'80\u12398\'82\'cc}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Java }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12486\'83\'65\u12463 -\'83\'4e\u12494\'83\'6d\u12525\'83\'8d\u12472\'83\'57\u12540\'81\'5b\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u21046\'90\'a7\u32004\'96\'f1\u20107\'8e\'96\u-26619\'8d\'80\u12434\'82\'f0\u21547\'8a\'dc\u12416\'82\'de\u12364\'82\'aa -\u12381\'82\'bb\u12428\'82\'ea\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\loch\af37\hich\af21\dbch\f37 \u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12398\'82\'cc\u26465\'8f\'f0\u20214 -\'8c\'8f\u12392\'82\'c6\u12289\'81\'41\u21442\'8e\'51\u29031\'8f\'c6\u12377\'82\'b7\u12427\'82\'e9\u20107\'8e\'96\u12395\'82\'c9\u12424\'82\'e6\u12426\'82\'e8\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u21547\'8a\'dc\u12414\'82\'dc\u12428 -\'82\'ea\u12427\'82\'e9\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 README }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12501\'83\'74\u12449\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12395\'82\'c9\u-30184\'8b\'4c\u-28919\'8d\'da\u12398\'82\'cc\u21046\'90\'a7 -\u-27056\'8c\'c0\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20363\'97\'e1\u22806\'8a\'4f\u20107\'8e\'96\u-26619\'8d\'80\u12395\'82\'c9\u24467\'8f\'5d\u12356\'82\'a2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12399\'82\'cd\u12362 -\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12289\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512 -\'83\'80\u12398\'82\'cc\u-30163\'90\'dd\u-30200\'8c\'76\u12289\'81\'41\u-27253\'8a\'4a\u30330\'94\'ad\u12289\'81\'41\u12486\'83\'65\u12473\'83\'58\u12488\'83\'67\u12434\'82\'f0\u30446\'96\'da\u30340\'93\'49\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4 -\u12289\'81\'41\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u23436\'8a\'ae\u20840\'91\'53\u12394\'82\'c8\u12289\'81\'41\u12363\'82\'a9\u12388\'82\'c2\u25913\'89\'fc\u22793\'95\'cf\u12398\'82\'cc -\u21152\'89\'c1\u12360\'82\'a6\u12425\'82\'e7\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12394\'82\'c8\u12356\'82\'a2\u29366\'8f\'f3\u24907\'91\'d4\u12391\'82\'c5\u12289\'81\'41\u31038\'8e\'d0\u20869\'93\'e0\u12391\'82\'c5\u-30457\'95\'a1\u-30467 -\'90\'bb\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20351\'8e\'67\u29992\'97\'70\u12377\'82\'b7\u12427\'82\'e9\u12383\'82\'bd\u12417\'82\'df\u12398\'82\'cc\u12289\'81\'41\u-26786\'94\'f1\u29420\'93\'c6\u21344\'90\'e8\u30340\'93\'49\u12391\'82\'c5 -\u-29838\'8f\'f7\u28193\'93\'6e\u19981\'95\'73\u-32515\'94\'5c\u12394\'82\'c8\u12289\'81\'41\u21046\'90\'a7\u-27056\'8c\'c0\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u20351\'8e\'67\u29992\'97\'70\u27177\'8c\'a0\u12434\'82\'f0\u12289\'81\'41\u12521 -\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26009\'97\'bf\u12394\'82\'c8\u12375\'82\'b5\u12391\'82\'c5\u-30159\'8b\'96\u-29954\'91\'f8\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 B.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u-26606\'94\'d0\u24067\'95\'7a -\u-30159\'8b\'96\u21487\'89\'c2\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u-30500\'95\'e2\u-29261\'91\'ab\u26465 -\'8f\'f0\u-26619\'8d\'80\u12398\'82\'cc}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Java }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12486\'83\'65\u12463 -\'83\'4e\u12494\'83\'6d\u12525\'83\'8d\u12472\'83\'57\u12540\'81\'5b\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u21046\'90\'a7\u32004\'96\'f1\u20107\'8e\'96\u-26619\'8d\'80\u12392\'82\'c6\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67 -\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 README }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12501\'83\'74\u12449 -\'83\'40\u12452\'83\'43\u12523\'83\'8b\u12395\'82\'c9\u-30184\'8b\'4c\u-28919\'8d\'da\u12398\'82\'cc\u21046\'90\'a7\u-27056\'8c\'c0\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20363\'97\'e1\u22806\'8a\'4f\u20107\'8e\'96\u-26619\'8d\'80 -\loch\af37\hich\af21\dbch\f37 \u12434\'82\'f0\u21547\'8a\'dc\u12416\'82\'de}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 -\ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12383\'82\'bd -\u12384\'82\'be\u12375\'82\'b5\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u12395\'82\'c9\u-27056\'8c\'c0\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u26412\'96\'7b\u22865\'8c\'5f -\u32004\'96\'f1\u12398\'82\'cc\u26465\'8f\'f0\u20214\'8c\'8f\u12395\'82\'c9\u24467\'8f\'5d\u12356\'82\'a2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12399\'82\'cd\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12395\'82\'c9\u23550\'91\'ce\u12375\'82\'b5\u12289 -\'81\'41\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{ -\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (JavaFX Runtime }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12434\'82\'f0\u-27036\'8f\'9c\u12367\'82\'ad}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12434\'82\'f0\u31038\'8e\'d0\u20869\'93\'e0\u12391\'82\'c5\u-30457\'95\'a1\u-30467\'90\'bb\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1 -\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12289\'81\'41\u-26786\'94\'f1\u29420\'93\'c6\u21344\'90\'e8\u30340\'93\'49\u12391\'82\'c5\u-29838\'8f\'f7\u28193\'93\'6e\u19981\'95\'73\u-32515\'94\'5c\u12394\'82\'c8\u12289\'81\'41\u21046 -\'90\'a7\u-27056\'8c\'c0\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u20351\'8e\'67\u29992\'97\'70\u27177\'8c\'a0\u12434\'82\'f0\u12289\'81\'41\u20197\'88\'c8\u19979\'89\'ba\u12398\'82\'cc}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (i) }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12363\'82\'a9\u12425\'82\'e7}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (vii) }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12434\'82\'f0\u26465\'8f\'f0\u20214\'8c\'8f\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12521\'83\'89\u12452\'83\'43\u12475 -\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26009\'97\'bf\u12394\'82\'c8\u12375\'82\'b5\u12391\'82\'c5\u-30159\'8b\'96\u-29954\'91\'f8\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (i) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12501 -\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u23436\'8a\'ae\u20840\'91\'53\u12391\'82\'c5\u25913\'89\'fc\u22793\'95\'cf\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u12414\'82\'dc\u12414\'82\'dc\u12289 -\'81\'41\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12434\'82\'f0\u23455\'8e\'c0\u-30644\'8d\'73\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6 -\u12434\'82\'f0\u21807\'97\'42\u19968\'88\'ea\u12398\'82\'cc\u30446\'96\'da\u30340\'93\'49\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12414\'82\'dc\u12383\'82\'bd\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d -\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12398\'82\'cc\u19968\'88\'ea\u-28440\'95\'94\u12392\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u12496\'83\'6f\u12531\'83\'93\u12489\'83\'68\u12523\'83\'8b\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u29366 -\'8f\'f3\u24907\'91\'d4\u12391\'82\'c5\u12398\'82\'cc\u12415\'82\'dd\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 -(ii) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12364\'82\'aa -\u-28211\'8f\'64\u-30335\'97\'76\u12363\'82\'a9\u12388\'82\'c2\u20027\'8e\'e5\u-30335\'97\'76\u12394\'82\'c8\u27231\'8b\'40\u-32515\'94\'5c\u12434\'82\'f0\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450 -\'83\'41\u12395\'82\'c9\u19982\'97\'5e\u12360\'82\'a6\loch\af37\hich\af21\dbch\f37 \u12427\'82\'e9\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (iii) }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u12467\'83\'52\u12531 -\'83\'93\u12509\'83\'7c\u12540\'81\'5b\u12493\'83\'6c\u12531\'83\'93\u12488\'83\'67\u12434\'82\'f0\u21462\'8e\'e6\u12426\'82\'e8\u26367\'91\'d6\u12360\'82\'a6\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12434\'82\'f0\u30446\'96\'da\u30340\'93\'49\u12392 -\'82\'c6\u12375\'82\'b5\u12390\'82\'c4\u-28675\'92\'c7\u21152\'89\'c1\u30340\'93\'49\u12394\'82\'c8\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u-26606\'94\'d0\u24067\'95\'7a\u12375\'82\'b5 -\u12394\'82\'c8\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (iv) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12501 -\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u-30184\'8b\'4c\u-28919\'8d\'da\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u12356\'82\'a2\u12363\'82\'a9\u12394\'82\'c8\u12427\'82\'e9 -\u25152\'8f\'8a\u26377\'97\'4c\u27177\'8c\'a0\u-30616\'95\'5c\u31034\'8e\'a6\u12420\'82\'e2\u21578\'8d\'90\u30693\'92\'6d\u12418\'82\'e0\u-27036\'8f\'9c\u21435\'8b\'8e\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u22793\'95\'cf\u26356\'8d\'58\u12375 -\'82\'b5\u12394\'82\'c8\u12356\'82\'a2\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (v) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12362\'82\'a8\u23458 -\'8b\'71\u27096\'97\'6c\u12364\'82\'aa\u12289\'81\'41\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u21547\'8a\'dc\u12414\'82\'dc\u12428\'82\'ea\u12427\'82\'e9\u26465\'8f\'f0\u-26619\'8d\'80\u12392\'82\'c6\u19968\'88\'ea\u-29525\'8a\'d1 -\u12375\'82\'b5\u12383\'82\'bd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc\u21033\'97\'98\u30410\'89\'76\u12434\'82\'f0\u20445\'95\'db\u-29833\'8c\'ec\u12377\'82\'b7\u12427\'82\'e9\u12521\'83\'89 -\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u22865\'8c\'5f\u32004\'96\'f1\u12395\'82\'c9\u24467\'8f\'5d\u12387\'82\'c1\u12390\'82\'c4\u12398\'82\'cc\u12415\'82\'dd\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45 -\u12455\'83\'46\u12450\'83\'41\u12434\'82\'f0\u-26606\'94\'d0\u24067\'95\'7a\u12377\'82\'b7\u12427\'82\'e9\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (vi) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12300\'81\'75\u12503\'83\'76\u12525\'83\'8d\u12464\'83\'4f\u12521\'83\'89\u12512\'83\'80\u12301\'81\'76\u12362\'82\'a8\u12424\'82\'e6 -\u12403\'82\'d1\u12300\'81\'75\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12301\'81\'76\u12398\'82\'cc\u19968\'88\'ea\u-28440\'95\'94\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12377\'82\'b7\u12409 -\'82\'d7\u12390\'82\'c4\u12398\'82\'cc\u20351\'8e\'67\u29992\'97\'70\u12354\'82\'a0\u12427\'82\'e9\u12356\'82\'a2\u12399\'82\'cd\u-26606\'94\'d0\u24067\'95\'7a\u12395\'82\'c9\u-29321\'8b\'4e\u22240\'88\'f6\u12375\'82\'b5\u12383\'82\'bd\u31532\'91\'e6 -\u19977\'8e\'4f\u-32763\'8e\'d2\u12363\'82\'a9\u12425\'82\'e7\u12398\'82\'cc\u-30005\'90\'bf\u27714\'8b\'81\u12289\'81\'41\u-30156\'91\'69\u-30177\'8f\'d7\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u-30644\'8d\'73\u28858\'88\'d7\u12395\'82\'c9\u-27230 -\'8a\'d6\u-28637\'98\'41\u12375\'82\'b5\u12390\'82\'c4\u29983\'90\'b6\u12376\'82\'b6\u12427\'82\'e9\u12356\'82\'a2\u12363\'82\'a9\u12394\'82\'c8\u12427\'82\'e9\u25613\'91\'b9\u23475\'8a\'51\u12289\'81\'41\u-29509\'94\'ef\u29992\'97\'70\u12289\'81\'41 -\u-29524\'90\'d3\u20219\'94\'43\u12289\'81\'41\u21644\'98\'61\u-30237\'89\'f0\u-28207\'8b\'e0\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u20986\'8f\'6f\u-29509\'94\'ef}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 (}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u24321\'95\'d9\u-29833\'8c\'ec\u22763\'8e\'6d\u-29509\'94\'ef\u29992\'97\'70\u12434\'82\'f0\u21547\'8a\'dc\u12416\'82\'de}{ -\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12363\'82\'a9\u12425\'82\'e7\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12392\'82\'c6\u12381\'82\'bb\u12398\'82\'cc\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12469\'83\'54\u12434\'82\'f0 -\u-27086\'96\'68\u31142\'8b\'9a\u12375\'82\'b5\u12289\'81\'41\u-30500\'95\'e2\u20767\'8f\'9e\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12395\'82\'c9\u21516\'93\'af\u24847\'88\'d3\u12377\'82\'b7\u12427\'82\'e9\u12290\'81\'42}{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 C.\tab Java}{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12486\'83\'65\u12463\'83\'4e\u12494\'83\'6d\u12525\'83\'8d\u12472\'83\'57\u12540\'81\'5b\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7 -\u12427\'82\'e9\u21046\'90\'a7\u32004\'96\'f1\u20107\'8e\'96\u-26619\'8d\'80\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12362 -\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12364\'82\'aa\u21629\'96\'bd\u21517\'96\'bc\u-30321\'8b\'4b\u32004\'96\'f1\u12391\'82\'c5\u29305\'93\'c1\u23450\'92\'e8\u12375\'82\'b5 -\u12383\'82\'bd}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 java}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 javax}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12289\'81\'41}{ -\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u21516\'93\'af\u27096\'97\'6c\u12395\'82\'c9\u-30321\'8b\'4b\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12383\'82\'bd\u21517\'96\'bc\u31216\'8f\'cc\u12392\'82\'c6\u12375 -\'82\'b5\u12390\'82\'c4\u12394\'82\'c8\u12435\'82\'f1\u12425\'82\'e7\u12363\'82\'a9\u12398\'82\'cc\u26041\'95\'fb\u27861\'96\'40\u12391\'82\'c5\u30906\'8a\'6d\u-30067\'94\'46\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u12463\'83\'4e\u12521\'83\'89 -\u12473\'83\'58\u12289\'81\'41\u12452\'83\'43\u12531\'83\'93\u12479\'83\'5e\u12501\'83\'74\u12455\'83\'46\u12540\'81\'5b\u12473\'83\'58\u12289\'81\'41\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12469\'83\'54\u12502\'83\'75\u12497\'83\'70\u12483\'83\'62 -\u12465\'83\'50\u12540\'81\'5b\u12472\'83\'57\u12398\'82\'cc\u21453\'94\'bd\u24540\'89\'9e\u12434\'82\'f0\u12362\'82\'a8\u23458\'8b\'71\u27096\'97\'6c\u-32278\'8e\'a9\u-29013\'90\'67\u12364\'82\'aa\u21109\'91\'6e\u25104\'90\'ac\u12289\'81\'41\u25913 -\'89\'fc\u22793\'95\'cf\u12418\'82\'e0\u12375\'82\'b5\u12367\'82\'ad\u12399\'82\'cd\u22793\'95\'cf\u26356\'8d\'58\u12375\'82\'b5\u12383\'82\'bd\u12426\'82\'e8\u12289\'81\'41\u20182\'91\'bc\u-32763\'8e\'d2\u12395\'82\'c9\u12371\'82\'b1\u12398\'82\'cc -\u21453\'94\'bd\u24540\'89\'9e\u12434\'82\'f0\u21109\'91\'6e\u25104\'90\'ac\u12289\'81\'41\u25913\'89\'fc\u22793\'95\'cf\u12418\'82\'e0\u12375\'82\'b5\u12367\'82\'ad\u12399\'82\'cd\u22793\'95\'cf\u26356\'8d\'58\u12373\'82\'b3\u12379\'82\'b9\u12383\'82\'bd -\u12426\'82\'e8\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 D.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12540\'81\'5b\u12473\'83\'58\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12399\'82\'cd\u12289\'81\'41\u20182 -\'91\'bc\u12398\'82\'cc\u30446\'96\'da\u30340\'93\'49\u12398\'82\'cc\u12383\'82\'bd\u12417\'82\'df\u12395\'82\'c9\u20351\'8e\'67\u29992\'97\'70\u27177\'8c\'a0\u12364\'82\'aa\u26126\'96\'be\u30906\'8a\'6d\u12395\'82\'c9\u20184\'95\'74\u19982\'97\'5e\u12373 -\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u-27056\'8c\'c0\u12426\'82\'e8\u12289\'81\'41\loch\af37\hich\af21\dbch\f37 \u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12398\'82\'cc\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u24467\'8f\'5d -\u12387\'82\'c1\u12390\'82\'c4\u21442\'8e\'51\u29031\'8f\'c6\u30446\'96\'da\u30340\'93\'49\u12398\'82\'cc\u12383\'82\'bd\u12417\'82\'df\u12384\'82\'be\u12369\'82\'af\u12395\'82\'c9\u25552\'92\'f1\u20379\'8b\'9f\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9 -\u12477\'83\'5c\u12540\'81\'5b\u12473\'83\'58\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12434\'82\'f0\u21547\'8a\'dc\u12435\'82\'f1\u12391\'82\'c5\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1 -\u12391\'82\'c5\u26126\'96\'be\u30906\'8a\'6d\u12395\'82\'c9\u-30321\'8b\'4b\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12394\'82\'c8\u12356\'82\'a2\u-27056\'8c\'c0\u12426\'82\'e8\u12289\'81\'41\u12477\'83\'5c\u12540\'81\'5b\u12473\'83\'58\u12467 -\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12398\'82\'cc\u20877\'8d\'c4\u-26606\'94\'d0\u24067\'95\'7a\u12399\'82\'cd\u-30159\'8b\'96\u21487\'89\'c2\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 -\af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \ab\af21\afs20 \ltrch\fcs0 \b\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 E.\tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 -\b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc\u19968\'88\'ea\u-28440 -\'95\'94\u12395\'82\'c9\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12427\'82\'e9\u-28675\'92\'c7\u21152\'89\'c1\u30340\'93\'49\u12394\'82\'c8\u-31657\'92\'98\u20316\'8d\'ec\u27177\'8c\'a0\u21578\'8d\'90\u30693\'92\'6d\u12362\'82\'a8 -\u12424\'82\'e6\u12403\'82\'d1\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12399\'82\'cd\u12289\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 THIRDPARTYLICENSEREADME.txt }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12501\'83\'74\u12449\'83\'40\u12452 -\'83\'43\u12523\'83\'8b\u12395\'82\'c9\u-30321\'8b\'4b\u23450\'92\'e8\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 THIRDPARTYLICENSEREADME.txt }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12501\'83\'74\u12449\'83\'40\u12452 -\'83\'43\u12523\'83\'8b\u12395\'82\'c9\u26126\'96\'be\u-30184\'8b\'4c\u12373\'82\'b3\u12428\'82\'ea\u12390\'82\'c4\u12356\'82\'a2\u12427\'82\'e9\u12354\'82\'a0\u12425\'82\'e7\u12422\'82\'e4\u12427\'82\'e9\u31532\'91\'e6\u19977\'8e\'4f\u-32763\'8e\'d2 -\u12458\'83\'49\u12540\'81\'5b\u12503\'83\'76\u12531\'83\'93\u12477\'83\'5c\u12540\'81\'5b\u12473\'83\'58}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 /}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12501\'83\'74\u12522\'83\'8a\u12540\'81\'5b\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u26465\'8f\'f0\u-26619\'8d\'80\u12395\'82\'c9\u21152\'89\'c1\u12360\'82\'a6\u12390\'82\'c4\u12289\'81\'41\u12496\'83\'6f\u12452\'83\'43\u12490 -\'83\'69\u12522\'83\'8a\u12467\'83\'52\u12540\'81\'5b\u12489\'83\'68}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12521\'83\'89\u12452\'83\'43\u12475\'83\'5a\u12531\'83\'93\u12473\'83\'58\u22865\'8c\'5f\u32004\'96\'f1\u12398\'82\'cc\u31532 -\'91\'e6}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 5 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u31532\'91\'e6}{ -\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 6 }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u-26619\'8d\'80\u12395\'82\'c9\u-30184\'8b\'4c\u-28919\'8d\'da\u12398 -\'82\'cc\u12300\'81\'75\u20445\'95\'db\u-30148\'8f\'d8\u12398\'82\'cc\u21542\'94\'db\u-30067\'94\'46\u12301\'81\'76\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u12300\'81\'75\u-29524\'90\'d3\u20219\'94\'43\u12398\'82\'cc\u-27056\'8c\'c0\u24230\'93\'78 -\u12301\'81\'76\u26465\'8f\'f0\u-26619\'8d\'80\u12364\'82\'aa\u12371\'82\'b1\u12398\'82\'cc\u-26606\'94\'d0\u24067\'95\'7a\u12398\'82\'cc\u12377\'82\'b7\u12409\'82\'d7\u12390\'82\'c4\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454 -\'83\'45\u12455\'83\'46\u12450\'83\'41\u12395\'82\'c9\u-28567\'93\'4b\u29992\'97\'70\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par -\par }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 F.}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 \tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u27177\'8c\'a0\u21033\'97\'98\u20405\'90\'4e\u23475\'8a\'51 -\u12395\'82\'c9\u12424\'82\'e6\u12427\'82\'e9\u22865\'8c\'5f\u32004\'96\'f1\u-30237\'89\'f0\u-27036\'8f\'9c}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\loch\af37\hich\af21\dbch\f37 \uc2\u12290\'81\'42\u12356\'82\'a2\u12378\'82\'b8\u12428\'82\'ea\u12363\'82\'a9\u12398\'82\'cc\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12364\'82\'aa\u12394\'82\'c8\u12435 -\'82\'f1\u12425\'82\'e7\u12363\'82\'a9\u12398\'82\'cc\u30693\'92\'6d\u30340\'93\'49\u-29535\'8d\'e0\u29987\'8e\'59\u27177\'8c\'a0\u12434\'82\'f0\u20405\'90\'4e\u23475\'8a\'51\u12375\'82\'b5\u12383\'82\'bd\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41 -\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12381\'82\'bb\u12428\'82\'ea\u12364\'82\'aa\u30097\'8b\'5e\u12431\'82\'ed\u12428\'82\'ea\u12427\'82\'e9\u22580\'8f\'ea\u21512\'8d\'87\u12289\'81\'41\u12356\'82\'a2\u12378\'82\'b8\u12428\'82\'ea\u12363\'82\'a9 -\u12398\'82\'cc\u24403\'93\'96\u20107\'8e\'96\u-32763\'8e\'d2\u12399\'82\'cd\u26412\'96\'7b\u22865\'8c\'5f\u32004\'96\'f1\u12434\'82\'f0\u21363\'91\'a6\u26178\'8e\'9e\u32066\'8f\'49\u32080\'8c\'8b\u12377\'82\'b7\u12427\'82\'e9\u12371\'82\'b1\u12392 -\'82\'c6\u12364\'82\'aa\u12391\'82\'c5\u12365\'82\'ab\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par -\par }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 G.}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 -\hich\af21\dbch\af37\loch\f21 \tab }{\rtlch\fcs1 \ab\af37\afs20 \ltrch\fcs0 \b\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12452\'83\'43\u12531\'83\'93\u12473\'83\'58\u12488\'83\'67 -\u12540\'81\'5b\u12523\'83\'8b\u12362\'82\'a8\u12424\'82\'e6\u12403\'82\'d1\u-32278\'8e\'a9\u21205\'93\'ae\u12450\'83\'41\u12483\'83\'62\u12503\'83\'76\u12487\'83\'66\u12540\'81\'5b\u12488\'83\'67}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12290\'81\'42\u26412\'96\'7b\u12477\'83\'5c\u12501\'83\'74\u12488\'83\'67\u12454\'83\'45\u12455\'83\'46\u12450\'83\'41\u12398\'82\'cc -\u12452\'83\'43\u12531\'83\'93\u12473\'83\'58\u12488\'83\'67\u12540\'81\'5b\u12523\'83\'8b\u12392\'82\'c6\u-32278\'8e\'a9\u21205\'93\'ae\u12450\'83\'41\u12483\'83\'62\u12503\'83\'76\u12487\'83\'66\u12540\'81\'5b\u12488\'83\'67\u12503\'83\'76\u12525 -\'83\'8d\u12475\'83\'5a\u12473\'83\'58\u12395\'82\'c9\u-26981\'8d\'db\u12375\'82\'b5\u12390\'82\'c4\u12399\'82\'cd\u12289\'81\'41\u12381\'82\'bb\u12428\'82\'ea\u12425\'82\'e7\u29305\'93\'c1\u23450\'92\'e8\u12398\'82\'cc\u12503\'83\'76\u12525\'83\'8d -\u12475\'83\'5a\u12473\'83\'58\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u19968\'88\'ea\u23450\'92\'e8\u12398\'82\'cc\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12364\'82\'aa}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \hich\af21\dbch\af37\loch\f37 }{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun (}{\rtlch\fcs1 \af37\afs20 -\ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12414\'82\'dc\u12383\'82\'bd\u12399\'82\'cd\u12469\'83\'54\u12540\'81\'5b\u12499\'83\'72\u12473\'83\'58\u12503\'83\'76\u12525 -\'83\'8d\u12496\'83\'6f\u12452\'83\'43\u12480\'83\'5f}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 ) }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12395\'82\'c9\u-28958\'93\'5d\u-28671\'91\'97\u12373\'82\'b3\u12428\'82\'ea\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 -\af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 -\uc2\u12399\'82\'cd\loch\af37\hich\af21\dbch\f37 \u12371\'82\'b1\u12428\'82\'ea\u12425\'82\'e7\u12398\'82\'cc\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12434\'82\'f0\u12503\'83\'76\u12525\'83\'8d\u12475\'83\'5a\u12473\'83\'58\u12398\'82\'cc\u25226 -\'94\'63\u25569\'88\'ac\u12392\'82\'c6\u26368\'8d\'c5\u-28567\'93\'4b\u21270\'89\'bb\u12395\'82\'c9\u21033\'97\'98\u29992\'97\'70\u12375\'82\'b5\u12414\'82\'dc\u12377\'82\'b7\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 -\fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12399\'82\'cd\u12371 -\'82\'b1\u12358\'82\'a4\u12375\'82\'b5\u12390\'82\'c4\u-26938\'8f\'57\u12417\'82\'df\u12425\'82\'e7\u12428\'82\'ea\u12383\'82\'bd\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u12434\'82\'f0\u20491\'8c\'c2\u20154\'90\'6c\u24773\'8f\'ee\u22577\'95\'f1 -\u12395\'82\'c9\u32080\'8c\'8b\u12403\'82\'d1\u12388\'82\'c2\u12369\'82\'af\u12427\'82\'e9\u12371\'82\'b1\u12392\'82\'c6\u12399\'82\'cd\u12354\'82\'a0\u12426\'82\'e8\u12414\'82\'dc\u12379\'82\'b9\u12435\'82\'f1\u12290\'81\'42}{\rtlch\fcs1 \af21\afs20 -\ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 Sun }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12398\'82\'cc -\u12487\'83\'66\u12540\'81\'5b\u12479\'83\'5e\u21454\'8e\'fb\u-26938\'8f\'57\u12395\'82\'c9\u-27230\'8a\'d6\u12377\'82\'b7\u12427\'82\'e9\u-30093\'8f\'da\u32048\'8d\'d7\u12395\'82\'c9\u12388\'82\'c2\u12356\'82\'a2\u12390\'82\'c4\u12399\'82\'cd\u12289 -\'81\'41}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 http://java.com/data/ }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12434\'82\'f0\u21442\'8e\'51\u29031\'8f\'c6\u12375\'82\'b5\u12390\'82\'c4\u12367\'82\'ad\u12384\'82\'be\u12373\'82\'b3\u12356\'82\'a2 -\u12290\'81\'42}{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 \fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 \loch\af37\hich\af21\dbch\f37 \uc2\u12362\'82\'a8\u21839\'96\'e2\u12356\'82\'a2\u21512\'8d\'87\u12431\'82\'ed\u12379\'82\'b9\u20808 -\'90\'e6}{\rtlch\fcs1 \af21\afs20 \ltrch\fcs0 \fs20\kerning0\dbch\af37\insrsid6425320 \hich\af21\dbch\af37\loch\f21 : Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. }{\rtlch\fcs1 \af37\afs20 \ltrch\fcs0 -\fs20\lang1041\langfe1041\kerning0\loch\af37\dbch\af37\langnp1041\insrsid6425320 -\par }} diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_ko.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_ko.rtf deleted file mode 100644 index ddbb797..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_ko.rtf +++ /dev/null @@ -1,57 +0,0 @@ -{\rtf1\ansi\ansicpg1252\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\froman\fprq2\fcharset129 Batang;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fmodern\fprq6\fcharset136 PMingLiU;}} -{\colortbl ;\red0\green0\blue0;} -{\*\generator Msftedit 5.41.15.1515;}{\info{\horzdoc}{\*\lchars $(?]\'7d\'b0\'92\'94\'bb?}} -\viewkind4\uc1\pard\nowidctlpar\qc\lang1042\f0\fs20 Sun Microsystems, Inc.\par -\'c0\'cc\'c1\'f8 \'c4\'da\'b5\'e5 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'b0\'e8\'be\'e0\par -\par -JAVA SE RUNTIME ENVIRONMENT(JRE) VERSION 6 \'b9\'d7 JAVAFX RUNTIME VERSION 1\par -\pard\nowidctlpar\qj\lang1033\f1\par -\lang1042\f0 SUN MICROSYSTEMS, INC.(\'c0\'cc\'c7\'cf "Sun")\'b4\'c2 \'b1\'cd\'c7\'cf\'b0\'a1 \'ba\'bb \'c0\'cc\'c1\'f8 \'c4\'da\'b5\'e5 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'b0\'e8\'be\'e0\'bc\'ad \'b9\'d7 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7(\'c3\'d1\'c4\'aa\'c7\'cf\'bf\'a9 "\'ba\'bb \'b0\'e8\'be\'e0")\'bf\'a1 \'c6\'f7\'c7\'d4\'b5\'c8 \'b8\'f0\'b5\'e7 \'c1\'b6\'b0\'c7\'b5\'e9\'c0\'bb \'bd\'c2\'b3\'ab\'c7\'cf\'b4\'c2 \'c1\'b6\'b0\'c7 \'c7\'cf\'bf\'a1\'bc\'ad\'b8\'b8 \'be\'c6\'b7\'a1\'bf\'a1\'bc\'ad \'c6\'af\'c1\'a4\'b5\'c8 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\'bf\'a1 \'b4\'eb\'c7\'d1 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b8\'a6 \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'ba\'ce\'bf\'a9\'c7\'cf\'b0\'ed\'c0\'da \'c7\'d5\'b4\'cf\'b4\'d9. \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\'b8\'a6 \'bb\'e7\'bf\'eb\'c7\'cf\'b8\'e9 \'b1\'cd\'c7\'cf\'b0\'a1 \'ba\'bb \'c1\'b6\'c7\'d7\'c0\'bb \'c0\'d0\'b0\'ed \'c0\'cc\'bf\'a1 \'b5\'bf\'c0\'c7\'c7\'cf\'b4\'c2 \'b0\'cd\'c0\'b8\'b7\'ce \'b0\'a3\'c1\'d6\'b5\'cb\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'b0\'a1 \'c8\'b8\'bb\'e7 \'b6\'c7\'b4\'c2 \'b1\'e2\'c5\'b8 \'b4\'dc\'c3\'bc \'b4\'eb\'bd\'c5 \'ba\'bb \'c1\'b6\'c7\'d7\'bf\'a1 \'b5\'bf\'c0\'c7\'c7\'d2 \'b0\'e6\'bf\'ec \'c7\'d8\'b4\'e7 \'b4\'dc\'c3\'bc\'b0\'a1 \'ba\'bb \'c1\'b6\'c7\'d7\'c0\'bb \'c1\'d8\'bc\'f6\'c7\'cf\'b5\'b5\'b7\'cf \'b0\'ad\'c1\'a6\'c7\'d2 \'bc\'f6 \'c0\'d6\'b4\'c2 \'b9\'fd\'c0\'fb \'b1\'c7\'c7\'d1\'c0\'cc \'c0\'d6\'be\'ee\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9. \'c0\'cc\'b7\'af\'c7\'d1 \'b1\'c7\'c7\'d1\'c0\'cc \'be\'f8\'b0\'c5\'b3\'aa \'ba\'bb \'c1\'b6\'c7\'d7\'c0\'cc \'c0\'fb\'bf\'eb\'b5\'c7\'b4\'c2 \'b0\'cd\'c0\'bb \'bf\'f8\'c7\'cf\'c1\'f6 \'be\'ca\'c0\'bb \'b0\'e6\'bf\'ec\'bf\'a1\'b4\'c2 \'c0\'cc \'bb\'e7\'c0\'cc\'c6\'ae\'c0\'c7 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee \'b6\'c7\'b4\'c2 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\'b0\'a1 \'c6\'f7\'c7\'d4\'b5\'c8 \'b1\'e2\'c5\'b8 \'b9\'cc\'b5\'f0\'be\'ee\'b8\'a6 \'bb\'e7\'bf\'eb\'c7\'cf\'c1\'f6 \'be\'ca\'be\'c6\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9.\lang1033\f1\par -\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 1.\tab\'c1\'a4\'c0\'c7\b0 . "\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee"\'b6\'f3 \'c7\'d4\'c0\'ba \'c0\'a7\'bf\'a1 \'c7\'a5\'bd\'c3\'b5\'c8 \'c0\'cc\'c1\'f8 \'c7\'fc\'c5\'c2(binary form)\'c0\'c7 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee, \'b1\'e2\'b0\'e8\'c6\'c7\'b5\'b6 \'b0\'a1\'b4\'c9\'c7\'d1 \'bf\'a9\'c5\'b8 \'b8\'f0\'b5\'e7 \'c0\'da\'b7\'e1(\'b6\'f3\'c0\'cc\'ba\'ea\'b7\'af\'b8\'ae, \'bc\'d2\'bd\'ba \'c6\'c4\'c0\'cf, \'c7\'ec\'b4\'f5 \'c6\'c4\'c0\'cf \'b9\'d7 \'b5\'a5\'c0\'cc\'c5\'cd \'c6\'c4\'c0\'cf\'c0\'bb \'c6\'f7\'c7\'d4\'c7\'cf\'b3\'aa \'c0\'cc\'bf\'a1 \'b1\'b9\'c7\'d1\'b5\'c7\'c1\'f6\'b4\'c2 \'be\'ca\'c0\'bd), 'Sun'\'c0\'cc \'c1\'a6\'b0\'f8\'c7\'cf\'b4\'c2 \'b8\'f0\'b5\'e7 \'be\'f7\'b5\'a5\'c0\'cc\'c6\'ae(update) \'b6\'c7\'b4\'c2 \'bf\'c0\'b7\'f9 \'bc\'f6\'c1\'a4(error correction), \'b1\'d7\'b8\'ae\'b0\'ed "\'ba\'bb \'b0\'e8\'be\'e0"\'bf\'a1 \'b5\'fb\'b6\'f3 'Sun'\'c0\'cc \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'c1\'a6\'b0\'f8\'c7\'cf\'b4\'c2 \'bb\'e7\'bf\'eb\'c0\'da \'b8\'c5\'b4\'ba\'be\'f3, \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a1\'b9\'d6 \'b0\'a1\'c0\'cc\'b5\'e5 \'b9\'d7 \'b1\'e2\'c5\'b8 \'bc\'ad\'b7\'f9(documentation)\'b5\'e9\'c0\'bb \'c0\'c7\'b9\'cc\'c7\'d5\'b4\'cf\'b4\'d9. "\'c0\'cf\'b9\'dd \'b5\'a5\'bd\'ba\'c5\'a9\'c5\'be \'c4\'c4\'c7\'bb\'c5\'cd \'b9\'d7 \'bc\'ad\'b9\'f6"\'b6\'f3 \'c7\'d4\'c0\'ba \'c3\'d6\'c1\'be \'bb\'e7\'bf\'eb\'c0\'da\'c0\'c7 \'c5\'eb\'c1\'a6 \'c7\'cf\'bf\'a1 \'c0\'cf\'b9\'dd\'c0\'fb\'c0\'ce \'c4\'c4\'c7\'bb\'c6\'c3 \'b1\'e2\'b4\'c9(\'c0\'fc\'c0\'da \'b8\'de\'c0\'cf, \'c0\'cf\'b9\'dd\'c0\'fb\'c0\'ce \'b8\'f1\'c0\'fb\'c0\'c7 \'c0\'ce\'c5\'cd\'b3\'dd \'ba\'ea\'b6\'f3\'bf\'ec\'c2\'a1 \'b9\'d7 \'bf\'c0\'c7\'c7\'bd\'ba \'c1\'a6\'c7\'b0\'b1\'ba \'bb\'fd\'bb\'ea\'bc\'ba \'b5\'b5\'b1\'b8 \'b5\'ee\'c0\'cc\'b3\'aa \'c0\'cc\'bf\'a1 \'b1\'b9\'c7\'d1\'b5\'c7\'c1\'f6\'b4\'c2 \'be\'ca\'c0\'bd)\'c0\'bb \'c0\'a7\'c7\'d8 \'bb\'e7\'bf\'eb\'b5\'c7\'b4\'c2 \'b5\'a5\'bd\'ba\'c5\'a9\'c5\'be \'b9\'d7 \'b7\'a6\'c5\'be \'c4\'c4\'c7\'bb\'c5\'cd\'b8\'a6 \'c6\'f7\'c7\'d4\'c7\'d1 \'c4\'c4\'c7\'bb\'c5\'cd \'b6\'c7\'b4\'c2 \'bc\'ad\'b9\'f6\'b8\'a6 \'c0\'c7\'b9\'cc\'c7\'d5\'b4\'cf\'b4\'d9. \'c0\'a7\'bf\'a1 \'be\'f0\'b1\'de\'b5\'c8 \'b3\'bb\'bf\'eb\'c0\'cc \'be\'c6\'b4\'d1 \'c0\'fc\'bf\'eb \'b1\'e2\'b4\'c9\'c0\'bb \'c1\'a6\'b0\'f8\'c7\'cf\'b0\'c5\'b3\'aa, \'b3\'bb\'c0\'e5\'b5\'c8 \'b6\'c7\'b4\'c2 \'c6\'af\'c1\'a4 \'b1\'e2\'b4\'c9 \'b0\'fc\'b7\'c3 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee \'be\'d6\'c7\'c3\'b8\'ae\'c4\'c9\'c0\'cc\'bc\'c7\'bf\'eb\'c0\'b8\'b7\'ce \'bc\'b3\'b0\'e8\'b5\'c8 \'bd\'c3\'bd\'ba\'c5\'db \'b9\'d7 \'bc\'d6\'b7\'e7\'bc\'c7\'bf\'a1\'bc\'ad \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\'b8\'a6 \'bb\'e7\'bf\'eb\'c7\'cf\'b4\'c2 \'b0\'cd\'c0\'ba \'ba\'bb \'c1\'a4\'c0\'c7\'bf\'a1\'bc\'ad \'c1\'a6\'bf\'dc\'b5\'c7\'b8\'e7 \'ba\'bb \'b0\'e8\'be\'e0\'bf\'a1 \'b5\'fb\'b6\'f3 \'ba\'b8\'c8\'a3\'b5\'c7\'c1\'f6 \'be\'ca\'bd\'c0\'b4\'cf\'b4\'d9. \'b1\'d7 \'bf\'b9\'b7\'ce\'b4\'c2 \'bb\'ea\'be\'f7\'bf\'eb \'c5\'eb\'c1\'a6 \'bd\'c3\'bd\'ba\'c5\'db\'bf\'a1 \'b9\'f8\'b5\'e9\'b5\'c7\'b0\'c5\'b3\'aa \'b3\'bb\'c0\'e5\'b5\'c8 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee, \'b9\'ab\'bc\'b1 \'c8\'de\'b4\'eb\'c6\'f9, \'b9\'ab\'bc\'b1 \'c7\'da\'b5\'e5\'c7\'db\'b5\'e5 \'c0\'e5\'c4\'a1, \'b3\'dd\'ba\'cf, \'c5\'b0\'bf\'c0\'bd\'ba\'c5\'a9, TV/STB, \'ba\'ed\'b7\'e7\'b7\'b9\'c0\'cc \'b5\'f0\'bd\'ba\'c5\'a9 \'c0\'e5\'c4\'a1, \'c5\'da\'b7\'b9\'b8\'de\'c6\'bd\'bd\'ba/\'b3\'d7\'c6\'ae\'bf\'f6\'c5\'a9 \'c5\'eb\'c1\'a6 \'bd\'ba\'c0\'a7\'c4\'aa \'c0\'e5\'c4\'a1, \'c7\'c1\'b8\'b0\'c5\'cd/\'bd\'ba\'c5\'e4\'b8\'ae\'c1\'f6 \'b0\'fc\'b8\'ae \'bd\'c3\'bd\'ba\'c5\'db \'b9\'d7 \'b1\'e2\'c5\'b8 \'b0\'fc\'b7\'c3 \'bd\'c3\'bd\'ba\'c5\'db\'c0\'bb \'b5\'e9 \'bc\'f6 \'c0\'d6\'c0\'b8\'b3\'aa \'c0\'cc\'bf\'a1 \'b1\'b9\'c7\'d1\'b5\'c7\'c1\'f6\'b4\'c2 \'be\'ca\'bd\'c0\'b4\'cf\'b4\'d9. "\'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5"\'c0\'cc\'b6\'f3 \'c7\'d4\'c0\'ba (a) Java\'b8\'a6 \'bb\'e7\'bf\'eb\'c7\'d2 \'bc\'f6 \'c0\'d6\'b5\'b5\'b7\'cf \'bc\'b3\'c1\'a4\'b5\'c8 \'c0\'cf\'b9\'dd \'b5\'a5\'bd\'ba\'c5\'a9\'c5\'be \'c4\'c4\'c7\'bb\'c5\'cd \'b9\'d7 \'bc\'ad\'b9\'f6\'c0\'c7 Java Platform Standard Edition (Java SE) \'c7\'c3\'b7\'a7\'c6\'fb\'bf\'a1\'bc\'ad \'c0\'db\'b5\'bf\'c7\'d2 \'bc\'f6 \'c0\'d6\'b5\'b5\'b7\'cf \'c1\'a6\'c0\'db\'b5\'c8 Java \'b1\'e2\'bc\'fa\'c0\'c7 \'be\'d6\'c7\'c3\'b8\'b4\'b0\'fa \'be\'d6\'c7\'c3\'b8\'ae\'c4\'c9\'c0\'cc\'bc\'c7, \'b1\'d7\'b8\'ae\'b0\'ed (b) JavaFX\'b8\'a6 \'bb\'e7\'bf\'eb\'c7\'d2 \'bc\'f6 \'c0\'d6\'b5\'b5\'b7\'cf \'bc\'b3\'c1\'a4\'b5\'c8 \'c0\'cf\'b9\'dd \'b5\'a5\'bd\'ba\'c5\'a9\'c5\'be \'c4\'c4\'c7\'bb\'c5\'cd \'b9\'d7 \'bc\'ad\'b9\'f6\'c0\'c7 JavaFX Runtime\'bf\'a1\'bc\'ad \'c0\'db\'b5\'bf\'c7\'d2 \'bc\'f6 \'c0\'d6\'b5\'b5\'b7\'cf \'c1\'a6\'c0\'db\'b5\'c8 JavaFX \'b1\'e2\'bc\'fa\'c0\'c7 \'be\'d6\'c7\'c3\'b8\'ae\'c4\'c9\'c0\'cc\'bc\'c7\'c0\'bb \'c0\'c7\'b9\'cc\'c7\'d5\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 2.\tab\'bb\'e7\'bf\'eb \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba.\b0 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'c1\'b6\'b0\'c7(\'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\'c0\'c7 Java \'b1\'e2\'bc\'fa \'b1\'d4\'c1\'a6\'bb\'e7\'c7\'d7\'c0\'cc \'c6\'f7\'c7\'d4\'b5\'c7\'b3\'aa \'c0\'cc\'bf\'a1 \'b1\'b9\'c7\'d1\'b5\'c7\'c1\'f6 \'be\'ca\'c0\'bd)\'bf\'a1 \'b5\'fb\'b6\'f3, 'Sun'\'c0\'ba \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \lang1033\f1\ldblquote\lang1042\f0\'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\lang1033\f1\rdblquote\lang1042\f0\'c0\'bb \'b0\'a1\'b5\'bf\'c7\'d2 \'b8\'f1\'c0\'fb\'b8\'b8\'c0\'bb \'c0\'a7\'c7\'cf\'bf\'a9 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'bb\'e7\'bf\'eb\'b7\'e1 \'be\'f8\'c0\'cc \'bc\'f6\'c1\'a4\'c0\'bb \'b0\'c5\'c4\'a1\'c1\'f6 \'be\'ca\'c0\'ba \'bf\'cf\'c1\'a6\'c7\'b0 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b8\'a6 \'ba\'b9\'c1\'a6\'c7\'cf\'bf\'a9 \'b3\'bb\'ba\'ce\'bf\'a1\'bc\'ad \'bb\'e7\'bf\'eb\'c7\'d2 \'bc\'f6 \'c0\'d6\'b4\'c2 \'ba\'f1\'b5\'b6\'c1\'a1\'c0\'fb\'c0\'cc\'b0\'ed \'be\'e7\'b5\'b5 \'ba\'d2\'b0\'a1\'b4\'c9\'c7\'d1 \'c1\'a6\'c7\'d1\'b5\'c8 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b8\'a6 \'ba\'ce\'bf\'a9\'c7\'d5\'b4\'cf\'b4\'d9. \'b0\'b3\'b9\'df\'c0\'da(developer) \'b9\'d7/\'b6\'c7\'b4\'c2 \'b9\'df\'c7\'e0\'c0\'da(publisher)\'bf\'a1 \'b4\'eb\'c7\'d1 \'c3\'df\'b0\'a1 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b4\'c2 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\'bf\'a1 \'c0\'c7\'c7\'cf\'bf\'a9 \'ba\'ce\'bf\'a9\'b5\'cb\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 3.\tab\'c1\'a6\'c7\'d1\'bb\'e7\'c7\'d7.\b0 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b3\'bb\'bf\'eb\'c0\'ba \'b1\'e2\'b9\'d0\'c0\'cc\'b8\'e7 \'c0\'fa\'c0\'db\'b1\'c7\'c0\'b8\'b7\'ce \'ba\'b8\'c8\'a3\'b8\'a6 \'b9\'de\'bd\'c0\'b4\'cf\'b4\'d9. \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'b4\'eb\'c7\'d1 \'bc\'d2\'c0\'af\'b1\'c7 \'b9\'d7 \'c0\'cc\'bf\'a1 \'b0\'fc\'b7\'c3\'b5\'c8 \'b8\'f0\'b5\'e7 \'c1\'f6\'c0\'fb\'c0\'e7\'bb\'ea\'b1\'c7\'c0\'ba 'Sun' \'b9\'d7/\'b6\'c7\'b4\'c2 'Sun'\'bf\'a1 \'b4\'eb\'c7\'d1 \'c7\'d8\'b4\'e7 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'c1\'a6\'b0\'f8\'c0\'da(licensor)\'b0\'a1 \'ba\'b8\'c0\'af\'c7\'d5\'b4\'cf\'b4\'d9. \'b0\'fc\'b7\'c3 \'b9\'fd\'b7\'c9\'bf\'a1 \'c0\'c7\'c7\'d8 \'c1\'fd\'c7\'e0\'c0\'cc \'b1\'dd\'c1\'f6\'b5\'c7\'b4\'c2 \'b0\'e6\'bf\'ec\'b8\'a6 \'c1\'a6\'bf\'dc\'c7\'cf\'b0\'ed\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b8\'a6 \'bc\'f6\'c1\'a4\'c7\'cf\'b0\'c5\'b3\'aa, \'b5\'f0\'c4\'c4\'c6\'c4\'c0\'cf(Decompiling)\'c7\'cf\'b0\'c5\'b3\'aa \'b6\'c7\'b4\'c2 \'bf\'aa\'bc\'b3\'b0\'e8(Reverse Engineering)\'c7\'d8\'bc\'ad \'be\'c8\'b5\'cb\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b0\'a1 \'ba\'ce\'bf\'a9\'b5\'c8 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b0\'a1 \'c7\'d9 \'bd\'c3\'bc\'b3\'c0\'c7 \'bc\'b3\'b0\'e8\'b3\'aa \'b0\'c7\'bc\'b3, \'c0\'db\'b5\'bf, \'c0\'af\'c1\'f6 \'ba\'b8\'bc\'f6 \'b5\'ee\'bf\'a1 \'bb\'e7\'bf\'eb\'c7\'d2 \'b8\'f1\'c0\'fb\'c0\'b8\'b7\'ce \'c0\'c7\'b5\'b5\'b5\'c7\'b0\'c5\'b3\'aa \'b0\'ed\'be\'c8\'b5\'c7\'c1\'f6 \'be\'ca\'be\'d2\'c0\'bd\'c0\'bb \'c0\'ce\'c1\'a4\'c7\'d5\'b4\'cf\'b4\'d9. Sun Microsystems, Inc\cf1 .\cf0\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b0\'a1 \'c0\'cc\'b7\'af\'c7\'d1 \'bf\'eb\'b5\'b5\'bf\'a1 \'c0\'fb\'c7\'d5\'c7\'cf\'b4\'d9\'b4\'c2 \'c1\'a1\'bf\'a1 \'b4\'eb\'c7\'d8\'bc\'ad\'b4\'c2 \'be\'ee\'b6\'b0\'c7\'d1 \'b8\'ed\'bd\'c3\'c0\'fb \'b6\'c7\'b4\'c2 \'b9\'ac\'bd\'c3\'c0\'fb \'ba\'b8\'c1\'f5\'c0\'bb \'c7\'cf\'c1\'f6 \'be\'ca\'bd\'c0\'b4\'cf\'b4\'d9. \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'c0\'c7\'c7\'d8\'bc\'ad\'b4\'c2, 'Sun' \'b6\'c7\'b4\'c2 'Sun'\'bf\'a1 \'b4\'eb\'c7\'d1 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'c1\'a6\'b0\'f8\'c0\'da(licensor)\'c0\'c7 \'bb\'f3\'c7\'a5, \'bc\'ad\'ba\'f1\'bd\'ba\'c7\'a5, \'b7\'ce\'b0\'ed \'b6\'c7\'b4\'c2 \'bb\'f3\'c8\'a3\'bf\'a1 \'b4\'eb\'c7\'d1 \'be\'ee\'b6\'b0\'c7\'d1 \'b1\'c7\'b8\'ae\'b5\'b5 \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'ba\'ce\'bf\'a9\'b5\'c7\'c1\'f6 \'be\'ca\'bd\'c0\'b4\'cf\'b4\'d9. \'b0\'b3\'b9\'df\'c0\'da(developer) \'b9\'d7/\'b6\'c7\'b4\'c2 \'b9\'df\'c7\'e0\'c0\'da(publisher) \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'bf\'a1 \'b4\'eb\'c7\'d1 \'c3\'df\'b0\'a1 \'c1\'a6\'c7\'d1\'bb\'e7\'c7\'d7\'c0\'ba \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\'bf\'a1 \'b1\'d4\'c1\'a4\'b5\'c7\'be\'ee \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 4.\tab\'c1\'a6\'c7\'d1\'c0\'fb \'c7\'b0\'c1\'fa\'ba\'b8\'c1\'f5.\b0 'Sun'\'c0\'ba \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b0\'a1 \'c1\'a6\'b0\'f8 \'b8\'c5\'c3\'bc(media)\'bf\'a1 \'c0\'c7\'c7\'cf\'bf\'a9 \'c1\'a6\'b0\'f8\'b5\'c8 \'b0\'e6\'bf\'ec \'b1\'d7 \'b8\'c5\'c3\'bc\'b4\'c2 \'bf\'b5\'bc\'f6\'c1\'f5\'c0\'b8\'b7\'ce \'c1\'f5\'b8\'ed\'b5\'c7\'b4\'c2 \'b1\'b8\'b8\'c5\'c0\'cf\'b7\'ce\'ba\'ce\'c5\'cd 90\'c0\'cf \'b5\'bf\'be\'c8 \'c1\'a4\'bb\'f3\'c0\'fb\'c0\'ce \'bb\'e7\'bf\'eb\'c1\'b6\'b0\'c7 \'c7\'cf\'bf\'a1\'bc\'ad\'b4\'c2 \'c0\'e7\'b7\'e1 \'b9\'d7\'c1\'a6\'c1\'b6\'b1\'e2\'bc\'fa\'bf\'a1 \'b0\'fc\'c7\'d1\'b0\'e1\'c7\'d4\'c0\'cc \'be\'f8\'c0\'bb \'b0\'cd\'c0\'d3\'c0\'bb \'ba\'b8\'c1\'f5\'c7\'d5\'b4\'cf\'b4\'d9. \'c0\'fc\'bc\'fa\'c7\'d1 \'ba\'b8\'c1\'f5\'c0\'bb \'c1\'a6\'bf\'dc\'c7\'cf\'b0\'ed\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b4\'c2 "\'c0\'d6\'b4\'c2 \'b1\'d7\'b4\'eb\'b7\'ce" \'c1\'a6\'b0\'f8\'b5\'cb\'b4\'cf\'b4\'d9. \'c0\'cc\'bf\'cd \'b0\'b0\'c0\'ba \'c1\'a6\'c7\'d1\'c0\'fb\'c0\'ce \'ba\'b8\'c1\'f5 \'c7\'cf\'bf\'a1\'bc\'ad\'c0\'c7 \'b1\'cd\'c7\'cf\'c0\'c7 \'c0\'af\'c0\'cf\'c7\'d1 \'b1\'b8\'c1\'a6\'bc\'f6\'b4\'dc \'b9\'d7 'Sun'\'c0\'c7 \'b8\'f0\'b5\'e7 \'c3\'a5\'c0\'d3\'c0\'ba 'Sun'\'c0\'c7 \'bc\'b1\'c5\'c3\'bf\'a1 \'b5\'fb\'b6\'f3 \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b8\'c5\'c3\'bc\'b8\'a6 \'b1\'b3\'c8\'af\'c7\'cf\'bf\'a9 \'b5\'e5\'b8\'ae\'b0\'c5\'b3\'aa \'b6\'c7\'b4\'c2 \'b1\'cd\'c7\'cf\'b0\'a1 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b8\'a6 \'b1\'b8\'b8\'c5\'c7\'d2 \'b6\'a7 \'c1\'f6\'b1\'de\'c7\'d1 \'b1\'dd\'be\'d7\'c0\'bb \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'c8\'af\'ba\'d2\'c7\'cf\'bf\'a9 \'b5\'e5\'b8\'ae\'b4\'c2 \'b0\'cd\'bf\'a1 \'b1\'b9\'c7\'d1\'b5\'cb\'b4\'cf\'b4\'d9. \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'b4\'eb\'c7\'d1 \'b8\'f0\'b5\'e7 \'b9\'ac\'bd\'c3\'c0\'fb \'ba\'b8\'c1\'f5\'c0\'ba90\'c0\'cf\'b7\'ce \'c7\'d1\'c1\'a4\'b5\'cb\'b4\'cf\'b4\'d9. \'b9\'ac\'bd\'c3\'c0\'fb \'ba\'b8\'c1\'f5\'c0\'c7 \'c1\'f6\'bc\'d3\'b1\'e2\'b0\'a3\'bf\'a1 \'b4\'eb\'c7\'d1 \'c1\'a6\'c7\'d1\'c0\'bb \'c7\'e3\'bf\'eb\'c7\'cf\'c1\'f6 \'be\'ca\'b4\'c2 \'b1\'b9\'b0\'a1\'b5\'e9\'c0\'cc \'c0\'d6\'c0\'b8\'b9\'c7\'b7\'ce, \'c0\'a7\'c0\'c7 \'bb\'e7\'c7\'d7\'c0\'ba \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'c0\'fb\'bf\'eb\'b5\'c7\'c1\'f6 \'be\'ca\'c0\'bb \'bc\'f6\'b5\'b5 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9. \'c0\'cc\'bf\'cd \'b0\'b0\'c0\'ba \'c1\'a6\'c7\'d1\'b5\'c8 \'ba\'b8\'c1\'f5\'c0\'ba \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'c6\'af\'c1\'a4\'c0\'c7 \'b9\'fd\'c0\'fb \'b1\'c7\'b8\'ae\'b8\'a6 \'ba\'ce\'bf\'a9\'c7\'d5\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'b0\'a1 \'bc\'d3\'c7\'d1 \'b1\'b9\'b0\'a1\'c0\'c7 \'b9\'fd\'b7\'fc\'bf\'a1 \'b5\'fb\'b6\'f3 \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'b1\'e2\'c5\'b8 \'b4\'d9\'b8\'a5 \'b1\'c7\'b8\'ae\'b0\'a1 \'c0\'d6\'c0\'bb \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 5.\tab\'c7\'b0\'c1\'fa\'ba\'b8\'c1\'f5\'c0\'c7 \'ba\'ce\'c0\'ce.\b0 'Sun'\'c0\'ba \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'b8\'ed\'bd\'c3\'b5\'c8 \'b9\'d9\'b8\'a6 \'c1\'a6\'bf\'dc\'c7\'cf\'b0\'ed\'b4\'c2, \'bb\'f3\'c7\'b0\'bc\'ba\'c0\'cc\'b3\'aa \'c6\'af\'c1\'a4 \'b8\'f1\'c0\'fb\'bf\'a1 \'b4\'eb\'c7\'d1 \'c0\'fb\'c7\'d5\'bc\'ba, \'b1\'c7\'b8\'ae\'c4\'a7\'c7\'d8\'c0\'c7 \'ba\'ce\'c1\'b8\'c0\'e7 \'b5\'ee\'b0\'fa \'b0\'b0\'c0\'ba \'b9\'ac\'bd\'c3\'c0\'fb \'ba\'b8\'c1\'f5 \'b5\'ee \'b8\'f0\'b5\'e7 \'b8\'ed\'bd\'c3\'c0\'fb \'b6\'c7\'b4\'c2 \'b9\'ac\'bd\'c3\'c0\'fb \'c1\'b6\'b0\'c7, \'c1\'f8\'bc\'fa \'b9\'d7 \'ba\'b8\'c1\'f5\'c0\'bb \'ba\'ce\'c0\'ce\'c7\'d5\'b4\'cf\'b4\'d9. \'b4\'dc, \'c0\'cc\'bf\'cd \'b0\'b0\'c0\'ba \'c7\'b0\'c1\'fa \'ba\'b8\'c1\'f5\'c0\'c7 \'ba\'ce\'c0\'ce\'c0\'ba \'b9\'fd\'c0\'fb\'c0\'b8\'b7\'ce \'c0\'af\'c8\'bf\'c7\'cf\'b4\'d9\'b0\'ed \'c0\'ce\'c1\'a4\'b5\'c8\'b4\'c2 \'b9\'fc\'c0\'a7 \'b3\'bb\'bf\'a1\'bc\'ad\'b8\'b8 \'c0\'fb\'bf\'eb\'b5\'cb\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 6.\tab\'c3\'a5\'c0\'d3\'c0\'c7 \'c1\'a6\'c7\'d1.\b0 'Sun' \'b6\'c7\'b4\'c2 \'b1\'d7\'bf\'a1 \'b4\'eb\'c7\'d1 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'c1\'a6\'b0\'f8\'c0\'da(licensor)\'b4\'c2 \'b9\'fd\'c0\'cc \'c7\'e3\'bf\'eb\'c7\'cf\'b4\'c2 \'c7\'d1\'b5\'b5 \'b3\'bb\'bf\'a1\'bc\'ad\'b4\'c2, \'be\'ee\'b6\'b0\'c7\'d1 \'b0\'e6\'bf\'ec\'bf\'a1\'b5\'b5, \'bc\'b3\'bb\'e7 'Sun'\'c0\'cc \'b1\'d7\'b7\'af\'c7\'d1 \'bc\'d5\'c7\'d8\'c0\'c7 \'b9\'df\'bb\'fd \'b0\'a1\'b4\'c9\'bc\'ba\'c0\'bb \'bb\'e7\'c0\'fc\'bf\'a1 \'b0\'ed\'c1\'f6 \'b9\'de\'be\'d2\'b4\'d9\'b0\'ed \'c7\'d2\'c1\'f6\'b6\'f3\'b5\'b5, '\'b9\'fd\'c0\'fb \'c3\'a5\'c0\'d3'\'bf\'a1 \'b0\'fc\'c7\'d1 \'bf\'a9\'c7\'cf\'c7\'d1 \'c0\'cc\'b7\'d0\'bf\'a1 \'bb\'f3\'b0\'fc\'be\'f8\'c0\'cc, \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'bb\'e7\'bf\'eb \'b6\'c7\'b4\'c2 \'bb\'e7\'bf\'eb \'ba\'d2\'b0\'a1\'b4\'c9\'c0\'b8\'b7\'ce\'ba\'ce\'c5\'cd \'ba\'f1\'b7\'d4\'b5\'c7\'b0\'c5\'b3\'aa \'b0\'fc\'b7\'c3\'b5\'c7\'be\'ee \'b9\'df\'bb\'fd\'c7\'cf\'b4\'c2 \'bc\'f6\'c0\'cd, \'c0\'cc\'c0\'cd \'b6\'c7\'b4\'c2 \'b5\'a5\'c0\'cc\'c5\'cd\'c0\'c7 \'bc\'d5\'bd\'c7, \'b6\'c7\'b4\'c2 \'c6\'af\'ba\'b0\'bc\'d5\'c7\'d8, \'b0\'a3\'c1\'a2\'bc\'d5\'c7\'d8, \'b0\'e1\'b0\'fa\'c0\'fb \'bc\'d5\'c7\'d8, \'ba\'ce\'bc\'f6\'c0\'fb \'bc\'d5\'c7\'d8, \'b6\'c7\'b4\'c2 \'c2\'a1\'b9\'fa\'c0\'fb \'bc\'d5\'c7\'d8\'bf\'a1 \'b0\'fc\'c7\'d1 \'b9\'e8\'bb\'f3\'c3\'a5\'c0\'d3\'c0\'bb \'c1\'f6\'c1\'f6 \'be\'ca\'bd\'c0\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'bf\'a1 \'b4\'eb\'c7\'d1 'Sun'\'c0\'c7 \'c3\'a5\'c0\'d3\'c0\'ba \'b0\'e8\'be\'e0\'c0\'cc\'b3\'aa \'ba\'d2\'b9\'fd\'c7\'e0\'c0\'a7(\'b0\'fa\'bd\'c7 \'c6\'f7\'c7\'d4) \'b5\'ee \'b1\'e2\'c5\'b8 \'be\'ee\'b6\'b0\'c7\'d1 \'b0\'cd\'bf\'a1 \'b1\'d9\'b0\'c5\'c7\'d1 \'b0\'cd\'c0\'ce\'c1\'f6\'bf\'a1 \'b0\'fc\'b0\'e8 \'be\'f8\'c0\'cc, \'be\'ee\'b6\'b0\'c7\'d1 \'b0\'e6\'bf\'ec\'b6\'f3\'b5\'b5 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'b5\'fb\'b6\'f3 \'b1\'cd\'c7\'cf\'b0\'a1 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'b4\'eb\'c7\'d8 \'c1\'f6\'ba\'d2\'c7\'d1 \'b1\'dd\'be\'d7\'c0\'bb \'c3\'ca\'b0\'fa\'c7\'d2 \'bc\'f6\'b4\'c2 \'be\'f8\'bd\'c0\'b4\'cf\'b4\'d9. \'c0\'cc\'bf\'cd \'b0\'b0\'c0\'ba \'c3\'a5\'c0\'d3\'c0\'c7 \'c1\'a6\'c7\'d1\'c0\'ba \'be\'d5\'bf\'a1\'bc\'ad \'b1\'d4\'c1\'a4\'c7\'d1 \'ba\'b8\'c1\'f5\'c0\'cc \'b1\'d7 \'ba\'bb\'c1\'fa\'c0\'fb\'c0\'ce \'b8\'f1\'c0\'fb\'c0\'bb \'b4\'de\'bc\'ba\'c7\'cf\'c1\'f6 \'b8\'f8\'c7\'cf\'b4\'c2 \'b0\'e6\'bf\'ec\'bf\'a1\'b5\'b5 \'c0\'fb\'bf\'eb\'b5\'cb\'b4\'cf\'b4\'d9. \'ba\'ce\'bc\'f6\'c0\'fb \'b6\'c7\'b4\'c2 \'b0\'e1\'b0\'fa\'c0\'fb \'bc\'d5\'c7\'d8\'c0\'c7 \'b9\'e8\'c1\'a6\'b8\'a6 \'c7\'e3\'bf\'eb\'c7\'cf\'c1\'f6 \'be\'ca\'b4\'c2 \'b1\'b9\'b0\'a1\'b5\'e9\'c0\'cc \'c0\'d6\'c0\'b8\'b9\'c7\'b7\'ce \'c0\'a7 \'b3\'bb\'bf\'eb \'c1\'df \'c0\'cf\'ba\'ce\'b4\'c2 \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'c0\'fb\'bf\'eb\'b5\'c7\'c1\'f6 \'be\'ca\'c0\'bb \'bc\'f6\'b5\'b5 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 7.\tab\'b0\'e8\'be\'e0\'c0\'c7 \'c7\'d8\'c1\'f6.\b0 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'ba \'c7\'d8\'c1\'f6\'b5\'c9 \'b6\'a7\'b1\'ee\'c1\'f6 \'c0\'af\'c8\'bf\'c7\'d5\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'b4\'c2 \'be\'f0\'c1\'a6\'b6\'f3\'b5\'b5 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b8\'f0\'b5\'e7 \'bb\'e7\'ba\'bb(copy)\'c0\'bb \'c6\'f3\'b1\'e2\'c7\'d4\'c0\'b8\'b7\'ce\'bd\'e1 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'bb \'c7\'d8\'c1\'f6\'c7\'d2 \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'b0\'a1 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'be\'ee\'b4\'c0 \'c7\'d1 \'b1\'d4\'c1\'a4\'c0\'cc\'b6\'f3\'b5\'b5 \'c1\'d8\'bc\'f6\'c7\'cf\'c1\'f6 \'be\'ca\'b4\'c2 \'b0\'e6\'bf\'ec\'bf\'a1\'b4\'c2, 'Sun'\'c0\'c7 \'c5\'eb\'c1\'f6\'b0\'a1 \'be\'f8\'b4\'f5\'b6\'f3\'b5\'b5 \'c1\'ef\'bd\'c3 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'ba \'c7\'d8\'c1\'f6\'b5\'cb\'b4\'cf\'b4\'d9. \cf1\'b0\'a2 \'b4\'e7\'bb\'e7\'c0\'da\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b0\'a1 \'c1\'f6\'c0\'fb\'c0\'e7\'bb\'ea\'b1\'c7 \cf0\'c4\'a7\'c7\'d8\'c0\'c7 \'c5\'ac\'b7\'b9\'c0\'d3 \'b4\'eb\'bb\'f3\'c0\'cc \'b5\'c7\'b0\'c5\'b3\'aa \'b5\'c9 \'b0\'a1\'b4\'c9\'bc\'ba\'c0\'cc \'c0\'d6\'b4\'d9\'b0\'ed \'c6\'c7\'b4\'dc\'c7\'cf\'b4\'c2 \'b0\'e6\'bf\'ec\'bf\'a1\'b4\'c2 \'c1\'ef\'bd\'c3 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'bb \'c7\'d8\'c1\'f6\'c7\'d2 \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9. \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'cc \'c7\'d8\'c1\'f6\'b5\'c7\'b4\'c2 \'b0\'e6\'bf\'ec, \'b1\'cd\'c7\'cf\'b4\'c2 \'c1\'ef\'bd\'c3 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b8\'f0\'b5\'e7 \'bb\'e7\'ba\'bb(copy)\'c0\'bb \'c6\'f3\'b1\'e2\'c7\'d8\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 8.\tab\'bc\'f6\'c3\'e2 \'b1\'d4\'c1\'a6.\b0 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'b5\'fb\'b6\'f3 \'c1\'a6\'b0\'f8\'b5\'c7\'b4\'c2 \'b8\'f0\'b5\'e7 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0 \'b9\'d7 \'b1\'e2\'bc\'fa \'b5\'a5\'c0\'cc\'c5\'cd\'b4\'c2 \'b9\'cc\'b1\'b9\'c0\'c7 \'bc\'f6\'c3\'e2\'c5\'eb\'c1\'a6 \'b0\'fc\'b7\'c3 \'b9\'fd\'b1\'d4(US export control laws)\'c0\'c7 \'c0\'fb\'bf\'eb\'c0\'bb \'b9\'de\'c0\'b8\'b8\'e7, \'b1\'e2\'c5\'b8 \'b4\'d9\'b8\'a5 \'b1\'b9\'b0\'a1\'b7\'ce\'ba\'ce\'c5\'cd \'bc\'f6\'c3\'e2 \'b6\'c7\'b4\'c2 \'bc\'f6\'c0\'d4\'c0\'c7 \'b1\'d4\'c1\'a6\'b8\'a6 \'b9\'de\'c0\'bb \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'b4\'c2 \'c0\'cc\'b7\'af\'c7\'d1 \'b8\'f0\'b5\'e7 \'c7\'d8\'b4\'e7 \'b9\'fd\'b1\'d4\'b8\'a6 \'be\'f6\'b0\'dd\'c8\'f7 \'c1\'d8\'bc\'f6\'c7\'d2 \'b0\'cd\'bf\'a1 \'b5\'bf\'c0\'c7\'c7\'cf\'b8\'e7, \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'c0\'ce\'b5\'b5\'b5\'c8 \'c0\'cc\'c8\'c4 \'bc\'f6\'c3\'e2, \'c0\'e7\'bc\'f6\'c3\'e2 \'b6\'c7\'b4\'c2 \'bc\'f6\'c0\'d4\'c0\'bb \'c0\'a7\'c7\'cf\'bf\'a9 \'c7\'ca\'bf\'e4\'c7\'d1 \'c7\'e3\'b0\'a1\'c0\'c7 \'c3\'eb\'b5\'e6\'c0\'ba \'b1\'cd\'c7\'cf\'c0\'c7 \'c3\'a5\'c0\'d3\'c0\'d3\'c0\'bb \'c0\'ce\'c1\'a4\'c7\'d5\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\cf1\lang1042\b\f0 9.\tab\'bb\'f3\'c7\'a5 \'b9\'d7 \'b7\'ce\'b0\'ed.\b0 \'b1\'cd\'c7\'cf\'b4\'c2 \'b1\'cd\'c7\'cf\'bf\'cd 'Sun' \'bb\'e7\'c0\'cc\'bf\'a1\'bc\'ad, "SUN", "SOLARIS", "JAVA", "JINI", "FORTE" \'b9\'d7 "iPLANET"\'c0\'c7 \'bb\'f3\'c7\'a5\'bf\'cd "SUN", "SOLARIS", "JAVA", "JINI", "FORTE" \'b9\'d7 "iPLANET"\'b0\'fa \'b0\'fc\'b7\'c3\'b5\'c8 \'b8\'f0\'b5\'e7 \'bb\'f3\'c7\'a5, \'bc\'ad\'ba\'f1\'bd\'ba\'c7\'a5, \'b7\'ce\'b0\'ed \'b9\'d7 \'b1\'e2\'c5\'b8 \'ba\'ea\'b7\'a3\'b5\'e5 \'c7\'a5\'bd\'c3(\'c0\'cc\'c7\'cf "Sun \'c7\'a5\'bd\'c3")\'b0\'a1 'Sun'\'c0\'c7 \'bc\'d2\'c0\'af\'c0\'d3\'c0\'bb \'c0\'ce\'c1\'a4\'c7\'cf\'b0\'ed \'c0\'cc\'bf\'a1 \'b5\'bf\'c0\'c7\'c7\'cf\'b8\'e7, \'c7\'f6\'c0\'e7 http://www.sun.com/policies/trademarks\'bf\'a1 \'b0\'d4\'c0\'e7\'b5\'c7\'be\'ee \'c0\'d6\'b4\'c2 Sun \'bb\'f3\'c7\'a5 \'b9\'d7 \'b7\'ce\'b0\'ed \'bb\'e7\'bf\'eb \'bf\'e4\'b0\'c7\'c0\'bb \'c1\'d8\'bc\'f6\'c7\'d2 \'b0\'cd\'bf\'a1 \'b5\'bf\'c0\'c7\'c7\'d5\'b4\'cf\'b4\'d9. \'b1\'cd\'c7\'cf\'c0\'c7 \lang1033\f1\ldblquote\lang1042\f0 Sun \'c7\'a5\'bd\'c3\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'bb\'e7\'bf\'eb\'c0\'ba 'Sun'\'c0\'c7 \'c0\'cc\'c0\'cd\'c0\'b8\'b7\'ce \'b1\'cd\'bc\'d3\'b5\'cb\'b4\'cf\'b4\'d9. \par -\pard\nowidctlpar\qj\cf0 \par -\pard\nowidctlpar\fi-360\li720\qj\tx720\b 10.\tab\'b9\'cc\'b1\'b9 \'c1\'a4\'ba\'ce\'c0\'c7 \'c1\'a6\'c7\'d1\'b5\'c8 \'b1\'c7\'b8\'ae.\b0 \'b9\'cc\'b1\'b9 \'c1\'a4\'ba\'ce \'b6\'c7\'b4\'c2 \'b9\'cc\'b1\'b9 \'c1\'a4\'ba\'ce\'c0\'c7 \'c1\'d6 \'b0\'e8\'be\'e0\'c0\'da\'b3\'aa \'b1\'d7 \'c7\'cf\'b5\'b5\'b1\'de\'be\'f7\'c3\'bc(\'c7\'cf\'b5\'b5\'b1\'de\'c0\'c7 \'b4\'dc\'b0\'e8\'b4\'c2 \'ba\'d2\'b9\'ae\'c7\'d4)\'b0\'a1 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b8\'a6 \'b1\'b8\'c0\'d4\'c7\'d1 \'b0\'e6\'bf\'ec\'bf\'a1\'b5\'b5, \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0 \'b9\'d7 \'b5\'bf\'ba\'c0\'b5\'c8 \'b9\'ae\'bc\'ad\'bf\'a1 \'b4\'eb\'c7\'d1 \'c1\'a4\'ba\'ce\'c0\'c7 \'b1\'c7\'b8\'ae\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'b1\'d4\'c1\'a4\'b5\'c7\'be\'ee \'c0\'d6\'b4\'c2 \'c1\'b6\'b0\'c7 \'b9\'d7 \'b1\'d4\'c1\'a4\'bf\'a1 \'b1\'b9\'c7\'d1\'b5\'cb\'b4\'cf\'b4\'d9. \'c0\'cc\'b4\'c2 48 CFR\lang1028\f2 \lang1042\f0 227.7201\'b3\'bb\'c1\'f6 227.7202-4\'c0\'c7 \'b1\'d4\'c1\'a4(\'b9\'cc\'b1\'b9 \'b1\'b9\'b9\'e6\'bc\'ba(DOD) \'c3\'eb\'b5\'e6\'bf\'a1 \'b0\'fc\'c7\'d1 \'b1\'d4\'c1\'a4)\'b0\'fa 48 CFR\lang1028\f2 \lang1042\f0 2.101 \'b9\'d7 12.212 \'b1\'d4\'c1\'a4(\'b9\'cc\'b1\'b9 \'b1\'b9\'b9\'e6\'bc\'ba(DOD) \'c0\'cc\'bf\'dc\'c0\'c7 \'c3\'eb\'b5\'e6\'bf\'a1 \'b0\'fc\'c7\'d1 \'b1\'d4\'c1\'a4)\'bf\'a1 \'c0\'c7\'c7\'d1 \'b0\'cd\'c0\'d4\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 11.\tab\'c1\'d8\'b0\'c5\'b9\'fd.\b0 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'b0\'fa \'b0\'fc\'b7\'c3\'b5\'c8 \'b8\'f0\'b5\'e7 \'bc\'d2\'bc\'db\'c0\'ba \'c4\'b6\'b8\'ae\'c6\'f7\'b4\'cf\'be\'c6\'c1\'d6 \'b9\'fd\'b7\'fc\'b0\'fa \'b9\'cc \'bf\'ac\'b9\'e6 \'b9\'fd\'b7\'fc\'c0\'c7 \'c0\'fb\'bf\'eb\'c0\'bb \'b9\'de\'bd\'c0\'b4\'cf\'b4\'d9. \'b4\'d9\'b8\'a5 \'be\'ee\'b6\'b2 \'b1\'b9\'b0\'a1 \'b6\'c7\'b4\'c2 \'c1\'d6\'c0\'c7 \'bc\'b7\'bf\'dc\'bb\'e7\'b9\'fd \'b1\'d4\'c1\'a4\'b5\'b5 \'c0\'fb\'bf\'eb\'b5\'c7\'c1\'f6 \'be\'ca\'bd\'c0\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 12.\tab\'b0\'a2 \'c1\'b6\'c7\'d7\'c0\'c7 \'b5\'b6\'b8\'b3\'bc\'ba.\b0 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'be\'ee\'b6\'b2 \'c1\'b6\'c7\'d7\'c0\'cc \'b0\'ad\'c7\'e0\'b5\'c9 \'bc\'f6 \'be\'f8\'b4\'c2 \'b0\'e6\'bf\'ec\'bf\'a1\'b5\'b5, \'b4\'e7\'c7\'d8 \'c1\'b6\'c7\'d7\'c0\'bb \'c1\'a6\'bf\'dc\'c7\'d1 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b3\'aa\'b8\'d3\'c1\'f6 \'c1\'b6\'c7\'d7\'c0\'ba \'b1\'d7\'b4\'eb\'b7\'ce \'c0\'af\'c8\'bf\'c7\'d5\'b4\'cf\'b4\'d9. \'b4\'dc, \'b4\'e7\'c7\'d8 \'c1\'b6\'c7\'d7\'c0\'c7 \'c1\'a6\'bf\'dc\'b7\'ce \'c0\'ce\'c7\'d8 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b8\'f1\'c0\'fb\'c0\'bb \'b4\'de\'bc\'ba\'c7\'cf\'c1\'f6 \'b8\'f8\'c7\'cf\'b0\'d4 \'b5\'c7\'b4\'c2 \'b0\'e6\'bf\'ec\'bf\'a1\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'cc \'c1\'ef\'bd\'c3 \'c7\'d8\'c1\'f6\'b5\'cb\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 13.\tab\'c3\'d6\'c1\'be\'c7\'d5\'c0\'c7.\b0 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'ba \'b1\'cd\'c7\'cf\'bf\'cd 'Sun' \'bb\'e7\'c0\'cc\'c0\'c7 \'b1\'d7 \'b0\'e8\'be\'e0 \'bb\'e7\'c7\'d7\'bf\'a1 \'b0\'fc\'c7\'d1 \'c3\'d6\'c1\'be \'c7\'d5\'c0\'c7\'c0\'d4\'b4\'cf\'b4\'d9. \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'ba \'be\'e7 \'b4\'e7\'bb\'e7\'c0\'da \'bb\'e7\'c0\'cc\'bf\'a1\'bc\'ad \'c7\'f6\'c0\'e7 \'c8\'a4\'c0\'ba \'b1\'d7 \'c0\'cc\'c0\'fc\'bf\'a1 \'b1\'b8\'b5\'ce \'b6\'c7\'b4\'c2 \'bc\'ad\'b8\'e9\'c0\'b8\'b7\'ce \'c0\'cc\'b7\'e7\'be\'ee\'c1\'f8 \'c0\'c7\'bb\'e7\'b1\'b3\'c8\'af, \'c1\'a6\'be\'c8, \'c1\'f8\'bc\'fa \'b9\'d7 \'ba\'b8\'c1\'f5\'bf\'a1 \'bf\'ec\'bc\'b1\'c7\'cf\'b8\'e7, \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0 \'b1\'e2\'b0\'a3 \'c1\'df \'b1\'d7 \'b0\'e8\'be\'e0 \'bb\'e7\'c7\'d7\'bf\'a1 \'bb\'f3\'c3\'e6\'b5\'c7\'b4\'c2 \'b0\'df\'c0\'fb, \'c1\'d6\'b9\'ae, \'bd\'c2\'c0\'ce \'b6\'c7\'b4\'c2 \'b1\'e2\'c5\'b8 \'c0\'c7\'bb\'e7\'b1\'b3\'c8\'af, \'b6\'c7\'b4\'c2 \'c0\'cc\'b5\'e9\'bf\'a1 \'b4\'eb\'c7\'d1 \'c3\'df\'b0\'a1 \'c1\'b6\'b0\'c7\'bf\'a1 \'bf\'ec\'bc\'b1\'c7\'d5\'b4\'cf\'b4\'d9. \'be\'e7 \'b4\'e7\'bb\'e7\'c0\'da\'c0\'c7 \'b1\'c7\'c7\'d1 \'c0\'d6\'b4\'c2 \'b4\'eb\'c7\'a5\'c0\'da\'bf\'a1 \'c0\'c7\'c7\'d1 \'bc\'ad\'b8\'e9 \'c7\'d5\'c0\'c7\'bf\'cd \'bc\'ad\'b8\'ed\'c0\'cc \'be\'f8\'b4\'c2 \'c7\'d1 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'bc\'f6\'c1\'a4\'c0\'ba \'b9\'fd\'c0\'fb \'b1\'b8\'bc\'d3\'b7\'c2\'c0\'cc \'be\'f8\'bd\'c0\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\par -\pard\nowidctlpar\qc\lang1042\f0\'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\lang1033\f1\par -\pard\nowidctlpar\qj\par -\lang1042\f0\'ba\'bb \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\'c0\'ba \lang1033\f1\ldblquote\lang1042\f0\'c0\'cc\'c1\'f8 \'c4\'da\'b5\'e5 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'c1\'b6\'c7\'d7\'bf\'a1 \'c3\'df\'b0\'a1\'b5\'c7\'b0\'c5\'b3\'aa \'c0\'cc\'b8\'a6 \'bc\'f6\'c1\'a4\'c7\'cf\'b4\'c2 \'b0\'cd\'c0\'d4\'b4\'cf\'b4\'d9. \'ba\'bb \lang1033\f1\ldblquote\lang1042\f0\'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1\'bc\'ad \'c1\'a4\'c0\'c7\'b5\'c7\'c1\'f6 \'be\'ca\'c0\'ba \'bf\'eb\'be\'ee\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'c0\'cc\'c1\'f8 \'c4\'da\'b5\'e5 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1\'bc\'ad\'bf\'cd \'b1\'d7 \'c0\'c7\'b9\'cc\'b0\'a1 \'b5\'bf\'c0\'cf\'c7\'d5\'b4\'cf\'b4\'d9. \'ba\'bb \lang1033\f1\ldblquote\lang1042\f0\'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\lang1033\f1\rdblquote\lang1042\f0\'c0\'cc \lang1033\f1\ldblquote\lang1042\f0\'c0\'cc\'c1\'f8 \'c4\'da\'b5\'e5 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'cc\'b3\'aa \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'c6\'f7\'c7\'d4\'b5\'c8 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'c0\'c7 \'c1\'b6\'c7\'d7\'b0\'fa \'ba\'d2\'c0\'cf\'c4\'a1\'c7\'cf\'b0\'c5\'b3\'aa \'bb\'f3\'c8\'a3 \'c3\'e6\'b5\'b9\'c7\'cf\'b4\'c2 \'b0\'e6\'bf\'ec\'bf\'a1\'b4\'c2 \'ba\'bb \lang1033\f1\ldblquote\lang1042\f0\'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\lang1033\f1\rdblquote\lang1042\f0\'c0\'cc \'bf\'ec\'bc\'b1\'c7\'d5\'b4\'cf\'b4\'d9.\par -\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\b A.\tab\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee \'b3\'bb\'ba\'ce \'bb\'e7\'bf\'eb \'b9\'d7 \'b0\'b3\'b9\'df \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'ba\'ce\'bf\'a9.\b0 \'ba\'bb \'b0\'e8\'be\'e0\'c0\'c7 \'b1\'e2\'b0\'a3 \'b9\'d7 \'c1\'b6\'b0\'c7, \'c1\'a6\'c7\'d1 \'b9\'d7 \'bf\'b9\'bf\'dc\'b4\'c2 \'c2\'fc\'c1\'b6\'b7\'ce \'bf\'a9\'b1\'e2\'bf\'a1 \'c5\'eb\'c7\'d5\'b5\'c8 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee "README" \'c6\'c4\'c0\'cf\'bf\'a1 \'b8\'ed\'bd\'c3\'b5\'c7\'be\'ee \'c0\'d6\'c0\'b8\'b8\'e7, \'c0\'cc\'b7\'af\'c7\'d1 \'c3\'df\'b0\'a1 \'bf\'eb\'be\'ee\'c0\'c7 Java Technology \'c1\'a6\'c7\'d1\'c0\'cc \'c0\'d6\'c0\'bb \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9. Sun\'c0\'ba \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5 \'bc\'b3\'b0\'e8, \'b0\'b3\'b9\'df \'b9\'d7 \'c5\'d7\'bd\'ba\'c6\'ae \'b8\'f1\'c0\'fb\'c0\'b8\'b7\'ce \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\'b8\'a6 \'bc\'f6\'c1\'a4\'c7\'cf\'c1\'f6 \'be\'ca\'b0\'ed \'b3\'bb\'ba\'ce\'bf\'a1\'bc\'ad \'bf\'cf\'ba\'ae\'c7\'cf\'b0\'d4 \'c0\'e7\'bb\'fd\'bb\'ea \'b9\'d7 \'bb\'e7\'bf\'eb\'c7\'d2 \'bc\'f6 \'c0\'d6\'b5\'b5\'b7\'cf \'ba\'f1\'b5\'b6\'c1\'a1\'c0\'fb\'c0\'cc\'b8\'e7 \'be\'e7\'b5\'b5 \'ba\'d2\'b0\'a1\'b4\'c9\'c7\'d1 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b8\'a6 \'c1\'a6\'c7\'d1\'c0\'fb\'c0\'b8\'b7\'ce \'ba\'ce\'bf\'a9\'c7\'d5\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 B.\tab\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee \'b9\'e8\'c6\'f7 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba.\b0 'Sun'\'c0\'ba \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0 \'c1\'b6\'b0\'c7 \'b9\'d7 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0 README \'c6\'c4\'c0\'cf\'bf\'a1 \'bc\'b3\'b8\'ed\'b5\'c8 \'c1\'a6\'c7\'d1 \'b9\'d7 \'bf\'b9\'bf\'dc\'bb\'e7\'c7\'d7(\'ba\'bb \lang1033\f1\ldblquote\lang1042\f0\'ba\'b8\'c3\'e6 \'c1\'b6\'c7\'d7\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 Java \'b1\'e2\'bc\'fa \'b1\'d4\'c1\'a6\'bb\'e7\'c7\'d7\'c0\'bb \'c6\'f7\'c7\'d4\'c7\'cf\'b3\'aa \'c0\'cc\'bf\'a1 \'b1\'b9\'c7\'d1\'b5\'c7\'c1\'f6 \'be\'ca\'c0\'bd)\'bf\'a1 \'b5\'fb\'b6\'f3, \'bb\'e7\'bf\'eb\'b7\'e1 \'be\'f8\'c0\'cc \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b8\'a6 \'ba\'b9\'c1\'a6 \'b9\'d7 \'b9\'e8\'c6\'f7\'c7\'d2 \'bc\'f6 \'c0\'d6\'b4\'c2 \'ba\'f1\'b5\'b6\'c1\'a1\'c0\'fb\'c0\'cc\'b0\'ed \'be\'e7\'b5\'b5 \'ba\'d2\'b0\'a1\'b4\'c9\'c7\'d1 \'c1\'a6\'c7\'d1\'b5\'c8 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b8\'a6 \'b1\'cd\'c7\'cf\'bf\'a1\'b0\'d4 \'ba\'ce\'bf\'a9\'c7\'d5\'b4\'cf\'b4\'d9(JavaFX Runtime \'c1\'a6\'bf\'dc). \'b4\'dc, \'b4\'d9\'c0\'bd \'c1\'b6\'b0\'c7\'c0\'bb \'c1\'d8\'bc\'f6\'c7\'d8\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9. (i) \'b1\'cd\'c7\'cf\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b8\'a6 \'bc\'f6\'c1\'a4\'c0\'bb \'b0\'c5\'c4\'a1\'c1\'f6 \'be\'ca\'b0\'ed \'bf\'cf\'c1\'a6\'c7\'b0 \'b1\'d7\'b4\'eb\'b7\'ce, \'b1\'cd\'c7\'cf\'c0\'c7 \lang1033\f1\ldblquote\lang1042\f0\'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\lang1033\f1\rdblquote\lang1042\f0\'c0\'bb \'c0\'db\'b5\'bf\'bd\'c3\'c5\'b0\'b1\'e2 \'c0\'a7\'c7\'d1 \'b8\'f1\'c0\'fb\'b8\'b8\'c0\'bb \'c0\'a7\'c7\'d8 \lang1033\f1\ldblquote\lang1042\f0\'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'c0\'cf\'ba\'ce\'b7\'ce\'bc\'ad \'b9\'f8\'b5\'e9\'bf\'a1 \'c6\'f7\'c7\'d4\'c7\'d8\'bc\'ad\'b8\'b8 \'b9\'e8\'c6\'f7\'c7\'d8\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9. (ii)\lang1033\f1\~\ldblquote\lang1042\f0\'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\lang1033\f1\rdblquote\lang1042\f0\'c0\'ba \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'c1\'df\'bf\'e4\'c7\'cf\'b0\'ed \'b1\'d9\'ba\'bb\'c0\'fb\'c0\'ce \'b1\'e2\'b4\'c9\'bc\'ba\'c0\'bb \'c3\'df\'b0\'a1\'c7\'d8\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9. (iii)\lang1033\f1\~\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b1\'b8\'bc\'ba\'bf\'e4\'bc\'d2\'b8\'a6 \'b4\'eb\'c3\'bc\'c7\'cf\'b5\'b5\'b7\'cf \'c0\'c7\'b5\'b5\'b5\'c8 \'c3\'df\'b0\'a1 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\'b8\'a6 \'b9\'e8\'c6\'f7\'c7\'cf\'c1\'f6 \'be\'ca\'be\'c6\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9. (iv) \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'c6\'f7\'c7\'d4\'b5\'c8 \'c0\'e7\'bb\'ea\'b1\'c7\'c0\'bb \'b3\'aa\'c5\'b8\'b3\'bb\'b4\'c2 \'c7\'a5\'bd\'c3\'b3\'aa \'b9\'fc\'b7\'ca\'b8\'a6 \'c1\'a6\'b0\'c5\'c7\'cf\'b0\'c5\'b3\'aa \'ba\'af\'b0\'e6\'c7\'d8\'bc\'ad\'b4\'c2 \'be\'c8\'b5\'cb\'b4\'cf\'b4\'d9. (v) \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'c6\'f7\'c7\'d4\'b5\'c8 \'c1\'b6\'b0\'c7\'bf\'a1 \'b5\'fb\'b6\'f3 'Sun'\'c0\'c7 \'c0\'cc\'c0\'cd\'c0\'bb \'ba\'b8\'c8\'a3\'c7\'cf\'b4\'c2 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'b0\'e8\'be\'e0\'bf\'a1 \'b1\'e2\'c3\'ca\'c7\'d8\'bc\'ad\'b8\'b8 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'b8\'a6 \'b9\'e8\'c6\'f7\'c7\'d8\'be\'df \'c7\'d5\'b4\'cf\'b4\'d9. (vi) \lang1033\f1\ldblquote\lang1042\f0\'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\lang1033\f1\rdblquote\lang1042\f0 \'b9\'d7/\'b6\'c7\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'bb\'e7\'bf\'eb \'b6\'c7\'b4\'c2 \'b9\'e8\'c6\'f7\'b8\'a6 \'bb\'e7\'c0\'af\'b7\'ce \'c1\'a63\'c0\'da\'b0\'a1 \'c1\'a6\'b1\'e2\'c7\'cf\'b4\'c2 \'c5\'ac\'b7\'b9\'c0\'d3\'c0\'cc\'b3\'aa \'bc\'d2\'bc\'db\'b0\'fa \'b0\'fc\'b7\'c3\'c7\'cf\'bf\'a9 \'b9\'df\'bb\'fd\'b5\'c7\'b4\'c2 \'b8\'f0\'b5\'e7 \'bc\'d5\'c7\'d8, \'ba\'f1\'bf\'eb, \'c3\'a4\'b9\'ab, \'c8\'ad\'c7\'d8\'b1\'dd \'b9\'d7/\'b6\'c7\'b4\'c2 \'b0\'e6\'ba\'f1(\'ba\'af\'c8\'a3\'bb\'e7 \'ba\'f1\'bf\'eb \'c6\'f7\'c7\'d4)\'bf\'a1 \'b4\'eb\'c7\'d8 'Sun' \'b9\'d7 'Sun'\'bf\'a1 \'b4\'eb\'c7\'d1 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'c1\'a6\'b0\'f8\'c0\'da\'b8\'a6 \'ba\'b8\'c8\'a3\'c7\'cf\'b0\'ed \'b8\'e9\'c3\'a5\'bd\'c3\'c5\'b3 \'b0\'cd\'bf\'a1 \'b5\'bf\'c0\'c7\'c7\'d5\'b4\'cf\'b4\'d9. \par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 C.\tab Java \'b1\'e2\'bc\'fa \'b1\'d4\'c1\'a6\'bb\'e7\'c7\'d7.\b0 \'b1\'cd\'c7\'cf\'b4\'c2 \'be\'ee\'b6\'b2 \'b9\'e6\'bd\'c4\'c0\'b8\'b7\'ce\'b5\'e7 "java", "javax", "sun" \'b6\'c7\'b4\'c2 'Sun'\'c0\'cc \'c0\'d3\'c0\'c7\'c0\'c7 \'b8\'ed\'b8\'ed\'b1\'d4\'c4\'a2\'bf\'a1\'bc\'ad \'b8\'ed\'bd\'c3\'c7\'d1 \'b0\'cd\'b0\'fa \'c0\'af\'bb\'e7\'c7\'d1 \'c5\'ac\'b7\'a1\'bd\'ba, \'c0\'ce\'c5\'cd\'c6\'e4\'c0\'cc\'bd\'ba \'b6\'c7\'b4\'c2 \'c7\'cf\'c0\'a7 \'c6\'d0\'c5\'b0\'c1\'f6\'b8\'a6 \'c0\'db\'bc\'ba\'c7\'cf\'b0\'c5\'b3\'aa \'bc\'f6\'c1\'a4\'c7\'cf\'b0\'c5\'b3\'aa \'b6\'c7\'b4\'c2 \'c0\'cc\'b5\'e9\'c0\'c7 \'b5\'bf\'c0\'db\'c0\'bb \'ba\'af\'b0\'e6\'c7\'d8\'bc\'ad\'b4\'c2 \'be\'c8\'b5\'c7\'b8\'e7, \'b6\'c7\'c7\'d1 \'b1\'cd\'c7\'cf\'b0\'a1 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b8\'a6 \'ba\'ce\'bf\'a9\'c7\'d1 \'c0\'da(licensee)\'b7\'ce \'c7\'cf\'bf\'a9\'b1\'dd \'c0\'cc\'b5\'e9\'c0\'bb \'c0\'db\'bc\'ba\'c7\'cf\'b0\'c5\'b3\'aa \'bc\'f6\'c1\'a4\'c7\'cf\'b0\'c5\'b3\'aa \'b6\'c7\'b4\'c2 \'c0\'cc\'b5\'e9\'c0\'c7 \'b5\'bf\'c0\'db\'c0\'bb \'ba\'af\'b0\'e6\'c7\'d2 \'b1\'c7\'c7\'d1\'c0\'bb \'ba\'ce\'bf\'a9\'c7\'d8\'bc\'ad\'b5\'b5 \'be\'c8\'b5\'cb\'b4\'cf\'b4\'d9. \par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 D.\tab\'bc\'d2\'bd\'ba \'c4\'da\'b5\'e5.\b0 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1\'b4\'c2 \'b8\'ed\'bd\'c3\'c0\'fb\'c0\'b8\'b7\'ce \'b1\'e2\'c5\'b8 \'b8\'f1\'c0\'fb\'c0\'bb \'c0\'a7\'c7\'d8 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'b0\'a1 \'ba\'ce\'bf\'a9\'b5\'c7\'c1\'f6 \'be\'ca\'b4\'c2 \'c7\'d1 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'b1\'d4\'c1\'a4\'bf\'a1 \'b5\'fb\'b6\'f3 \'b4\'dc\'c1\'f6 \'c2\'fc\'c1\'b6\'bf\'eb(reference)\'c0\'b8\'b7\'ce\'b8\'b8 \'c1\'a6\'b0\'f8\'b5\'c7\'b4\'c2 \'bc\'d2\'bd\'ba \'c4\'da\'b5\'e5(Source Code)\'b0\'a1 \'c6\'f7\'c7\'d4\'b5\'c9 \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9. \'bc\'d2\'bd\'ba \'c4\'da\'b5\'e5\'b4\'c2 \lang1033\f1\ldblquote\lang1042\f0\'ba\'bb \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1\'bc\'ad \'b8\'ed\'bd\'c3\'c0\'fb\'c0\'b8\'b7\'ce \'b1\'d4\'c1\'a4\'b5\'c7\'c1\'f6 \'be\'ca\'b4\'c2 \'c7\'d1 \'c0\'e7\'b9\'e8\'c6\'f7\'b5\'c9 \'bc\'f6 \'be\'f8\'bd\'c0\'b4\'cf\'b4\'d9. \par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 E.\tab\'c1\'a63\'c0\'da \'c4\'da\'b5\'e5.\b0 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'c0\'cf\'ba\'ce\'bf\'a1 \'c0\'fb\'bf\'eb\'b5\'c7\'b4\'c2 \'c3\'df\'b0\'a1 \'c0\'fa\'c0\'db\'b1\'c7 \'c5\'eb\'c1\'f6 \'b9\'d7 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'c1\'b6\'c7\'d7\'c0\'ba THIRDPARTYLICENSEREADME.txt \'c6\'c4\'c0\'cf\'bf\'a1 \'b1\'e2\'c0\'e7\'b5\'c7\'be\'ee \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9. THIRDPARTYLICENSEREADME.txt \'c6\'c4\'c0\'cf\'bf\'a1 \'c6\'f7\'c7\'d4\'b5\'c8 \'c1\'a63\'c0\'da \'bf\'c0\'c7\'c2 \'bc\'d2\'bd\'ba/\'c7\'c1\'b8\'ae\'bf\'fe\'be\'ee \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba\'c0\'c7 \'c1\'b6\'b0\'c7 \'b9\'d7 \'c1\'b6\'c7\'d7 \'c0\'cc\'bf\'dc\'bf\'a1\'b5\'b5, \lang1033\f1\ldblquote\lang1042\f0\'c0\'cc\'c1\'f8 \'c4\'da\'b5\'e5 \'b6\'f3\'c0\'cc\'bc\'be\'bd\'ba \'b0\'e8\'be\'e0\lang1033\f1\rdblquote\lang1042\f0\'c0\'c7 \'c1\'a65\'c0\'fd \'b9\'d7 \'c1\'a66\'c0\'fd\'c0\'c7 \'c7\'b0\'c1\'fa\'ba\'b8\'c1\'f5\'c0\'c7 \'ba\'ce\'c0\'ce \'b9\'d7 \'c3\'a5\'c0\'d3\'c0\'c7 \'c1\'a6\'c7\'d1\'bf\'a1 \'b0\'fc\'c7\'d1 \'b1\'d4\'c1\'a4\'c0\'cc \'ba\'bb \'b9\'e8\'c6\'f7\'c0\'c7 \'b8\'f0\'b5\'e7 \lang1033\f1\ldblquote\lang1042\f0\'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\lang1033\f1\rdblquote\lang1042\f0\'bf\'a1 \'c0\'fb\'bf\'eb\'b5\'cb\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 F.\tab\'c0\'a7\'b9\'dd\'bf\'a1 \'b4\'eb\'c7\'d1 \'c1\'be\'b7\'e1.\b0 \'b4\'e7\'bb\'e7\'c0\'da\'b0\'a1 \'ba\'bb \'b0\'e8\'be\'e0\'c0\'bb \'c1\'be\'b7\'e1\'c7\'cf\'b4\'c2 \'c1\'ef\'bd\'c3 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee \'b6\'c7\'b4\'c2 \'b4\'e7\'bb\'e7\'c0\'da\'c0\'c7 \'c0\'c7\'b0\'df\'c0\'cc \'b8\'f0\'b5\'e7 \'c1\'f6\'c0\'fb \'c0\'e7\'bb\'ea\'b1\'c7\'c0\'c7 \'c0\'a7\'b9\'dd \'c3\'bb\'b1\'b8 \'b4\'eb\'bb\'f3\'c0\'cc \'b5\'c9 \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj\lang1033\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1042\b\f0 G.\tab\'bc\'b3\'c4\'a1 \'b9\'d7 \'c0\'da\'b5\'bf \'be\'f7\'b5\'a5\'c0\'cc\'c6\'ae.\b0 \'c7\'d8\'b4\'e7 \'bc\'d2\'c7\'c1\'c6\'ae\'bf\'fe\'be\'ee\'c0\'c7 \'bc\'b3\'c4\'a1 \'b9\'d7 \'c0\'da\'b5\'bf \'be\'f7\'b5\'a5\'c0\'cc\'c6\'ae \'b0\'fa\'c1\'a4\'c0\'ba Sun\'c0\'cc \'c6\'c4\'be\'c7 \'b9\'d7 \'c3\'d6\'c0\'fb\'c8\'ad\'c7\'d2 \'bc\'f6 \'c0\'d6\'b5\'b5\'b7\'cf \'c7\'d8\'c1\'d6\'b4\'c2 \'c0\'cc\'b7\'af\'c7\'d1 \'c6\'af\'c1\'a4 \'b0\'fa\'c1\'a4\'bf\'a1 \'b4\'eb\'c7\'d8 Sun (\'b6\'c7\'b4\'c2 \'bc\'ad\'ba\'f1\'bd\'ba \'b0\'f8\'b1\'de\'be\'f7\'c3\'bc) \'bf\'a1 \'c1\'a6\'c7\'d1\'b5\'c8 \'b5\'a5\'c0\'cc\'c5\'cd \'be\'e7\'c0\'bb \'bc\'db\'bd\'c5\'c7\'d5\'b4\'cf\'b4\'d9. Sun\'c0\'ba \'b5\'a5\'c0\'cc\'c5\'cd\'bf\'cd \'b0\'b3\'c0\'ce \'c1\'a4\'ba\'b8\'b8\'a6 \'bf\'ac\'b0\'fc\'bd\'c3\'c5\'b0\'c1\'f6 \'be\'ca\'bd\'c0\'b4\'cf\'b4\'d9. Sun\'c0\'cc \'bc\'f6\'c1\'fd\'c7\'cf\'b4\'c2 \'b5\'a5\'c0\'cc\'c5\'cd\'bf\'a1 \'b4\'eb\'c7\'d1 \'c0\'da\'bc\'bc\'c7\'d1 \'b3\'bb\'bf\'eb\'c0\'ba http://java.com/data/\'bf\'a1\'bc\'ad \'c3\'a3\'c0\'bb \'bc\'f6 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9.\par -\pard\nowidctlpar\qj \par -\'c0\'c7\'b9\'ae \'bb\'e7\'c7\'d7\'c0\'cc \'c0\'d6\'c0\'b8\'b8\'e9 \'b4\'d9\'c0\'bd \'c1\'d6\'bc\'d2\'b7\'ce \'b9\'ae\'c0\'c7\'c7\'cf\'bd\'c3\'b1\'e2 \'b9\'d9\'b6\'f8\'b4\'cf\'b4\'d9. Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. \par -} diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_sv.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_sv.rtf deleted file mode 100644 index dcfd39d..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_sv.rtf +++ /dev/null @@ -1,210 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1041{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Arial};} -{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????????????????????\'a8\'ac????????};}{\f19\froman\fcharset128\fprq1{\*\panose 02020609040305080305}Mincho{\*\falt msmincho};} -{\f37\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f38\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Albany{\*\falt Arial};}{\f39\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Lucidasans;} -{\f40\froman\fcharset128\fprq1{\*\panose 00000000000000000000}@Mincho;}{\f52\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Microsoft Sans Serif;}{\f58\froman\fcharset238\fprq2 Times New Roman CE{\*\falt Arial};} -{\f59\froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Arial};}{\f61\froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Arial};}{\f62\froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Arial};} -{\f63\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Arial};}{\f64\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Arial};}{\f65\froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Arial};} -{\f66\froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Arial};}{\f190\fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????????????????????\'a8\'ac????????};}{\f430\fnil\fcharset0\fprq2 @SimSun Western;} -{\f578\fswiss\fcharset238\fprq2 Microsoft Sans Serif CE;}{\f579\fswiss\fcharset204\fprq2 Microsoft Sans Serif Cyr;}{\f581\fswiss\fcharset161\fprq2 Microsoft Sans Serif Greek;}{\f582\fswiss\fcharset162\fprq2 Microsoft Sans Serif Tur;} -{\f583\fbidi \fswiss\fcharset177\fprq2 Microsoft Sans Serif (Hebrew);}{\f584\fbidi \fswiss\fcharset178\fprq2 Microsoft Sans Serif (Arabic);}{\f585\fswiss\fcharset186\fprq2 Microsoft Sans Serif Baltic;} -{\f586\fswiss\fcharset163\fprq2 Microsoft Sans Serif (Vietnamese);}{\f587\fswiss\fcharset222\fprq2 Microsoft Sans Serif (Thai);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255; -\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;} -{\stylesheet{\ql \li0\ri0\nowidctlpar\wrapdefault\aspalpha\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \snext0 Normal;}{\*\cs10 \additive -Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{ -\s15\ql \li0\ri0\sb240\sa120\keepn\nowidctlpar\wrapdefault\aspalpha\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs28\alang1025 \ltrch\fcs0 \fs28\lang1033\langfe2052\loch\f38\hich\af38\dbch\af19\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext16 Heading;}{ -\s16\ql \li0\ri0\sa120\nowidctlpar\wrapdefault\aspalpha\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext16 Body Text;}{ -\s17\ql \li0\ri0\sa120\nowidctlpar\wrapdefault\aspalpha\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f39\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon16 \snext17 List;}{ -\s18\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\faauto\rin0\lin0\itap0 \rtlch\fcs1 \ai\af39\afs24\alang1025 \ltrch\fcs0 \i\fs24\lang1033\langfe2052\loch\f39\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext18 caption;}{ -\s19\ql \li0\ri0\nowidctlpar\wrapdefault\aspalpha\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af39\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\f39\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext19 Index;}} -{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid4915744\rsid6448551\rsid7472940\rsid8683473\rsid9205983\rsid10844074\rsid15688815}{\*\generator Microsoft Word 11.0.0000;}{\info{\operator Leo}{\creatim\yr2007\mo10\dy2\hr9\min29} -{\revtim\yr2009\mo6\dy15\hr16\min13}{\printim\yr2113\mo1\dy1}{\version6}{\edmins13}{\nofpages3}{\nofwords2041}{\nofchars11634}{\nofcharsws13648}{\vern24615}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} -\paperw12240\paperh15840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 -\jcompress\viewkind1\viewscale150\rsidroot7472940 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect\sbknone\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid7472940 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 { -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 Sun Microsystems, Inc. -\par }\pard \ltrpar\qc \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 Licensavtal betr\'e4\loch\f52 \hich\f52 -ffande bin\'e4\loch\f52 rkod}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074\charrsid7472940 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1036\langfe2052\langnp1036\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 f\'f6\loch\f52 r}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074\charrsid7472940 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1036\langfe2052\langnp1036\insrsid10844074 -\par \hich\af52\dbch\af13\loch\f52 JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1036\langfe2052\langnp1036\insrsid7472940 \hich\af52\dbch\af13\loch\f52 SAMT JAVAFIX RUNTIME VERSION 1}{\rtlch\fcs1 \af52\afs16 -\ltrch\fcs0 \f52\fs16\lang1036\langfe2052\langnp1036\insrsid10844074 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1036\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1036\insrsid10844074 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4915744 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074\charrsid6448551 \hich\af52\dbch\af13\loch\f52 SUN MICROSYSTEMS, INC. }{ -\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 (\'94\loch\f52 \hich\f52 SUN\'94\loch\f52 \hich\f52 ) \'c4\loch\f52 \hich\f52 R VILLIGT ATT LICENSIERA NEDANST\'c5 -\loch\f52 \hich\f52 ENDE PROGRAMVARA TILL ER ENDAST UNDER F\'d6\loch\f52 \hich\f52 RUTS\'c4\hich\af52\dbch\af13\loch\f52 \hich\f52 TTNING ATT NI ACCEPTERAR ALLA VILLKOR I DETTA LICENSAVTAL BETR\'c4\loch\f52 \hich\f52 FFANDE BIN\'c4\loch\f52 \hich\f52 -RKOD OCH TILL\'c4\loch\f52 \hich\f52 GGSVILLKOREN F\'d6\loch\f52 \hich\f52 R LICENSAVTAL (TILLSAMMANS KALLADE \'94\loch\f52 \hich\f52 AVTALET\'94\loch\f52 ).}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid4915744 -\hich\af52\dbch\af13\loch\f52 }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid4915744\charrsid4915744 \hich\af52\dbch\af13\loch\f52 \hich\f52 GENOM ATT ANV\'c4\loch\f52 \hich\f52 NDA PROGRAMVARAN BEKR\'c4\loch\f52 -\hich\f52 FTAR DU ATT DU HAR L\'c4\loch\f52 \hich\f52 ST IGENOM ANV\'c4\loch\f52 \hich\f52 NDARVILLKOREN OCH ATT DU GODTAR DEM. OM DU GODTAR VILLKOREN \'c5\loch\f52 \hich\f52 ETT F\'d6\loch\f52 RETAGS ELLER EN ANNAN JURIDISK PERSONS -\hich\af52\dbch\af13\loch\f52 \hich\f52 V\'c4\loch\f52 \hich\f52 GNAR M\'c5\loch\f52 \hich\f52 STE DU HA EN FULLMAKT SOM GER DIG R\'c4\loch\f52 \hich\f52 TT ATT SLUTA AVTAL F\'d6\loch\f52 \hich\f52 R DEN JURIDISKA PERSONENS R\'c4\loch\f52 \hich\f52 -KNING. OM DU SAKNAR EN S\'c5\loch\f52 \hich\f52 DAN FULLMAKT (ELLER OM DU INTE VILL ING\'c5\loch\f52 \hich\f52 AVTALET) M\'c5\loch\f52 \hich\f52 STE DU UPPH\'d6\loch\f52 \hich\f52 RA ATT ANV\'c4\loch\f52 \hich\f52 NDA PROGRAMVARAN P\'c5\loch\f52 -\hich\f52 DEN H\'c4\loch\f52 \hich\f52 R WEBBPLATSEN OCH P\'c5\loch\f52 ANDRA MEDIER D\loch\af52\dbch\af13\hich\f52 \'c4\hich\af52\dbch\af13\loch\f52 R DEN FINNS LAGRAD.}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074\charrsid7472940 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-360\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 1.\tab \hich\f52 DEFINITIONER. \'94 -\loch\f52 \hich\f52 Programvara\'94\loch\f52 \hich\f52 avser den produkt som anges ovan i bin\'e4\loch\f52 \hich\f52 r form, allt annat maskinl\'e4\loch\f52 \hich\f52 sbart material (inklusive, men inte begr\'e4\loch\f52 \hich\f52 nsat till, bibliotek, k -\'e4\loch\f52 llfiler, rubrikfiler och datafiler), alla upp\hich\af52\dbch\af13\loch\f52 \hich\f52 dateringar eller felkorrigeringar som tillhandah\'e5\loch\f52 \hich\f52 llits av Sun och alla anv\'e4\loch\f52 \hich\f52 ndarhandb\'f6\loch\f52 \hich\f52 -cker, programmeringshandb\'f6\loch\f52 \hich\f52 cker och annan dokumentation som tillhandah\'e5\loch\f52 \hich\f52 llits av Sun till Er enligt detta Avtal. Med \'94\loch\f52 \hich\f52 Skrivbordsdatorer och servrar f\'f6\loch\f52 \hich\f52 r allm\'e4 -\loch\f52 \hich\f52 nt bruk\'94\loch\f52 avses \hich\af52\dbch\af13\loch\f52 d\hich\af52\dbch\af13\loch\f52 ator}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid6448551 \hich\af52\dbch\af13\loch\f52 \hich\f52 -er, inklusive skrivbordsdatorer och b\'e4\loch\f52 rbara datorer}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 , eller servrar, avsedda f\'f6\loch\f52 \hich\f52 r allm -\'e4\loch\f52 \hich\f52 n databehandling under slutanv\'e4\loch\f52 \hich\f52 ndarens kontroll (funktioner som inte s\'e4\loch\f52 \hich\f52 rskilt begr\'e4\loch\f52 \hich\f52 nsas till e-post, allm\'e4\loch\f52 \hich\f52 n webbl\'e4\loch\f52 \hich\f52 -sning och Officesvit-produktivitetsverktyg). Anv\'e4\loch\f52 ndn\hich\af52\dbch\af13\loch\f52 \hich\f52 ing av Programvara i system och l\'f6\loch\f52 sningar som erbjuder }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\lang1053\langfe2052\langnp1053\insrsid8683473 \hich\af52\dbch\af13\loch\f52 avsedd}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 funktionalitet (annat \'e4 -\loch\f52 \hich\f52 n vad som n\'e4\loch\f52 \hich\f52 mns ovan) eller som utformats f\'f6\loch\f52 \hich\f52 r bruk i inb\'e4\loch\f52 \hich\f52 ddade eller funktionsspecifika programvarutill\'e4\loch\f52 \hich\f52 -mpningar, till exempel: Programvara som inb\'e4\loch\f52 ddas i eller }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid6448551 \hich\af52\dbch\af13\loch\f52 packas }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 med\hich\af52\dbch\af13\loch\f52 \hich\f52 industriella styrsystem, tr\'e5\loch\f52 \hich\f52 dl\'f6\loch\f52 \hich\f52 s mobiltelefoni, tr\'e5\loch\f52 \hich\f52 dl -\'f6\loch\f52 sa handenheter, }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid6448551 \hich\af52\dbch\af13\loch\f52 \hich\f52 n\'e4\loch\f52 \hich\f52 tb\'f6\loch\f52 cker, }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 -\f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 kiosker, TV/STB, Blu-ray-skivenheter, telematik och n\'e4\loch\f52 \hich\f52 -tverkskontrollomkopplare, skrivare och lagringsadministreringssystem och andra relaterade system exkluderas fr\'e5\loch\f52 n denna d\hich\af52\dbch\af13\loch\f52 \hich\f52 efinition och licensieras inte under detta Avtal. \'94\loch\f52 \hich\f52 Program -\'94}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid7472940 \hich\af52\dbch\af13\loch\f52 a}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 -vser}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid7472940 \hich\af52\dbch\af13\loch\f52 (a)}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 -\hich\af52\dbch\af13\loch\f52 \hich\f52 Java-applets och applikationer som \'e4\loch\f52 \hich\f52 r avsedda att k\'f6\loch\f52 \hich\f52 ras p\'e5\loch\f52 \hich\f52 plattformen Java Platform, Standard Edition (Java SE) p\'e5\loch\f52 \hich\f52 Java-f -\'f6\loch\f52 \hich\f52 rberedda skrivbordsdatorer och servrar f\'f6\loch\f52 \hich\f52 r allm\'e4}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid7472940 \hich\af52\dbch\af13\loch\f52 nt bruk, samt -\hich\af52\dbch\af13\loch\f52 \hich\f52 (b) JavaFX-applikationer som \'e4\loch\f52 \hich\f52 r avsedda att k\'f6\loch\f52 \hich\f52 ras med JavaFX Runtime p\'e5\loch\f52 \hich\f52 Java FX-f\'f6\loch\f52 \hich\f52 rberedda skrivbordsdatorer och servrar f -\'f6\loch\f52 \hich\f52 r allm\'e4\loch\f52 nt bruk. }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-360\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 2.\tab \hich\f52 LICENS F\'d6\loch\f52 -\hich\f52 R ANV\'c4\loch\f52 \hich\f52 NDNING. I enlighet med villkoren och best\'e4\loch\f52 \hich\f52 mmelserna i detta Avtal inklusive, men inte begr\'e4\loch\f52 nsat t\hich\af52\dbch\af13\loch\f52 \hich\f52 ill, Java-teknikrestriktionerna i Till\'e4 -\loch\f52 \hich\f52 ggsvillkoren f\'f6\loch\f52 \hich\f52 r licensavtal, beviljar Sun Er en icke-exklusiv, icke-\'f6\loch\f52 \hich\f52 verl\'e5\loch\f52 \hich\f52 tbar, begr\'e4\loch\f52 \hich\f52 nsad licens utan licensavgifter f\'f6\loch\f52 \hich\f52 -r att i fullst\'e4\loch\f52 \hich\f52 ndigt och of\'f6\loch\f52 \hich\f52 r\'e4\loch\f52 \hich\f52 ndrat skick internt reproducera och anv\'e4\loch\f52 nda Programvaran, endast i\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 \hich\f52 -syfte att k\'f6\loch\f52 \hich\f52 ra Program. Ytterligare licenser f\'f6\loch\f52 \hich\f52 r utvecklare och/eller utgivare beviljas i Till\'e4\loch\f52 \hich\f52 ggsvillkoren f\'f6\loch\f52 r licensavtal. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-360\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 3.\tab \hich\f52 BEGR\'c4\loch\f52 -\hich\f52 NSNINGAR. Programvaran \'e4\loch\f52 \hich\f52 r konfidentiell och upphovsr\'e4\loch\f52 \hich\f52 ttsligt skyddad. \'c4\loch\f52 \hich\f52 gander\'e4\loch\f52 \hich\f52 tten till Programvaran och alla tillh\'f6\loch\f52 rande -\hich\af52\dbch\af13\loch\f52 \hich\f52 immateriella r\'e4\loch\f52 \hich\f52 ttigheter kvarst\'e5\loch\f52 \hich\f52 r hos Sun och/eller dess licensgivare. Med undantag av vad som \'e4\loch\f52 \hich\f52 r f\'f6\loch\f52 \hich\f52 -rbjudet enligt tvingande lagstiftning f\'e5\loch\f52 \hich\f52 r Ni inte modifiera, dekompilera eller efterforska Programvarans k\'e4\loch\f52 llkod. Licensinnehavaren godtar att den licensie\hich\af52\dbch\af13\loch\f52 r\hich\af52\dbch\af13\loch\f52 -\hich\f52 ade Programvaran inte \'e4\loch\f52 \hich\f52 r utformad eller avsedd f\'f6\loch\f52 \hich\f52 r anv\'e4\loch\f52 \hich\f52 ndning vid utformning, konstruktion, drift eller underh\'e5\loch\f52 \hich\f52 ll av k\'e4\loch\f52 \hich\f52 rnkraftsanl -\'e4\loch\f52 \hich\f52 ggningar. Sun Microsystems, Inc. friskriver sig fr\'e5\loch\f52 \hich\f52 n alla uttryckliga eller underf\'f6\loch\f52 \hich\f52 rst\'e5\loch\f52 \hich\f52 dda garantier om l\'e4\loch\f52 \hich\f52 mplighet f\'f6\loch\f52 -\hich\f52 r s\'e5\loch\f52 dan\hich\af52\dbch\af13\loch\f52 a\hich\af52\dbch\af13\loch\f52 \hich\f52 \'e4\loch\f52 \hich\f52 ndam\'e5\loch\f52 \hich\f52 l. Ingen \'e4\loch\f52 \hich\f52 gander\'e4\loch\f52 \hich\f52 tt, inga r\'e4\loch\f52 \hich\f52 -ttigheter till eller intressen i n\'e5\loch\f52 \hich\f52 gra varum\'e4\loch\f52 \hich\f52 rken, servicem\'e4\loch\f52 \hich\f52 rken, logotyper eller aff\'e4\loch\f52 \hich\f52 rsnamn som tillh\'f6\loch\f52 \hich\f52 -r Sun eller deras licensgivare beviljas under detta Avtal. Ytterligare restriktioner f\'f6\loch\f52 r utvecklare och/eller utgivar\hich\af52\dbch\af13\loch\f52 e\hich\af52\dbch\af13\loch\f52 \hich\f52 anges i Till\'e4\loch\f52 \hich\f52 ggsvillkoren f -\'f6\loch\f52 r licensavtal. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-360\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 4.\tab \hich\f52 BEGR\'c4\loch\f52 -\hich\f52 NSAD GARANTI. Sun garanterar under en period om nittio (90) dagar fr\'e5\loch\f52 \hich\f52 n ink\'f6\loch\f52 \hich\f52 psdagen, i enlighet med en kopia av ink\'f6\loch\f52 \hich\f52 pskvittot, att de media som Programvaran levereras p\'e5 -\loch\f52 \hich\f52 (i till\'e4\loch\f52 \hich\f52 mpliga fall) \'e4\loch\f52 \hich\f52 r fria fr\'e5\loch\f52 n \hich\af52\dbch\af13\loch\f52 \hich\f52 felaktigheter i material och utf\'f6\loch\f52 \hich\f52 rande vid normal anv\'e4\loch\f52 \hich\f52 -ndning. Med undantag f\'f6\loch\f52 \hich\f52 r det f\'f6\loch\f52 \hich\f52 reg\'e5\loch\f52 \hich\f52 ende levereras Programvaran \'94\loch\f52 \hich\f52 i befintligt skick\'94\loch\f52 \hich\f52 -. Er enda kompensation och Suns totala ansvar under denna begr\'e4\loch\f52 \hich\f52 nsade garanti \'e4\loch\f52 \hich\f52 r att Sun, efter eget gottfinnande, ers\'e4\hich\af52\dbch\af13\loch\f52 t\hich\af52\dbch\af13\loch\f52 \hich\f52 -ter Programvarumedia eller \'e5\loch\f52 \hich\f52 terbetalar den avgift som Ni betalat f\'f6\loch\f52 \hich\f52 r Programvaran. Alla underf\'f6\loch\f52 \hich\f52 rst\'e5\loch\f52 \hich\f52 dda garantier avseende Programvaran \'e4\loch\f52 \hich\f52 -r begr\'e4\loch\f52 \hich\f52 nsade till 90 dagar. I vissa l\'e4\loch\f52 \hich\f52 nder till\'e5\loch\f52 \hich\f52 ts inga begr\'e4\loch\f52 \hich\f52 nsningar av varaktigheten f\'f6\loch\f52 \hich\f52 r en underf\'f6\loch\f52 \hich\f52 rst\'e5 -\loch\f52 dd garanti, va\hich\af52\dbch\af13\loch\f52 r\hich\af52\dbch\af13\loch\f52 \hich\f52 f\'f6\loch\f52 \hich\f52 r ovanst\'e5\loch\f52 \hich\f52 ende kanske inte g\'e4\loch\f52 \hich\f52 ller i Ert fall. Denna begr\'e4\loch\f52 \hich\f52 -nsade garanti ger Er specifika juridiska r\'e4\loch\f52 \hich\f52 ttigheter. Det kan finnas ytterligare r\'e4\loch\f52 \hich\f52 ttigheter, som varierar fr\'e5\loch\f52 n land till land. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-360\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 5.\tab \hich\f52 FRISKRIVNING FR\'c5 -\loch\f52 \hich\f52 N GARANTI. F\'d6\loch\f52 \hich\f52 RUTOM VAD SOM S\'c4\hich\af52\dbch\af13\loch\f52 \hich\f52 RSKILT ANGES I DETTA AVTAL FRISKRIVER SIG SUN FR\'c5\loch\f52 \hich\f52 N ALLA UTTRYCKLIGA ELLER UNDERF\'d6\loch\f52 \hich\f52 RST\'c5 -\loch\f52 \hich\f52 DDA VILLKOR, L\'d6\loch\f52 \hich\f52 FTEN OCH GARANTIER INKLUSIVE EVENTUELLA UNDERF\'d6\loch\f52 \hich\f52 RST\'c5\loch\f52 \hich\f52 DDA GARANTIER OM S\'c4\loch\f52 \hich\f52 LJBARHET, L\'c4\loch\f52 \hich\f52 MPLIGHET F\'d6 -\loch\f52 \hich\f52 R ETT VISST \'c4\loch\f52 \hich\f52 NDAM\'c5\loch\f52 \hich\f52 L ELLER ATT PRODUKTEN INTE UTG\'d6\loch\f52 \hich\f52 R INTR\'c5\loch\f52 NG I N\loch\af52\dbch\af13\hich\f52 \'c5\hich\af52\dbch\af13\loch\f52 \hich\f52 GONS R\'c4 -\loch\f52 \hich\f52 TT, DOCK INTE I DEN UTSTR\'c4\loch\f52 \hich\f52 CKNING SOM DESSA FRISKRIVNINGAR \'c4\loch\f52 R OGILTIGA ENLIGT TVINGANDE LAGSTIFTNING. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-360\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 6.\tab \hich\f52 ANSVARSBEGR\'c4 -\loch\f52 \hich\f52 NSNING. I DEN M\'c5\loch\f52 \hich\f52 N ANNAT INTE F\'d6\loch\f52 \hich\f52 LJER AV TVINGANDE LAGSTIFTNING KOMMER SUN ELLER SUNS LICENSGIVARE INTE UNDER N\'c5\loch\f52 \hich\f52 GRA OMST\'c4\loch\f52 NDIGHETER ATT -\hich\af52\dbch\af13\loch\f52 \hich\f52 ANSVARA F\'d6\loch\f52 \hich\f52 R F\'d6\loch\f52 \hich\f52 RLORADE INKOMSTER, VINSTER ELLER DATA, ELLER F\'d6\loch\f52 \hich\f52 R S\'c4\loch\f52 \hich\f52 RSKILDA SKADOR, INDIREKTA SKADOR, F\'d6\loch\f52 -\hich\f52 LJDSKADOR, OAVSIKTLIGA SKADOR ELLER IDEELLA SKADOR, OAVSETT ORSAK TILL SKADORNA OCH OAVSETT ANSVARSGRUND OM SKADORNA HAR UPPST\'c5\loch\f52 TT VID ELLER I ANSLUTNING \hich\af52\dbch\af13\loch\f52 T\hich\af52\dbch\af13\loch\f52 \hich\f52 ILL ANV -\'c4\loch\f52 \hich\f52 NDNING AV ELLER OF\'d6\loch\f52 \hich\f52 RM\'c5\loch\f52 \hich\f52 GA ATT ANV\'c4\loch\f52 \hich\f52 NDA PROGRAMVARAN. DETTA G\'c4\loch\f52 \hich\f52 LLER \'c4\loch\f52 \hich\f52 VEN OM SUN HAR INFORMERATS OM M\'d6\loch\f52 -\hich\f52 JLIGHETEN AV S\'c5\loch\f52 \hich\f52 DANA SKADOR. Under inga omst\'e4\loch\f52 \hich\f52 ndigheter, vare sig enligt kontrakt, kr\'e4\loch\f52 \hich\f52 nkning (f\'f6\loch\f52 \hich\f52 rsumlighet) eller p\'e5\loch\f52 \hich\f52 annat s\'e4 -\loch\f52 tt, skall Suns ansvar gente\hich\af52\dbch\af13\loch\f52 m\hich\af52\dbch\af13\loch\f52 \hich\f52 ot Er \'f6\loch\f52 \hich\f52 verstiga det belopp Ni har betalat f\'f6\loch\f52 \hich\f52 -r Programvaran i enlighet med detta Avtal. De ovan beskrivna begr\'e4\loch\f52 \hich\f52 nsningarna kommer att g\'e4\loch\f52 \hich\f52 lla \'e4\loch\f52 \hich\f52 ven om den ovan n\'e4\loch\f52 \hich\f52 mnda garantin inte kan anses g\'e4\loch\f52 -\hich\f52 lla i sitt egentliga syfte. Vissa l\'e4\loch\f52 \hich\f52 nder till\'e5\loch\f52 ter inte friskrivning\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 \hich\f52 fr\'e5\loch\f52 \hich\f52 n of\'f6\loch\f52 \hich\f52 -rutsedda skador eller f\'f6\loch\f52 \hich\f52 ljdskador, varf\'f6\loch\f52 \hich\f52 r vissa av ovanst\'e5\loch\f52 \hich\f52 ende villkor kanske inte g\'e4\loch\f52 ller i Ert fall. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-360\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 7.\tab \hich\f52 UPPS\'c4\loch\f52 -\hich\f52 GNING. Detta Avtal g\'e4\loch\f52 \hich\f52 ller tills det s\'e4\loch\f52 \hich\f52 gs upp. Ni kan s\'e4\loch\f52 \hich\f52 ga upp detta Avtal n\'e4\loch\f52 \hich\f52 r som helst genom att f\'f6\loch\f52 \hich\f52 rst\'f6\loch\f52 -ra alla exemplar av Programvaran.\hich\af52\dbch\af13\loch\f52 \hich\f52 Detta Avtal kommer att upph\'f6\loch\f52 \hich\f52 ra att g\'e4\loch\f52 \hich\f52 lla omedelbart utan f\'f6\loch\f52 \hich\f52 reg\'e5\loch\f52 \hich\f52 ende upps\'e4\loch\f52 -\hich\f52 gning fr\'e5\loch\f52 \hich\f52 n Sun om Ni underl\'e5\loch\f52 \hich\f52 ter att uppfylla n\'e5\loch\f52 \hich\f52 got av villkoren i detta Avtal. B\'e5\loch\f52 \hich\f52 da parter har r\'e4\loch\f52 \hich\f52 tt att omedelbart s\'e4\loch\f52 -\hich\f52 ga upp detta Avtal om n\'e5\loch\f52 \hich\f52 gon Programvara blir, eller enligt n\'e5\loch\f52 gon\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 \hich\f52 parts uppfattning sannolikt kommer att bli, f\'f6\loch\f52 \hich\f52 rem -\'e5\loch\f52 \hich\f52 l f\'f6\loch\f52 \hich\f52 r intr\'e5\loch\f52 \hich\f52 ngstalan r\'f6\loch\f52 \hich\f52 rande n\'e5\loch\f52 \hich\f52 gon immateriell r\'e4\loch\f52 \hich\f52 ttighet. N\'e4\loch\f52 \hich\f52 r Ni s\'e4\loch\f52 \hich\f52 -ger upp detta Avtal m\'e5\loch\f52 \hich\f52 ste Ni f\'f6\loch\f52 \hich\f52 rst\'f6\loch\f52 ra alla exemplar av Programvaran. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-354\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 8.\tab \hich\af52\dbch\af13\loch\f52 -\hich\f52 EXPORTLAGSTIFTNING. All Programvara och teknisk information som levereras enligt detta Avtal omfattas av USA:s exportlagstiftning och kan omfattas av export- eller importlagstiftning i andra l\'e4\loch\f52 \hich\f52 -nder. Ni samtycker till att strikt f\'f6\loch\f52 \hich\f52 lja alla s\'e5\loch\f52 dana lagar och\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 \hich\f52 regler och \'e4\loch\f52 \hich\f52 r inf\'f6\loch\f52 \hich\f52 rst\'e5\loch\f52 -\hich\f52 dd med att Ni har ansvar f\'f6\loch\f52 \hich\f52 r att skaffa s\'e5\loch\f52 \hich\f52 dana export-, vidareexport- eller importlicenser som kan komma att kr\'e4\loch\f52 vas efter leveransen till Er. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\tx778\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-354\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 9.\tab \hich\f52 VARUM\'c4\loch\f52 -\hich\f52 RKEN OCH LOGOTYPER. Ni godtar och samtycker till att Sun \'e4\loch\f52 \hich\f52 ger varum\'e4\loch\f52 rkena SUN, SOL\hich\af52\dbch\af13\loch\f52 \hich\f52 ARIS, JAVA, JINI, FORTE och iPLANET, samt alla varum\'e4\loch\f52 \hich\f52 rken, tj -\'e4\loch\f52 \hich\f52 nstem\'e4\loch\f52 \hich\f52 rken, logotyper och andra m\'e4\loch\f52 \hich\f52 rkesbeteckningar relaterade till SUN, SOLARIS, JAVA, JINI, FORTE och iPLANET (\'94\loch\f52 \hich\f52 Sun-m\'e4\loch\f52 \hich\f52 rken\'94\loch\f52 -\hich\f52 ), och Ni samtycker till att f\'f6\loch\f52 \hich\f52 lja kraven f\'f6\loch\f52 \hich\f52 r anv\'e4\loch\f52 ndning av Suns varu\hich\af52\dbch\af13\loch\f52 m\loch\af52\dbch\af13\hich\f52 \'e4\loch\f52 \hich\f52 rken och logotyper som f\'f6 -\loch\f52 \hich\f52 r n\'e4\loch\f52 \hich\f52 rvarande finns p\'e5\loch\f52 \hich\f52 http://www.sun.com/policies/trademarks. All Er anv\'e4\loch\f52 \hich\f52 ndning av Sun-m\'e4\loch\f52 \hich\f52 rken skall ske p\'e5\loch\f52 \hich\f52 s\'e5 -\loch\f52 \hich\f52 s\'e4\loch\f52 tt att det gagnar Sun. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\tx778\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-354\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 10.\tab \hich\f52 BEGR\'c4\loch\f52 -\hich\f52 NSADE R\'c4\loch\f52 \hich\f52 TTIGHETER F\'d6\loch\f52 \hich\f52 R USA:S STATSMAKT. Om Programvaran f\'f6\loch\f52 \hich\f52 rv\'e4\loch\f52 rvas av USA:s statsmakt, \hich\af52\dbch\af13\loch\f52 \hich\f52 f\'f6\loch\f52 \hich\f52 r dess r\'e4 -\loch\f52 \hich\f52 kning eller av en entrepren\'f6\loch\f52 \hich\f52 r eller underentrepren\'f6\loch\f52 \hich\f52 r som anlitats av USA:s statsmakt (oavsett niv\'e5\loch\f52 \hich\f52 ) skall statsmaktens r\'e4\loch\f52 \hich\f52 -ttigheter till Programvaran och medf\'f6\loch\f52 \hich\f52 ljande dokumentation vara begr\'e4\loch\f52 \hich\f52 nsad till vad som anges i detta Avtal. Detta \'e4\loch\f52 r i enlig\hich\af52\dbch\af13\loch\f52 h\hich\af52\dbch\af13\loch\f52 \hich\f52 -et med 48 CFR 227.7201 till och med 227.7202-4 (f\'f6\loch\f52 \hich\f52 r f\'f6\loch\f52 \hich\f52 rv\'e4\loch\f52 \hich\f52 rv av Department of Defense (DOD)) och i enlighet med 48 CFR 2.101 och 12.212 (f\'f6\loch\f52 \hich\f52 r f\'f6\loch\f52 -\hich\f52 rv\'e4\loch\f52 \hich\f52 rv som inte g\'f6\loch\f52 rs av DOD). -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\tx778\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-354\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 11.\tab \hich\f52 TILL\'c4\loch\f52 -\hich\f52 MPLIG LAG. Kalifornisk lag och till\'e4\loch\f52 mplig amerikansk federal lagstiftning s\hich\af52\dbch\af13\loch\f52 \hich\f52 kall till\'e4\loch\f52 \hich\f52 mpas p\'e5\loch\f52 \hich\f52 - detta Avtal. Ingen jurisdiktions lagvalsregler skall vara till\'e4\loch\f52 \hich\f52 mpliga p\'e5\loch\f52 detta Avtal. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\tx778\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-354\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 12.\tab \hich\f52 SEPARERBARHET. Om n -\'e5\loch\f52 \hich\f52 gon del av detta Avtal anses vara ogiltig kommer Avtalet att forts\'e4\loch\f52 \hich\f52 tta att vara g\'e4\loch\f52 \hich\f52 llande med den ogiltiga delen undantagen, s\'e5\loch\f52 v\hich\af52\dbch\af13\loch\f52 \hich\f52 -ida inte undantaget skulle om\'f6\loch\f52 \hich\f52 jligg\'f6\loch\f52 \hich\f52 ra parternas intentioner, i vilket fall detta Avtal omedelbart upph\'f6\loch\f52 \hich\f52 r att g\'e4\loch\f52 lla. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\tx778\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }\pard \ltrpar\ql \fi-354\li780\ri0\nowidctlpar\tx780\wrapdefault\faauto\rin0\lin780\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 13.\tab \hich\f52 -INTEGRERING. Detta Avtal \'e4\loch\f52 \hich\f52 r det fullst\'e4\loch\f52 \hich\f52 ndiga avtalet mellan Er och Sun betr\'e4\loch\f52 \hich\f52 ffande det inneh\'e5\loch\f52 \hich\f52 ll det ber\'f6\loch\f52 \hich\f52 r. Det ers\'e4\loch\f52 -tter alla tidigare \hich\af52\dbch\af13\loch\f52 \hich\f52 eller samtidiga muntliga eller skriftliga kommunikationer, f\'f6\loch\f52 \hich\f52 rslag, l\'f6\loch\f52 \hich\f52 ften och garantier samt har f\'f6\loch\f52 \hich\f52 retr\'e4\loch\f52 -\hich\f52 de framf\'f6\loch\f52 \hich\f52 r motstridiga eller ytterligare villkor i offerter, order, bekr\'e4\loch\f52 \hich\f52 ftelser eller annan kommunikation mellan parterna betr\'e4\loch\f52 \hich\f52 ffande det inneh\'e5\loch\f52 ll so -\hich\af52\dbch\af13\loch\f52 m\hich\af52\dbch\af13\loch\f52 \hich\f52 Avtalet ber\'f6\loch\f52 \hich\f52 r under Avtalets giltighetstid. \'c4\loch\f52 \hich\f52 ndringar av detta Avtal \'e4\loch\f52 \hich\f52 r inte bindande s\'e5\loch\f52 \hich\f52 -vida dessa inte \'e4\loch\f52 \hich\f52 r skriftliga och har undertecknats av beh\'f6\loch\f52 \hich\f52 riga f\'f6\loch\f52 \hich\f52 retr\'e4\loch\f52 \hich\f52 dare f\'f6\loch\f52 r respektive part. -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 TILL\'c4\loch\f52 \hich\f52 GGSVILLKOR F\'d6\loch\f52 R LICENSAVTAL -\par -\par \hich\af52\dbch\af13\loch\f52 \hich\f52 Dessa \'94\loch\f52 \hich\f52 Till\'e4\loch\f52 \hich\f52 ggsvillkor f\'f6\loch\f52 r licensavt\hich\af52\dbch\af13\loch\f52 \hich\f52 al\'94\loch\f52 \hich\f52 \'e4\loch\f52 \hich\f52 r ett till\'e4\loch\f52 -\hich\f52 gg till eller \'e4\loch\f52 \hich\f52 ndrar villkoren i Licensavtal betr\'e4\loch\f52 \hich\f52 ffande bin\'e4\loch\f52 \hich\f52 rkod. Termer som inleds med versal och som inte definierats i dessa Till\'e4\loch\f52 \hich\f52 -ggsvillkor skall ha samma betydelse som de har i Licensavtal betr\'e4\loch\f52 \hich\f52 ffande bin\'e4\loch\f52 \hich\f52 rkod. Till\'e4\loch\f52 ggsvillkoren skal\hich\af52\dbch\af13\loch\f52 l\hich\af52\dbch\af13\loch\f52 \hich\f52 ers\'e4\loch\f52 -\hich\f52 tta eventuellt of\'f6\loch\f52 \hich\f52 renliga eller stridande villkor i Licensavtal betr\'e4\loch\f52 \hich\f52 ffande bin\'e4\loch\f52 \hich\f52 rkod eller annan licens som medf\'f6\loch\f52 ljer Programvaran. -\par -\par }\pard \ltrpar\ql \fi-294\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 A.\tab \hich\f52 Internt anv\'e4 -\loch\f52 \hich\f52 ndande av programvara och utvecklingslicensbeviljande. Enligt anv\'e4\loch\f52 ndarvillkoren i detta Avtal och restr\hich\af52\dbch\af13\loch\f52 \hich\f52 iktioner och undantag i enlighet med Programvarans \'94\loch\f52 \hich\f52 -README\'94\loch\f52 \hich\f52 fil inf\'f6\loch\f52 \hich\f52 rlivad h\'e4\loch\f52 \hich\f52 refter med referens, inkluderat, men inte begr\'e4\loch\f52 \hich\f52 nsat till Java Technology restriktioner av dessa till\'e4\loch\f52 \hich\f52 -ggsvillkor, beviljar Sun dig en icke exklusiv, icke \'f6\loch\f52 \hich\f52 verf\'f6\loch\f52 \hich\f52 rbar, begr\'e4\loch\f52 nsad, av\hich\af52\dbch\af13\loch\f52 g\hich\af52\dbch\af13\loch\f52 \hich\f52 iftsfri licens f\'f6\loch\f52 \hich\f52 -r att reproducera och anv\'e4\loch\f52 \hich\f52 nda Programvaran komplett och icke modifierad internt i syftet f\'f6\loch\f52 r design, utveckling och testning av dina program. -\par -\par \hich\af52\dbch\af13\loch\f52 B.\tab Licens att \hich\af52\dbch\af13\loch\f52 \hich\f52 distribuera programvaran. I enlighet med villkoren i detta Avtal och de restriktioner och undantag som beskrivs i Programvarans \'94\loch\f52 \hich\f52 README\'94 -\loch\f52 \hich\f52 -fil, inklusive men inte begr\'e4\loch\f52 \hich\f52 nsat till, Begr\'e4\loch\f52 \hich\f52 nsningar i Javateknologi i dessa Till\'e4\loch\f52 \hich\f52 ggsvillkor f\'f6\loch\f52 r licensavtal, bevilja\hich\af52\dbch\af13\loch\f52 r -\hich\af52\dbch\af13\loch\f52 \hich\f52 Sun Er en icke-exklusiv, icke-\'f6\loch\f52 \hich\f52 verl\'e5\loch\f52 \hich\f52 tbar och begr\'e4\loch\f52 \hich\f52 nsad licens utan avgifter att framst\'e4\loch\f52 lla exemplar av och distribuera Programvaran} -{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid7472940 \hich\af52\dbch\af13\loch\f52 (med undantag av JavaFX Runtime)}{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 -\hich\af52\dbch\af13\loch\f52 \hich\f52 , under f\'f6\loch\f52 \hich\f52 ruts\'e4\loch\f52 \hich\f52 ttning att: (i) Ni distribuerar hela Programvaran i fullst\'e4\loch\f52 \hich\f52 ndigt och of\'f6\loch\f52 \hich\f52 r\'e4\loch\f52 nd -\hich\af52\dbch\af13\loch\f52 \hich\f52 rat skick och enbart tillsammans med som en del av och i syfte att k\'f6\loch\f52 \hich\f52 ra Era Program; (ii) Programmen ger Programvaran v\'e4\loch\f52 \hich\f52 sentlig och prim\'e4\loch\f52 \hich\f52 -r funktionalitet; (iii) Ni inte distribuerar ytterligare programvara som \'e4\loch\f52 \hich\f52 r avsedd att ers\'e4\loch\f52 \hich\f52 tta n\'e5\loch\f52 \hich\f52 gon eller n\'e5\loch\f52 gra av ko\hich\af52\dbch\af13\loch\f52 m -\hich\af52\dbch\af13\loch\f52 \hich\f52 ponenterna i Programvaran; (iv) Ni inte tar bort eller \'e4\loch\f52 \hich\f52 ndrar n\'e5\loch\f52 \hich\f52 gra r\'e4\loch\f52 \hich\f52 -ttighetsmeddelanden eller andra meddelanden i Programvaran; (v) Ni endast distribuerar Programvaran i enlighet med ett licensavtal som skyddar Suns intressen och som \'e4\loch\f52 r i enlighet med v\hich\af52\dbch\af13\loch\f52 i -\hich\af52\dbch\af13\loch\f52 \hich\f52 llkoren i detta Avtal; och (vi) Ni samtycker till att f\'f6\loch\f52 \hich\f52 rsvara och h\'e5\loch\f52 \hich\f52 lla Sun och dess licensgivare skadesl\'f6\loch\f52 \hich\f52 sa i f\'f6\loch\f52 \hich\f52 rh\'e5 -\loch\f52 \hich\f52 llande till alla skador, kostnader, skadest\'e5\loch\f52 \hich\f52 nd, f\'f6\loch\f52 \hich\f52 rlikningslikvider och/eller utgifter (inklusive ers\'e4\loch\f52 \hich\f52 ttning f\'f6\loch\f52 r juristarvoden) som har up -\hich\af52\dbch\af13\loch\f52 p\hich\af52\dbch\af13\loch\f52 \hich\f52 st\'e5\loch\f52 \hich\f52 tt i samband med krav, r\'e4\loch\f52 \hich\f52 ttslig \'e5\loch\f52 \hich\f52 tg\'e4\loch\f52 \hich\f52 rd eller annan \'e5\loch\f52 \hich\f52 tg\'e4 -\loch\f52 \hich\f52 rd fr\'e5\loch\f52 \hich\f52 n tredje part och som har uppkommit som ett resultat av eller beror p\'e5\loch\f52 \hich\f52 anv\'e4\loch\f52 ndningen eller distributionen av Program och/eller Programvara. -\par -\par }\pard \ltrpar\ql \fi-294\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0\pararsid7472940 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 C.\tab \hich\f52 Begr -\'e4\loch\f52 \hich\f52 nsningar i Javateknologi. Ni f\'e5\loch\f52 r inte skap\hich\af52\dbch\af13\loch\f52 \hich\f52 a, modifiera, eller \'e4\loch\f52 \hich\f52 ndra funktionaliteten hos, eller ge Era licenstagare tillst\'e5\loch\f52 \hich\f52 -nd att skapa, modifiera, eller \'e4\loch\f52 \hich\f52 ndra funktionaliteten hos klasser, gr\'e4\loch\f52 \hich\f52 nssnitt eller underpaket som p\'e5\loch\f52 \hich\f52 n\'e5\loch\f52 \hich\f52 got s\'e4\loch\f52 \hich\f52 tt identifieras som \'94 -\loch\f52 \hich\f52 java\'94\loch\f52 \hich\f52 , \'94\loch\f52 \hich\f52 javax\'94\loch\f52 \hich\f52 , \'94\loch\f52 \hich\f52 sun\'94\loch\f52 eller liknande bruk e\hich\af52\dbch\af13\loch\f52 n\hich\af52\dbch\af13\loch\f52 \hich\f52 ligt n\'e5 -\loch\f52 gon av Suns namngivningsregler. -\par }\pard \ltrpar\ql \fi-294\li720\ri0\nowidctlpar\tx720\wrapdefault\faauto\rin0\lin720\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 -\par \hich\af52\dbch\af13\loch\f52 D.\tab \hich\f52 K\'e4\loch\f52 \hich\f52 llkod. Programvaran kan inneh\'e5\loch\f52 \hich\f52 lla k\'e4\loch\f52 \hich\f52 llkod som, s\'e5\loch\f52 \hich\f52 vida den inte uttryckligen licensierats f\'f6\loch\f52 \hich\f52 -r andra \'e4\loch\f52 \hich\f52 ndam\'e5\loch\f52 \hich\f52 l, tillhandah\'e5\loch\f52 \hich\f52 lls endast f\'f6\loch\f52 \hich\f52 r referens\'e4\loch\f52 \hich\f52 ndam\'e5\loch\f52 \hich\f52 l i enlighet med villkoren i detta Avtal. K\'e4\loch\f52 -\hich\f52 llkod f\'e5\loch\f52 r inte vida\hich\af52\dbch\af13\loch\f52 \hich\f52 redistribueras, s\'e5\loch\f52 \hich\f52 vida detta inte uttryckligen till\'e5\loch\f52 ts enligt detta Avtal. -\par -\par \hich\af52\dbch\af13\loch\f52 E.\tab \hich\f52 Kod fr\'e5\loch\f52 \hich\f52 n tredje part. Ytterligare meddelanden om upphovsr\'e4\loch\f52 \hich\f52 tt och licensvillkor som g\'e4\loch\f52 \hich\f52 -ller delar av Programvaran anges i filen THIRDPARTYLICENSEREADME.txt. Som till\'e4\loch\f52 gg till alla\hich\af52\dbch\af13\loch\f52 \hich\f52 tredje parts villkor och best\'e4\loch\f52 \hich\f52 mmelser f\'f6\loch\f52 \hich\f52 r \'f6\loch\f52 -\hich\f52 ppen licens/freewarelicens som finns angivna i filen THIRDPARTYLICENSEREADME.txt, g\'e4\loch\f52 \hich\f52 ller friskrivningen fr\'e5\loch\f52 \hich\f52 n garanti och ansvarsbegr\'e4\loch\f52 \hich\f52 -nsningen i paragraf 5 och 6 i Licensavtal betr\'e4\loch\f52 \hich\f52 ffande bin\'e4\loch\f52 rkod all Programvara\hich\af52\dbch\af13\loch\f52 \hich\af52\dbch\af13\loch\f52 i denna distribution. -\par -\par \hich\af52\dbch\af13\loch\f52 F. \tab \hich\f52 Upph\'f6\loch\f52 \hich\f52 rande p\'e5\loch\f52 \hich\f52 grund av \'f6\loch\f52 \hich\f52 vertr\'e4\loch\f52 \hich\f52 delse. Vardera parten kan h\'e4\loch\f52 \hich\f52 -va detta Avtal omedelbart om Programvaran blir, eller i endera parens \'e5\loch\f52 \hich\f52 sikt troligen kommer att bli, f\'f6\loch\f52 \hich\f52 rem\'e5\loch\f52 \hich\f52 l f\'f6\loch\f52 \hich\f52 r \'f6\loch\f52 \hich\f52 vertr\'e4\loch\f52 -\hich\f52 delsekrav f\'f6\loch\f52 \hich\f52 r immateriell egendomsr\'e4\loch\f52 ttighet. -\par -\par \hich\af52\dbch\af13\loch\f52 G.\tab In\hich\af52\dbch\af13\loch\f52 \hich\f52 stallation och automatisk uppdatering. Programinstallationen och autouppdateringsprocessen f\'f6\loch\f52 \hich\f52 r \'f6\loch\f52 \hich\f52 ver en begr\'e4\loch\f52 -\hich\f52 nsad m\'e4\loch\f52 \hich\f52 ngd data till Sun (eller dess serviceleverant\'f6\loch\f52 \hich\f52 r) om dessa specifika processer f\'f6\loch\f52 \hich\f52 r att hj\'e4\loch\f52 \hich\f52 lpa Sun f\'f6\loch\f52 \hich\f52 rst\'e5\loch\f52 - och optimera dem. Sun associerar int\hich\af52\dbch\af13\loch\f52 e\hich\af52\dbch\af13\loch\f52 \hich\f52 data med personligt identifierbar information. Du kan hitta mer information om data som Sun samlar in p\'e5\loch\f52 http://java.com/data/. - -\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \fs16\lang1053\langfe2052\loch\af52\hich\af52\dbch\af0\langnp1053\insrsid10844074 -\par }{\rtlch\fcs1 \af52\afs16 \ltrch\fcs0 \f52\fs16\lang1053\langfe2052\langnp1053\insrsid10844074 \hich\af52\dbch\af13\loch\f52 \hich\f52 Vid fr\'e5\loch\f52 \hich\f52 gor v\'e4\loch\f52 -nligen kontakta: Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, USA -\par }} diff --git a/ReplicatorG/build/windows/dist/java/LICENSE_zh_CN.rtf b/ReplicatorG/build/windows/dist/java/LICENSE_zh_CN.rtf deleted file mode 100644 index b535933..0000000 --- a/ReplicatorG/build/windows/dist/java/LICENSE_zh_CN.rtf +++ /dev/null @@ -1,878 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1041{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f11\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};} -{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt SimSun};}{\f39\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;}{\f52\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;} -{\f488\froman\fcharset238\fprq2 Times New Roman CE;}{\f489\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f491\froman\fcharset161\fprq2 Times New Roman Greek;}{\f492\froman\fcharset162\fprq2 Times New Roman Tur;} -{\f493\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f494\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f495\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f496\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\f600\fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f598\fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f599\fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};} -{\f601\fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f602\fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f605\fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};} -{\f620\fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f880\fmodern\fcharset0\fprq1 @MS Mincho Western;}{\f878\fmodern\fcharset238\fprq1 @MS Mincho CE;}{\f879\fmodern\fcharset204\fprq1 @MS Mincho Cyr;} -{\f881\fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f882\fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f885\fmodern\fcharset186\fprq1 @MS Mincho Baltic;}{\f1010\fnil\fcharset0\fprq2 @SimSun Western;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; -\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; -\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\qj \li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs21\alang1025 \ltrch\fcs0 -\fs21\lang1033\langfe2052\kerning2\loch\f0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af11\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}} -{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\revtbl {Unknown;}}{\*\rsidtbl \rsid1464403\rsid9577368\rsid10163960}{\*\generator Microsoft Word 11.0.0000;}{\info{\author Alpha_SC}{\operator Leo}{\creatim\yr2009\mo4\dy1\hr11\min46}{\revtim\yr2009\mo6\dy15\hr15\min8} -{\version5}{\edmins3}{\nofpages3}{\nofwords641}{\nofchars3659}{\*\company Alpha}{\nofcharsws4292}{\vern24615}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} -\paperw12240\paperh15840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 -\jcompress\ksulang1041\viewkind4\viewscale130\rsidroot1464403 {\*\fchars !"'),.:\'3b>?]`|\'7d~\'a8\'af\'b7\'bb\'92\'94\'85}{\*\lchars (.?]`|\'7d~\'a8\'af\'b7\'bb\'92\'94\'85}} -\viewkind4\uc1\pard\nowidctlpar\qc\lang1028\f0\fs20 Sun Microsystems, Inc.\par -\'a4\'47\'b6\'69\'a6\'ec\'b5\'7b\'a6\'a1\'bd\'58\'b1\'c2\'c5\'76\'a6\'58\'ac\'f9\lang1036\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\qc\lang1028\f0 JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6 \'a9\'4d JAVAFX RUNTIME VERSION 1\lang1036\f1\par -\pard\nowidctlpar\par -\pard\nowidctlpar\qj\lang1028\f0 SUN MICROSYSTEMS, INC. (\'a1\'75SUN\'a1\'76) \'c4\'40\'b7\'4e\'b1\'c2\'c5\'76\'b1\'7a\'a8\'cf\'a5\'ce\'a4\'55\'ad\'7a\'b3\'6e\'c5\'e9\'a1\'41\'a6\'fd\'b1\'f8\'a5\'f3\'ac\'4f\'b1\'7a\'a5\'b2\'b6\'b7\'b1\'b5\'a8\'fc\'a5\'bb\'a4\'47\'b6\'69\'a6\'ec\'b5\'7b\'a6\'a1\'bd\'58\'b1\'c2\'c5\'76\'a6\'58\'ac\'f9\'aa\'ba\'a9\'d2\'a6\'b3\'b1\'f8\'b4\'da\'a5\'48\'a4\'ce\'bc\'57\'b8\'c9\'b1\'c2\'c5\'76\'b1\'f8\'b4\'da (\'a5\'48\'a4\'55\'c2\'b2\'ba\'d9\'a1\'75\'a6\'58\'ac\'f9\'a1\'76) \'a1\'43\'bd\'d0\'a5\'4a\'b2\'d3\'be\'5c\'c5\'aa\'a5\'bb\'a6\'58\'ac\'f9\'a1\'43\'a8\'cf\'a5\'ce\'b8\'d3\'b3\'6e\'c5\'e9\'a7\'59\'aa\'ed\'a5\'dc\'b1\'7a\'a9\'d3\'bb\'7b\'b1\'7a\'be\'5c\'c5\'aa\'b9\'4c\'a8\'c3\'a6\'50\'b7\'4e\'a5\'4c\'ad\'cc\'a1\'43\'a6\'70\'a5\'48\'a8\'e4\'a5\'4c\'aa\'6b\'ab\'df\'b9\'ea\'c5\'e9\'aa\'ba\'a6\'57\'b8\'71\'a6\'50\'b7\'4e\'b3\'6f\'a8\'c7\'b1\'f8\'b4\'da\'a1\'41\'b1\'7a\'aa\'ed\'a5\'dc\'b1\'7a\'be\'d6\'a6\'b3\'b1\'4e\'b8\'d3\'aa\'6b\'ab\'df\'b9\'ea\'c5\'e9\'bb\'50\'b3\'6f\'a8\'c7\'b1\'f8\'b4\'da\u20851?\u-32684?\u32467?\'aa\'ba\'aa\'6b\'ab\'df\'b1\'c2\'c5\'76\'a1\'43\'a6\'70\'b1\'7a\'a8\'c3\'a4\'a3\'be\'d6\'a6\'b3\'a6\'b9\'c3\'fe\'b1\'c2\'c5\'76\'a1\'41\'a9\'ce\'b1\'7a\'a4\'a3\'a7\'c6\'b1\'e6\'a8\'fc\'b3\'6f\'a8\'c7\'b1\'f8\'b4\'da\'a4\'a7\'ac\'f9\'a7\'f4\'a1\'41\'b1\'7a\'b4\'4e\'a4\'a3\'af\'e0\'a8\'cf\'a5\'ce\'a5\'bb\'ba\'f4\'af\'b8\'a9\'ce\'a7\'74\'a6\'b3\'a5\'bb\'b3\'6e\'c5\'e9\'aa\'ba\'a8\'e4\'a5\'4c\'b4\'43\'c5\'e9\'a4\'a7\'a4\'57\'aa\'ba\'a5\'bb\'b3\'6e\'c5\'e9\'a1\'43\lang5130\f1\par -\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 1.\tab\'a9\'77\'b8\'71\b0\'a1\'43\'a1\'75\'b3\'6e\'c5\'e9\'a1\'76\'ac\'4f\'ab\'fc\'a4\'57\'ad\'7a\'a4\'47\'b6\'69\'a6\'ec\'b5\'7b\'a6\'a1\'bd\'58\'b3\'6e\'c5\'e9\'a1\'42\'a5\'f4\'a6\'f3\'a8\'e4\'a5\'4c\'be\'f7\'be\'b9\'a5\'69\'c5\'aa\'b8\'ea\'ae\'c6 (\'a8\'e4\'a4\'a4\'a5\'5d\'ac\'41\'a6\'fd\'a4\'a3\'ad\'ad\'a9\'f3\'b5\'7b\'a6\'a1\'ae\'77\'a1\'42\'ad\'ec\'a9\'6c\'c0\'c9\'a1\'42\'bc\'d0\'c3\'44\'c0\'c9\'a1\'42\'b8\'ea\'ae\'c6\'c0\'c9) \'a1\'42Sun \'b4\'a3\'a8\'d1\'aa\'ba\'a5\'f4\'a6\'f3\'a7\'f3\'b7\'73\'a9\'ce\'bf\'f9\'bb\'7e\'aa\'c8\'a5\'bf\'b3\'71\'aa\'be\'a1\'42\'a5\'48\'a4\'ce Sun \'a8\'cc\'be\'da\'a5\'bb\'a6\'58\'ac\'f9\'a6\'56\'b1\'7a\'b4\'a3\'a8\'d1\'aa\'ba\'a5\'f4\'a6\'f3\'a8\'cf\'a5\'ce\'aa\'cc\'a4\'e2\'a5\'55\'a1\'42\'bd\'73\'b5\'7b\'ab\'fc\'ab\'6e\'a5\'48\'a4\'ce\'a8\'e4\'a5\'4c\'bb\'a1\'a9\'fa\'a4\'e5\'a5\'f3\'a1\'43\'a1\'75\'a4\'40\'af\'eb\'a5\'ce\'b3\'7e\'ae\'e0\'a4\'57\'ab\'ac\'b9\'71\'b8\'a3\'bb\'50\'a6\'f8\'aa\'41\'be\'b9\'a1\'76\'ac\'4f\'ab\'fc\'a6\'62\'a4\'40\'af\'eb\'a8\'cf\'a5\'ce\'aa\'cc\'aa\'ba\'b1\'b1\'a8\'ee\'a4\'55\'a5\'ce\'a9\'f3\'a4\'40\'af\'eb\'a9\'ca\'b9\'42\'ba\'e2\'a5\'5c\'af\'e0 (\'a8\'d2\'a6\'70\'a1\'41\'a6\'fd\'a4\'a3\'af\'53\'a7\'4f\'ad\'ad\'a9\'f3\'a1\'41\'b9\'71\'a4\'6c\'b6\'6c\'a5\'f3\'a1\'42\'a4\'40\'af\'eb\'a5\'d8\'aa\'ba\'aa\'ba\'ba\'f4\'bb\'da\'ba\'f4\'b8\'f4\'c2\'73\'c4\'fd\'a5\'48\'a4\'ce\'bf\'ec\'a4\'bd\'ab\'c7\'ae\'4d\'a5\'f3\'a5\'cd\'b2\'a3\'a4\'4f\'a4\'75\'a8\'e3) \'aa\'ba\'b9\'71\'b8\'a3 (\'a5\'5d\'ac\'41\'ae\'e0\'a4\'57\'ab\'ac\'a4\'ce\'b5\'a7\'b0\'4f\'ab\'ac\'b9\'71\'b8\'a3) \'a9\'ce\'a6\'f8\'aa\'41\'be\'b9\'a1\'43\'a5\'bb\'b3\'6e\'c5\'e9\'ad\'59\'a6\'62\'b4\'a3\'a8\'d1\'b1\'4d\'aa\'f9\'a5\'5c\'af\'e0 (\'a4\'57\'ad\'7a\'a5\'5c\'af\'e0\'b0\'a3\'a5\'7e) \'aa\'ba\'a8\'74\'b2\'ce\'a9\'4d\'b8\'d1\'a8\'4d\'a4\'e8\'ae\'d7\'a4\'a4\'a8\'cf\'a5\'ce\'a1\'41\'a9\'ce\'a6\'ae\'a6\'62\'a5\'ce\'a9\'f3\'a4\'ba\'b4\'4f\'a9\'ce\'af\'53\'a9\'77\'a5\'5c\'af\'e0\'aa\'ba\'b3\'6e\'c5\'e9\'c0\'b3\'a5\'ce\'b5\'7b\'a6\'a1\'a4\'a4\'a1\'41\'a8\'d2\'a6\'70 (\'a6\'fd\'a4\'a3\'ad\'ad\'a9\'f3)\'a1\'47\'a4\'ba\'b4\'4f\'a9\'ce\'b8\'cb\'b0\'74\'a9\'f3\'a4\'75\'b7\'7e\'b1\'b1\'a8\'ee\'a8\'74\'b2\'ce\'a1\'42\'b5\'4c\'bd\'75\'a6\'e6\'b0\'ca\'b9\'71\'b8\'dc\'a1\'42\'b5\'4c\'bd\'75\'a4\'e2\'ab\'f9\'aa\'41\'b0\'c8\'a1\'42\'b0\'67\'a7\'41\'b5\'a7\'b0\'4f\'ab\'ac\'b9\'71\'b8\'a3\'a1\'42\'a4\'bd\'a6\'40\'b8\'ea\'b0\'54\'af\'b8 (kiosk)\'a1\'42TV/STB\'a1\'42\'c2\'c5\'a5\'fa\'a5\'fa\'ba\'d0 (Blu-ray Disc) \'b8\'cb\'b8\'6d\'a1\'42\'a8\'ae\'a5\'ce\'b8\'ea\'b0\'54\'a8\'74\'b2\'ce\'bb\'50\'ba\'f4\'b8\'f4\'b1\'b1\'a8\'ee\'a5\'e6\'b4\'ab\'b3\'5d\'b3\'c6\'a1\'42\'a6\'4c\'aa\'ed\'be\'f7\'bb\'50\'c0\'78\'a6\'73\'ba\'de\'b2\'7a\'a8\'74\'b2\'ce\'a1\'41\'a5\'48\'a4\'ce\'a8\'e4\'a5\'4c\'ac\'db\'c3\'f6\'a8\'74\'b2\'ce\'a1\'41\'ab\'68\'a5\'bb\'b3\'6e\'c5\'e9\'aa\'ba\'a8\'cf\'a5\'ce\'a4\'a3\'a6\'62\'a5\'bb\'a9\'77\'b8\'71\'bd\'64\'b3\'f2\'a4\'ba\'a5\'42\'a4\'a3\'b1\'6f\'a8\'cc\'be\'da\'a5\'bb\'a6\'58\'ac\'f9\'b1\'c2\'a4\'a9\'b1\'c2\'c5\'76\'a1\'43\'a1\'75\'b5\'7b\'a6\'a1\'a1\'76\'ac\'4f\'ab\'fc (a) \'b7\'4e\'b9\'cf\'a6\'62\'a4\'e4\'b4\'a9 Java \'a5\'5c\'af\'e0\'aa\'ba\'b3\'71\'a5\'ce\'ae\'e0\'a4\'57\'ab\'ac\'b9\'71\'b8\'a3\'a9\'4d\'a6\'f8\'aa\'41\'be\'b9\'a4\'57\'a8\'cf\'a5\'ce Java Platform Standard Edition (Java SE) \'a5\'ad\'a5\'78\'b9\'42\'a6\'e6\'aa\'ba Java \'a4\'70\'b5\'7b\'a6\'a1\'a9\'4d\'c0\'b3\'a5\'ce\'b5\'7b\'a6\'a1\'a1\'46\'a4\'ce (b) \'b7\'4e\'b9\'cf\'a6\'62\'a4\'e4\'b4\'a9 JavaFX \'aa\'ba\'b3\'71\'a5\'ce\'ae\'e0\'a4\'57\'ab\'ac\'b9\'71\'b8\'a3\'a9\'4d\'a6\'f8\'aa\'41\'be\'b9\'a4\'57\'b0\'f5\'a6\'e6\'a9\'f3 JavaFX Runtime \'a4\'57\'aa\'ba JavaFX \'a7\'de\'b3\'4e\'c0\'b3\'a5\'ce\'b5\'7b\'a6\'a1\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 2.\tab\'a8\'cf\'a5\'ce\'b1\'c2\'c5\'76\b0\'a1\'43\'a8\'cc\'be\'da\'a5\'bb\'a6\'58\'ac\'f9\'aa\'ba\'b1\'f8\'b4\'da\'a9\'4d\'b1\'f8\'a5\'f3\'a1\'41\'a8\'e4\'a4\'a4\'a5\'5d\'ac\'41\'a6\'fd\'a4\'a3\'ad\'ad\'a9\'f3\'bc\'57\'b8\'c9\'b1\'c2\'c5\'76\'b1\'f8\'b4\'da\'aa\'ba\'a1\'75Java \'a7\'de\'b3\'4e\'ad\'ad\'a8\'ee\'a1\'76\'a1\'41Sun \'a6\'56\'b1\'7a\'b1\'c2\'a4\'a9\'ab\'44\'b1\'4d\'c4\'dd\'a1\'42\'a4\'a3\'a5\'69\'b2\'be\'c2\'e0\'a1\'42\'a7\'4b\'b1\'c2\'c5\'76\'b6\'4f\'aa\'ba\'a6\'b3\'ad\'ad\'b1\'c2\'c5\'76\'a1\'41\'b6\'c8\'a8\'d1\'b1\'7a\'ac\'b0\'b9\'42\'a6\'e6\'b5\'7b\'a6\'a1\'aa\'ba\'a5\'d8\'aa\'ba\'a6\'62\'a4\'ba\'b3\'a1\'bd\'c6\'bb\'73\'a9\'4d\'a8\'cf\'a5\'ce\'a7\'b9\'be\'e3\'a6\'d3\'a5\'bc\'a7\'ef\'c5\'dc\'aa\'ba\'b3\'6e\'c5\'e9\'a1\'43\'bc\'57\'b8\'c9\'b1\'c2\'c5\'76\'b1\'f8\'b4\'da\'a4\'a4\'a7\'74\'a6\'b3\'a6\'56\'b6\'7d\'b5\'6f\'b0\'d3\'a9\'4d/\'a9\'ce\'a5\'58\'aa\'a9\'b0\'d3\'b1\'c2\'a4\'a9\'a4\'a7\'a8\'e4\'a5\'4c\'b1\'c2\'c5\'76\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 3.\tab\'ad\'ad\'a8\'ee\'b3\'57\'a9\'77\b0\'a1\'43\'a5\'bb\'b3\'6e\'c5\'e9\'c4\'dd\'c0\'e7\'b7\'7e\'af\'b5\'b1\'4b\'a8\'c3\'a6\'b3\'b5\'db\'a7\'40\'c5\'76\'ab\'4f\'c5\'40\'a1\'43Sun \'a4\'ce (\'a9\'ce) \'a8\'e4\'b1\'c2\'c5\'76\'aa\'cc\'ab\'4f\'af\'64\'b9\'ef\'a5\'bb\'b3\'6e\'c5\'e9\'a4\'ce\'a9\'d2\'a6\'b3\'ac\'db\'c3\'f6\'b4\'bc\'bc\'7a\'b0\'5d\'b2\'a3\'c5\'76\'a4\'a7\'a9\'d2\'a6\'b3\'c5\'76\'a1\'43\'b0\'a3\'ab\'44\'ac\'db\'c3\'f6\'aa\'6b\'ab\'df\'b8\'54\'a4\'ee\'b9\'ea\'ac\'49\'a1\'41\'a7\'5f\'ab\'68\'b1\'7a\'a4\'a3\'b1\'6f\'b9\'ef\'a5\'bb\'b3\'6e\'c5\'e9\'b6\'69\'a6\'e6\'ad\'d7\'a7\'ef\'a1\'42\'b8\'d1\'bd\'73\'a9\'ce\'a4\'cf\'a6\'56\'a4\'75\'b5\'7b\'a1\'43\'b3\'51\'b1\'c2\'c5\'76\'a4\'48\'bb\'7b\'aa\'be\'b1\'c2\'c5\'76\'b3\'6e\'c5\'e9\'a8\'c3\'ab\'44\'b3\'5d\'ad\'70\'a9\'ce\'b7\'4e\'b9\'cf\'a5\'ce\'a9\'f3\'b3\'5d\'ad\'70\'a1\'42\'ab\'d8\'b3\'79\'a1\'42\'be\'de\'a7\'40\'a9\'ce\'ba\'fb\'c5\'40\'a5\'f4\'a6\'f3\'ae\'d6\'a4\'6c\'b3\'5d\'ac\'49\'a1\'43Sun Microsystems, Inc. \'b9\'ef\'a9\'f3\'a5\'bb\'b3\'6e\'c5\'e9\'ac\'4f\'a7\'5f\'be\'41\'a6\'58\'a9\'f3\'a4\'57\'ad\'7a\'a8\'cf\'a5\'ce\'a8\'c3\'a4\'a3\'b4\'a3\'a8\'d1\'a5\'f4\'a6\'f3\'a9\'fa\'a5\'dc\'a9\'ce\'b7\'74\'a5\'dc\'a9\'ca\'a4\'a7\'be\'e1\'ab\'4f\'a1\'43\'a5\'bb\'a6\'58\'ac\'f9\'a4\'a4\'a8\'c3\'a5\'bc\'b1\'c2\'a4\'a9\'a5\'f4\'a6\'f3\'a6\'b3\'c3\'f6 Sun \'a9\'ce\'a8\'e4\'b1\'c2\'c5\'76\'aa\'cc\'a4\'a7\'a5\'f4\'a6\'f3\'b0\'d3\'bc\'d0\'a1\'42\'aa\'41\'b0\'c8\'bc\'d0\'b3\'b9\'a1\'42\'bc\'d0\'a5\'dc\'a9\'ce\'b0\'d3\'bc\'d0\'a6\'57\'ba\'d9\'a4\'a7\'c5\'76\'a7\'51\'a1\'42\'a9\'d2\'a6\'b3\'c5\'76\'a9\'ce\'a7\'51\'af\'71\'a1\'43\'b9\'ef\'a9\'f3\'b6\'7d\'b5\'6f\'b0\'d3\'a9\'4d/\'a9\'ce\'a5\'58\'aa\'a9\'b0\'d3\'b1\'c2\'c5\'76\'a4\'a7\'a8\'e4\'a5\'4c\'ad\'ad\'a8\'ee\'b8\'fc\'a9\'fa\'a9\'f3\'bc\'57\'b8\'c9\'b1\'c2\'c5\'76\'b1\'f8\'b4\'da\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 4.\tab\'a6\'b3\'ad\'ad\'be\'e1\'ab\'4f\b0\'a1\'43Sun \'a6\'56\'b1\'7a\'be\'e1\'ab\'4f\'a1\'41\'a6\'db\'c1\'ca\'b6\'52\'a4\'a7\'a4\'e9\'b0\'5f\'a4\'45\'a4\'51 (90) \'a4\'d1\'a4\'ba (\'a5\'48\'a6\'ac\'be\'da\'b0\'c6\'a5\'bb\'ac\'b0\'be\'cc) \'a1\'41\'a5\'bb\'b3\'6e\'c5\'e9\'aa\'ba\'c0\'78\'a6\'73\'a4\'b6\'bd\'e8 (\'ad\'59\'a6\'b3\'aa\'ba\'b8\'dc) \'a6\'62\'a5\'bf\'b1\'60\'a8\'cf\'a5\'ce\'aa\'ba\'b1\'a1\'aa\'70\'a4\'55\'a1\'41\'b5\'4c\'a7\'f7\'ae\'c6\'a9\'4d\'bb\'73\'a7\'40\'a4\'e8\'ad\'b1\'aa\'ba\'b7\'e5\'b2\'ab\'a1\'43\'b0\'a3\'a4\'57\'ad\'7a\'a4\'ba\'ae\'65\'a5\'7e\'a1\'41\'a5\'bb\'b3\'6e\'c5\'e9\'ab\'f6\'a1\'75\'ad\'ec\'bc\'cb\'a1\'76\'b4\'a3\'a8\'d1\'a1\'43\'a6\'62\'a6\'b9\'a6\'b3\'ad\'ad\'be\'e1\'ab\'4f\'a4\'55\'a1\'41\'b1\'7a\'b0\'df\'a4\'40\'aa\'ba\'b1\'cf\'c0\'d9\'c5\'76\'a4\'ce Sun \'a4\'a7\'a5\'fe\'b3\'a1\'b8\'71\'b0\'c8\'ac\'b0 Sun \'bf\'ef\'be\'dc\'a7\'f3\'b4\'ab\'a5\'bb\'b3\'6e\'c5\'e9\'a4\'b6\'bd\'e8\'a9\'ce\'b0\'68\'a6\'5e\'c1\'ca\'b6\'52\'a5\'bb\'b3\'6e\'c5\'e9\'a4\'a7\'b6\'4f\'a5\'ce\'a1\'43\'c3\'f6\'a9\'f3\'b3\'6e\'c5\'e9\'aa\'ba\'a5\'f4\'a6\'f3\'b7\'74\'a5\'dc\'a9\'ca\'be\'e1\'ab\'4f\'a5\'75\'ad\'ad\'a9\'f390\'a4\'d1\'a1\'43\'a6\'b3\'a8\'c7\'a6\'7b\'a4\'a3\'a4\'b9\'b3\'5c\'ad\'ad\'a8\'ee\'b7\'74\'a5\'dc\'a9\'ca\'be\'e1\'ab\'4f\'aa\'ba\'b4\'c1\'ad\'ad\'a1\'41\'a6\'5d\'a6\'b9\'a4\'57\'ad\'7a\'b3\'57\'a9\'77\'a5\'69\'af\'e0\'b9\'ef\'b1\'7a\'a4\'a3\'be\'41\'a5\'ce\'a1\'43\'a5\'bb\'a6\'b3\'ad\'ad\'be\'e1\'ab\'4f\'b1\'c2\'a4\'a9\'b1\'7a\'af\'53\'a9\'77\'a4\'a7\'aa\'6b\'ab\'df\'c5\'76\'a7\'51\'a1\'43\'b1\'7a\'a5\'69\'af\'e0\'c1\'d9\'a6\'b3\'a8\'e4\'a5\'4c\'aa\'6b\'ab\'df\'c5\'76\'a7\'51\'a1\'41\'a6\'5d\'a6\'55\'a6\'7b\'aa\'6b\'ab\'df\'a6\'d3\'b2\'a7\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\li360\sb100\sa100\sl120\slmult1\qj\lang1033\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 5.\tab\'a9\'da\'b5\'b4\'be\'e1\'ab\'4f\'a8\'c6\'b6\'b5\b0\'a1\'43\'b0\'a3\'ab\'44\'a5\'bb\'a6\'58\'ac\'f9\'a9\'fa\'ad\'71\'a1\'41\'a7\'5f\'ab\'68 Sun \'a9\'da\'b5\'b4\'b9\'ef\'a9\'d2\'a6\'b3\'a9\'fa\'a5\'dc\'a9\'ce\'b7\'74\'a5\'dc\'a4\'a7\'b1\'f8\'a5\'f3\'a1\'42\'b3\'af\'ad\'7a\'bb\'50\'be\'e1\'ab\'4f\'a4\'a7\'b3\'64\'a5\'f4\'a1\'41\'a5\'5d\'ac\'41\'a5\'f4\'a6\'f3\'b7\'74\'a5\'dc\'a5\'69\'b0\'e2\'a9\'ca\'a1\'42\'be\'41\'a6\'58\'af\'53\'ae\'ed\'a5\'d8\'aa\'ba\'a9\'ce\'a4\'a3\'ab\'49\'ae\'60\'a4\'a7\'ab\'4f\'c3\'d2\'a1\'41\'a6\'fd\'a4\'57\'ad\'7a\'a9\'da\'b5\'b4\'b3\'51\'aa\'6b\'ab\'df\'ab\'c5\'a7\'69\'b5\'4c\'ae\'c4\'aa\'cc\'a1\'41\'a4\'a3\'a6\'62\'a6\'b9\'ad\'ad\'a1\'43\lang1033\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 6.\tab\'b3\'64\'a5\'f4\'a4\'a7\'ad\'ad\'a8\'ee\b0\'a1\'43\'a9\'f3\'aa\'6b\'ab\'df\'a9\'d2\'a4\'a3\'b8\'54\'a4\'ee\'a4\'a7\'bd\'64\'b3\'f2\'a4\'ba\'a1\'41\'a6\'62\'a5\'f4\'a6\'f3\'b1\'a1\'aa\'70\'a4\'55 SUN \'a9\'ce\'a8\'e4\'b1\'c2\'c5\'76\'aa\'cc\'b1\'4e\'a4\'a3\'b7\'7c\'b9\'ef\'a6\'5d\'a8\'cf\'a5\'ce\'a9\'ce\'b5\'4c\'aa\'6b\'a8\'cf\'a5\'ce\'a5\'bb\'b3\'6e\'c5\'e9\'a6\'d3\'a4\'de\'b0\'5f\'a9\'ce\'a6\'b3\'c3\'f6\'aa\'ba\'a5\'f4\'a6\'f3\'a6\'ac\'a4\'4a\'a1\'42\'a7\'51\'bc\'ed\'a9\'ce\'b8\'ea\'ae\'c6\'a4\'a7\'b7\'6c\'a5\'a2\'a9\'ce\'b9\'ef\'af\'53\'a7\'4f\'a1\'42\'b6\'a1\'b1\'b5\'a1\'42\'aa\'fe\'c0\'48\'a1\'42\'ad\'6c\'a5\'cd\'a9\'ca\'a9\'ce\'c3\'67\'bb\'40\'a9\'ca\'b7\'6c\'ae\'60\'ad\'74\'b3\'64\'a1\'41\'a4\'a3\'bd\'d7\'b3\'6f\'a8\'c7\'b7\'6c\'a5\'a2\'a9\'ce\'b7\'6c\'ae\'60\'ac\'4f\'a6\'70\'a6\'f3\'b2\'a3\'a5\'cd\'a1\'41\'a4\'5d\'a4\'a3\'bd\'d7\'ac\'4f\'a7\'5f\'a8\'cc\'b6\'c5\'b0\'c8\'ad\'ec\'b2\'7a\'a6\'d3\'b2\'a3\'a5\'cd\'a1\'41\'a7\'59\'a8\'cf Sun \'a8\'c6\'ab\'65\'b3\'51\'a7\'69\'aa\'be\'a6\'b9\'b6\'b5\'b7\'6c\'ae\'60\'a4\'a7\'a5\'69\'af\'e0\'a9\'ca\'a5\'e7\'a6\'50\'a1\'43\'a6\'62\'a5\'f4\'a6\'f3\'b1\'a1\'aa\'70\'a4\'55\'a1\'41Sun \'a8\'cc\'a5\'bb\'a6\'58\'ac\'f9\'b9\'ef\'b1\'7a\'aa\'ba\'b3\'64\'a5\'f4\'a4\'a7\'c3\'42\'ab\'d7\'a1\'41\'a4\'a3\'bd\'d7\'a6\'62\'ab\'b4\'ac\'f9\'a1\'42\'ab\'49\'c5\'76\'a6\'e6\'ac\'b0 (\'a5\'5d\'a7\'74\'b9\'4c\'a5\'a2) \'a9\'ce\'a8\'e4\'a5\'4c\'a4\'e8\'ad\'b1\'a1\'41\'b1\'4e\'a4\'a3\'b7\'7c\'b6\'57\'b9\'4c\'b1\'7a\'ac\'b0\'c1\'ca\'b6\'52\'a5\'bb\'b3\'6e\'c5\'e9\'a9\'d2\'a4\'e4\'a5\'49\'a4\'a7\'aa\'f7\'c3\'42\'a1\'43\'a7\'59\'a8\'cf\'ab\'65\'ad\'7a\'be\'e1\'ab\'4f\'a5\'bc\'af\'e0\'b9\'46\'a6\'a8\'a1\'41\'a4\'57\'ad\'7a\'ad\'ad\'a8\'ee\'a8\'cc\'b5\'4d\'be\'41\'a5\'ce\'a1\'43\'a6\'b3\'a8\'c7\'a6\'7b\'a4\'a3\'a4\'b9\'b3\'5c\'b1\'c6\'b0\'a3\'aa\'fe\'c0\'48\'a9\'ce\'ad\'6c\'a5\'cd\'a9\'ca\'b7\'6c\'ae\'60\'aa\'ba\'bd\'df\'c0\'76\'a1\'41\'a6\'5d\'a6\'b9\'a4\'57\'ad\'7a\'a6\'b3\'a8\'c7\'b3\'57\'a9\'77\'a5\'69\'af\'e0\'b9\'ef\'b1\'7a\'a4\'a3\'be\'41\'a5\'ce\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 7.\tab\'a6\'58\'ac\'f9\'b2\'d7\'a4\'ee\b0\'a1\'43\'a5\'bb\'a6\'58\'ac\'f9\'a9\'f3\'b2\'d7\'a4\'ee\'ab\'65\'ab\'f9\'c4\'f2\'a6\'b3\'ae\'c4\'a1\'43\'b1\'7a\'b1\'6f\'c2\'c7\'be\'50\'b7\'b4\'a5\'bb\'b3\'6e\'c5\'e9\'a9\'d2\'a6\'b3\'a5\'bf\'a5\'bb\'a9\'4d\'b0\'c6\'a5\'bb\'a5\'48\'b2\'d7\'a4\'ee\'a5\'bb\'a6\'58\'ac\'f9\'a1\'43\'ad\'59\'b1\'7a\'a5\'bc\'af\'e0\'bf\'ed\'a6\'75\'a5\'bb\'a6\'58\'ac\'f9\'a4\'a7\'a5\'f4\'a6\'f3\'b3\'57\'a9\'77\'a1\'41\'a5\'bb\'a6\'58\'ac\'f9\'b1\'4e\'b1\'6f\'a4\'a3\'b8\'67 Sun \'b5\'6f\'a5\'58\'b3\'71\'aa\'be\'a6\'d3\'a5\'df\'a7\'59\'b2\'d7\'a4\'ee\'a1\'43\'a6\'70\'aa\'47\'b3\'6e\'c5\'e9\'a6\'a8\'ac\'b0 (\'a9\'ce\'a5\'f4\'a4\'40\'a4\'e8\'bb\'7b\'ac\'b0\'a6\'b3\'a5\'69\'af\'e0\'a6\'a8\'ac\'b0) \'a5\'f4\'a6\'f3\'b4\'bc\'bc\'7a\'b0\'5d\'b2\'a3\'c5\'76\'ab\'49\'a5\'c7\'af\'c1\'bd\'df\'aa\'ba\'bc\'d0\'aa\'ba\'a1\'41\'ab\'68\'a5\'f4\'a4\'40\'a4\'e8\'a7\'a1\'b1\'6f\'b2\'d7\'a4\'ee\'a5\'bb\'a6\'58\'ac\'f9\'a1\'43\'a5\'bb\'a6\'58\'ac\'f9\'b2\'d7\'a4\'ee\'ab\'e1\'a1\'41\'b1\'7a\'a5\'b2\'bb\'dd\'be\'50\'b7\'b4\'a5\'bb\'b3\'6e\'c5\'e9\'a9\'d2\'a6\'b3\'a5\'bf\'a5\'bb\'a9\'4d\'b0\'c6\'a5\'bb\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 8.\tab\'a5\'58\'a4\'66\'b3\'57\'a9\'77\b0\'a1\'43\'a8\'cc\'a5\'bb\'a6\'58\'ac\'f9\'a9\'d2\'a5\'e6\'a5\'49\'a4\'a7\'a9\'d2\'a6\'b3\'b3\'6e\'c5\'e9\'a4\'ce\'a7\'de\'b3\'4e\'b8\'ea\'ae\'c6\'a7\'a1\'a8\'fc\'ac\'fc\'b0\'ea\'a5\'58\'a4\'66\'ba\'de\'a8\'ee\'aa\'6b\'ab\'df\'ad\'ad\'a8\'ee\'a1\'41\'a8\'c3\'b1\'4e\'a8\'fc\'a8\'e4\'a5\'4c\'b0\'ea\'ae\'61\'a4\'a7\'b6\'69\'a5\'58\'a4\'66\'aa\'6b\'b3\'57\'ad\'ad\'a8\'ee\'a1\'43\'b1\'7a\'a6\'50\'b7\'4e\'c4\'59\'ae\'e6\'bf\'ed\'a6\'75\'a9\'d2\'a6\'b3\'b3\'6f\'a8\'c7\'aa\'6b\'ab\'df\'a4\'ce\'aa\'6b\'b3\'57\'a1\'41\'a8\'c3\'bb\'7b\'aa\'be\'a6\'62\'a5\'bb\'b3\'6e\'c5\'e9\'a5\'e6\'a5\'49\'a4\'a9\'b1\'7a\'a4\'a7\'ab\'e1\'a1\'41\'b1\'7a\'b1\'4e\'a6\'b3\'b8\'71\'b0\'c8\'a8\'fa\'b1\'6f\'a9\'d2\'bb\'dd\'aa\'ba\'a5\'58\'a4\'66\'a1\'42\'a6\'41\'a5\'58\'a4\'66\'a9\'ce\'b6\'69\'a4\'66\'b3\'5c\'a5\'69\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 9.\tab\'b0\'d3\'bc\'d0\'bb\'50\'bc\'d0\'a5\'dc\b0\'a1\'43\'b1\'7a\'bb\'7b\'aa\'be\'a5\'42\'bb\'50 Sun \'a9\'bc\'a6\'b9\'b6\'a1\'a6\'50\'b7\'4e\'a5\'48\'a4\'55\'a8\'c6\'b6\'b5\'a1\'41\'a7\'59 Sun \'be\'d6\'a6\'b3 SUN\'a1\'42SOLARIS\'a1\'42JAVA\'a1\'42JINI\'a1\'42FORTE \'bb\'50 iPLANET \'aa\'ba\'b0\'d3\'bc\'d0\'a5\'48\'a4\'ce\'a9\'d2\'a6\'b3 SUN\'a1\'42SOLARIS\'a1\'42JAVA\'a1\'42JINI\'a1\'42FORTE \'bb\'50 iPLANET \'aa\'ba\'ac\'db\'c3\'f6\'b0\'d3\'bc\'d0\'a1\'42\'aa\'41\'b0\'c8\'bc\'d0\'b3\'b9\'a1\'42\'bc\'d0\'a5\'dc\'bb\'50\'a8\'e4\'a5\'4c\'ab\'7e\'b5\'50\'bc\'d0\'b0\'4f (\'a6\'58\'ba\'d9\'a1\'75Sun \'bc\'d0\'b3\'b9\'a1\'76) \'a1\'41\'a5\'42\'b1\'7a\'a6\'50\'b7\'4e\'bf\'ed\'a6\'75 Sun \'aa\'ba\'b0\'d3\'bc\'d0\'bb\'50\'bc\'d0\'a5\'dc\'a8\'cf\'a5\'ce\'ad\'6e\'a8\'44\'a1\'41\'b8\'d3\'ad\'6e\'a8\'44\'b2\'7b\'a5\'69\'a6\'62\'ba\'f4\'a7\'7d http://www.sun.com/policies/trademarks \'a4\'57\'ac\'64\'b8\'df\'a1\'43\'b1\'7a\'b9\'ef\'a9\'f3 Sun \'bc\'d0\'b3\'b9\'a4\'a7\'a5\'f4\'a6\'f3\'a8\'cf\'a5\'ce\'a7\'a1\'b6\'b7\'b2\'c5\'a6\'58 Sun \'a4\'a7\'a7\'51\'af\'71\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 10.\tab\'ac\'fc\'b0\'ea\'ac\'46\'a9\'b2\'a4\'a7\'a6\'b3\'ad\'ad\'c5\'76\'a7\'51\b0\'a1\'43\'ad\'59\'a5\'bb\'b3\'6e\'c5\'e9\'ab\'59\'a5\'d1\'ac\'fc\'b0\'ea\'ac\'46\'a9\'b2\'a8\'fa\'b1\'6f\'a9\'ce\'b8\'67\'a5\'d1\'a5\'4e\'aa\'ed\'ac\'fc\'b0\'ea\'ac\'46\'a9\'b2\'aa\'cc\'a8\'fa\'b1\'6f\'a1\'42\'a9\'ce\'a5\'d1\'ac\'fc\'b0\'ea\'ac\'46\'a9\'b2\'aa\'ba\'a5\'44\'a9\'d3\'a5\'5d\'b0\'d3\'a9\'ce\'c2\'e0\'a5\'5d\'b0\'d3 (\'a5\'f4\'a6\'f3\'bc\'68\'af\'c5) \'a8\'fa\'b1\'6f\'a1\'41\'a8\'cc\'b7\'d348 CFR 227.7201\'a8\'ec227.7202-4 (\'be\'41\'a5\'ce\'a9\'f3\'b0\'ea\'a8\'be\'b3\'a1\'a4\'a7\'a8\'fa\'b1\'6f) \'bb\'5048 CFR 2.101\'a4\'ce12.212 (\'be\'41\'a5\'ce\'a9\'f3\'ab\'44\'a5\'d1\'b0\'ea\'a8\'be\'b3\'a1\'a4\'a7\'a8\'fa\'b1\'6f) \'a4\'a7\'b3\'57\'a9\'77\'a1\'41\'ac\'46\'a9\'b2\'a6\'62\'a5\'bb\'b3\'6e\'c5\'e9\'bb\'50\'c0\'48\'aa\'fe\'a4\'e5\'a5\'f3\'a4\'a4\'aa\'ba\'c5\'76\'a7\'51\'b1\'4e\'b6\'c8\'ad\'ad\'a9\'f3\'a5\'bb\'a6\'58\'ac\'f9\'a4\'a4\'a9\'d2\'b3\'57\'a9\'77\'aa\'cc\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 11.\tab\'b7\'c7\'be\'da\'aa\'6b\b0\'a1\'43\'a6\'b3\'c3\'f6\'a5\'bb\'a6\'58\'ac\'f9\'aa\'ba\'a5\'f4\'a6\'f3\'b6\'44\'b3\'5e\'b1\'4e\'be\'41\'a5\'ce\'ac\'fc\'b0\'ea\'a5\'5b\'a6\'7b\'aa\'6b\'ab\'df\'a4\'ce\'ac\'db\'c3\'f6\'a4\'a7\'ac\'fc\'b0\'ea\'c1\'70\'a8\'b9\'aa\'6b\'ab\'df\'a1\'43\'a5\'bb\'a6\'58\'ac\'f9\'a4\'a3\'be\'41\'a5\'ce\'a5\'f4\'a6\'f3\'a5\'71\'aa\'6b\'ba\'de\'c1\'d2\'c5\'76\'a4\'55\'a4\'a7\'aa\'6b\'ab\'df\'bf\'ef\'be\'dc\'b3\'57\'a9\'77\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 12.\tab\'bf\'57\'a5\'df\'a9\'ca\b0\'a1\'43\'ad\'59\'a5\'bb\'a6\'58\'ac\'f9\'a4\'a4\'a4\'a7\'a5\'f4\'a6\'f3\'b1\'f8\'b4\'da\'b3\'51\'bb\'7b\'a9\'77\'ac\'b0\'b5\'4c\'aa\'6b\'b0\'f5\'a6\'e6\'ae\'c9\'a1\'41\'a5\'bb\'a6\'58\'ac\'f9\'b8\'67\'b0\'a3\'a5\'68\'b8\'d3\'b3\'a1\'a4\'c0\'ab\'e1\'a4\'b4\'b5\'4d\'a6\'b3\'ae\'c4\'a1\'41\'b1\'a9\'a7\'52\'b0\'a3\'b8\'d3\'b3\'a1\'a4\'c0\'b1\'4e\'a8\'cf\'b7\'ed\'a8\'c6\'a4\'48\'a4\'40\'a4\'e8\'a5\'a2\'a5\'68\'bd\'6c\'ac\'f9\'a5\'d8\'aa\'ba\'ae\'c9\'a1\'41\'a5\'bb\'a6\'58\'ac\'f9\'b1\'4e\'a5\'df\'a7\'59\'b2\'d7\'a4\'ee\'a1\'43 \par -\pard\nowidctlpar\qj\lang5130\f1\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 13.\tab\'a7\'b9\'be\'e3\'a9\'ca\b0\'a1\'43\'a5\'bb\'a6\'58\'ac\'f9\'ab\'59\'b1\'7a\'bb\'50 Sun \'b4\'4e\'a6\'58\'ac\'f9\'bc\'d0\'aa\'ba\'a4\'57\'a4\'a7\'a5\'fe\'b3\'a1\'a6\'58\'ac\'f9\'a1\'43\'a5\'a6\'a8\'fa\'a5\'4e\'a5\'fd\'ab\'65\'a9\'ce\'a6\'50\'ae\'c9\'a6\'73\'a6\'62\'a4\'a7\'a9\'d2\'a6\'b3\'a4\'66\'c0\'59\'a9\'ce\'ae\'d1\'ad\'b1\'b3\'71\'b0\'54\'a1\'42\'ab\'d8\'c4\'b3\'a1\'42\'b3\'af\'ad\'7a\'a9\'ce\'be\'e1\'ab\'4f\'a1\'41\'a8\'c3\'c0\'75\'a5\'fd\'a9\'f3\'a5\'bb\'a6\'58\'ac\'f9\'b4\'c1\'ad\'ad\'a4\'ba\'b7\'ed\'a8\'c6\'a4\'48\'c2\'f9\'a4\'e8\'a4\'a7\'b6\'a1\'a6\'b3\'c3\'f6\'a6\'58\'ac\'f9\'bc\'d0\'aa\'ba\'a4\'a7\'a5\'f4\'a6\'f3\'b3\'f8\'bb\'f9\'a1\'42\'ad\'71\'c1\'ca\'a1\'42\'bb\'7b\'a5\'69\'bb\'50\'a8\'e4\'a5\'4c\'b3\'71\'b0\'54\'a4\'a7\'a5\'f4\'a6\'f3\'bd\'c4\'ac\'f0\'a9\'ce\'a8\'e4\'a5\'4c\'aa\'ba\'b1\'f8\'b4\'da\'a1\'43\'ab\'44\'b8\'67\'c2\'f9\'a4\'e8\'b1\'c2\'c5\'76\'a5\'4e\'aa\'ed\'ae\'d1\'ad\'b1\'c3\'b1\'b8\'70\'a1\'41\'a7\'5f\'ab\'68\'b9\'ef\'a9\'f3\'a5\'bb\'a6\'58\'ac\'f9\'a4\'a7\'ad\'d7\'a7\'ef\'b1\'4e\'b5\'4c\'a9\'eb\'a7\'f4\'a4\'4f\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\par -\pard\nowidctlpar\qc\lang1028\f0\'bc\'57\'b8\'c9\'b1\'c2\'c5\'76\'b1\'f8\'b4\'da\lang5130\f1\par -\pard\nowidctlpar\par -\pard\nowidctlpar\qj\lang1028\f0\'af\'f7\'ac\'b0\'b8\'c9\'a5\'52\'a9\'ce\'ad\'d7\'a7\'ef\'a1\'75\'a4\'47\'b6\'69\'a6\'ec\'b5\'7b\'a6\'a1\'bd\'58\'b1\'c2\'c5\'76\'a6\'58\'ac\'f9\'a1\'76\'a4\'a7\'b3\'57\'a9\'77\'a1\'41\'a8\'ee\'ad\'71\'a5\'bb\'bc\'57\'b8\'c9\'b1\'c2\'c5\'76\'b1\'f8\'b4\'da\'a1\'43\'a5\'bb\'bc\'57\'b8\'c9\'b1\'f8\'b4\'da\'a4\'a4\'a5\'bc\'a9\'77\'b8\'71\'a4\'a7\'b1\'4d\'aa\'f9\'a5\'ce\'bb\'79\'c0\'b3\'bb\'50\'a4\'47\'b6\'69\'a6\'ec\'b5\'7b\'a6\'a1\'bd\'58\'b1\'c2\'c5\'76\'a6\'58\'ac\'f9\'a4\'a4\'aa\'ba\'ac\'db\'a6\'50\'a5\'ce\'bb\'79\'a6\'b3\'ac\'db\'a6\'50\'b8\'d1\'c4\'c0\'a1\'43\'a5\'bb\'bc\'57\'b8\'c9\'b1\'f8\'b4\'da\'ad\'59\'bb\'50\'a4\'47\'b6\'69\'a6\'ec\'b5\'7b\'a6\'a1\'bd\'58\'b1\'c2\'c5\'76\'a6\'58\'ac\'f9\'a9\'ce\'b8\'d3\'b3\'6e\'c5\'e9\'a4\'a4\'a5\'5d\'a7\'74\'aa\'ba\'a9\'d2\'a6\'b3\'b1\'c2\'c5\'76\'a6\'b3\'a5\'f4\'a6\'f3\'a4\'a3\'a4\'40\'ad\'50\'a9\'ce\'a5\'d9\'ac\'de\'a1\'41\'c0\'b3\'a5\'48\'a5\'bb\'bc\'57\'b8\'c9\'b1\'f8\'b4\'da\'ac\'b0\'b7\'c7\'a1\'43\lang5130\f1\par -\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 A.\tab\'b3\'6e\'c5\'e9\'aa\'ba\'a4\'ba\'b3\'a1\'a8\'cf\'a5\'ce\'a9\'4d\'b6\'7d\'b5\'6f\'b3\'5c\'a5\'69\'c3\'d2\'b1\'c2\'c5\'76\'a1\'43\b0 \'ae\'da\'be\'da\'a6\'b9\'a8\'f3\'c4\'b3\'aa\'ba\'b1\'f8\'b4\'da\'a9\'4d\'b1\'f8\'a5\'f3\'a5\'48\'a4\'ce\'a5\'48\'a4\'de\'a5\'ce\'a4\'e8\'a6\'a1\'a8\'d6\'a4\'4a\'a5\'bb\'a4\'e5\'a4\'a4\'aa\'ba\'b3\'6e\'c5\'e9\lang1033\f1\ldblquote\lang1028\f0 README\lang1033\f1\rdblquote\lang1028\f0\'c0\'c9\'a4\'a4\'a9\'d2\'ad\'7a\'aa\'ba\'ac\'f9\'a7\'f4\'a5\'48\'a4\'ce\'a8\'d2\'a5\'7e\'b1\'a1\'aa\'70\'a1\'41\'a5\'5d\'ac\'41 (\'a6\'fd\'a4\'a3\'ad\'ad\'a9\'f3) \'b3\'6f\'a8\'c7\'b8\'c9\'a5\'52\'b1\'f8\'b4\'da\'aa\'ba Java \'a7\'de\'b3\'4e\'ac\'f9\'a7\'f4\'a1\'41Sun \'a7\'4b\'b6\'4f\'b1\'c2\'a4\'a9\'b1\'7a\'ab\'44\'b1\'c6\'a5\'4c\'a1\'42\'a4\'a3\'a5\'69\'c2\'e0\'c5\'fd\'aa\'ba\'a8\'fc\'ad\'ad\'b3\'5c\'a5\'69\'a1\'41\'a5\'69\'a6\'62\'a4\'ba\'b3\'a1\'bd\'c6\'bb\'73\'a9\'4d\'a8\'cf\'a5\'ce\'a4\'77\'b8\'67\'a7\'b9\'a6\'a8\'a5\'42\'a5\'bc\'b8\'67\'ad\'d7\'ad\'71\'aa\'ba\'b3\'6e\'c5\'e9\'a5\'48\'b3\'5d\'ad\'70\'a1\'42\'b6\'7d\'b5\'6f\'a9\'4d\'b4\'fa\'b8\'d5\'b1\'7a\'aa\'ba\'b5\'7b\'a6\'a1\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 B.\tab\'b4\'b2\'a7\'47\'b3\'6e\'c5\'e9\'a4\'a7\'b1\'c2\'c5\'76\b0\'a1\'43\'a8\'cc\'be\'da\'a6\'58\'ac\'f9\'a4\'a7\'b3\'57\'a9\'77\'a4\'ce\'b1\'f8\'a5\'f3\'a5\'48\'a4\'ce\'a1\'75README\'a1\'76\'c5\'aa\'a7\'da\'c0\'c9\'a6\'43\'a5\'58\'aa\'ba\'ad\'ad\'a8\'ee\'a9\'4d\'b0\'a3\'a5\'7e\'b3\'57\'a9\'77 (\'a5\'5d\'ac\'41\'a6\'fd\'a4\'a3\'ad\'ad\'a9\'f3\'a5\'bb\'bc\'57\'b8\'c9\'b1\'f8\'b4\'da\'a1\'75Java \'a7\'de\'b3\'4e\'ad\'ad\'a8\'ee\'a1\'76) \'a1\'41Sun \'a9\'f3\'b1\'7a\'b2\'c5\'a6\'58\'a4\'55\'a6\'43\'b1\'f8\'a5\'f3\'ae\'c9\'a1\'41\'b1\'c2\'a4\'a9\'b1\'7a\'ab\'44\'b1\'4d\'c4\'dd\'a1\'42\'a4\'a3\'a5\'69\'b2\'be\'c2\'e0\'a1\'42\'a7\'4b\'b1\'c2\'c5\'76\'b6\'4f\'aa\'ba\'a6\'b3\'ad\'ad\'b1\'c2\'c5\'76\'a1\'41\'ad\'e3\'b3\'5c\'b1\'7a\'ad\'ab\'bb\'73\'bb\'50\'b4\'b2\'a7\'47\'a5\'bb\'b3\'6e\'c5\'e9 (JavaFX Runtime \'b0\'a3\'a5\'7e)\'a1\'47 (i) \'b6\'c8\'b4\'b2\'a7\'47\'a7\'b9\'be\'e3\'a6\'d3\'a5\'bc\'ad\'d7\'a7\'ef\'aa\'ba\'a5\'bb\'b3\'6e\'c5\'e9\'a1\'41\'a6\'d3\'a5\'42\'b6\'c8\'a7\'40\'ac\'b0\'b5\'7b\'a6\'a1\'c0\'48\'aa\'fe\'a4\'a7\'a4\'40\'b3\'a1\'a4\'c0\'b4\'b2\'a7\'47\'a1\'41\'b4\'b2\'a7\'47\'a4\'a7\'a5\'d8\'aa\'ba\'b6\'c8\'ad\'ad\'a9\'f3\'b0\'f5\'a6\'e6\'b1\'7a\'aa\'ba\'a1\'75\'b5\'7b\'a6\'a1\'a1\'76\'a1\'46 (ii) \'a1\'75\'b5\'7b\'a6\'a1\'a1\'76\'b6\'b7\'ac\'b0\'a5\'bb\'b3\'6e\'c5\'e9\'bc\'57\'a5\'5b\'c5\'e3\'b5\'db\'a4\'ce\'ad\'ab\'ad\'6e\'aa\'ba\'a5\'5c\'af\'e0\'a1\'46 (iii) \'a5\'bc\'b4\'b2\'a7\'47\'c0\'c0\'a5\'ce\'a5\'48\'b4\'c0\'b4\'ab\'a5\'bb\'b3\'6e\'c5\'e9\'a4\'a4\'a5\'f4\'a6\'f3\'a4\'b8\'a5\'f3\'a4\'a7\'aa\'fe\'a5\'5b\'b3\'6e\'c5\'e9\'a1\'46 (iv) \'a5\'bc\'b2\'be\'b0\'a3\'a9\'ce\'a7\'ef\'c5\'dc\'a5\'bb\'b3\'6e\'c5\'e9\'a9\'d2\'a7\'74\'a4\'a7\'a5\'f4\'a6\'f3\'b1\'4d\'c4\'dd\'c5\'76\'bb\'a1\'a9\'fa\'a9\'ce\'a4\'bd\'a7\'69\'a1\'46 (v) \'b6\'c8\'a8\'cc\'be\'da\'a9\'f3\'ab\'4f\'c5\'40 Sun \'a4\'a7\'a7\'51\'af\'71\'bb\'50\'a5\'bb\'a6\'58\'ac\'f9\'b1\'f8\'b4\'da\'a4\'40\'ad\'50\'a4\'a7\'b1\'c2\'c5\'76\'a6\'58\'ac\'f9\'b4\'b2\'a7\'47\'a5\'bb\'b3\'6e\'c5\'e9\'a1\'46\'a5\'48\'a4\'ce (vi) \'a6\'50\'b7\'4e\'a1\'52\'ad\'59\'a6\'5d\'a8\'cf\'a5\'ce\'a9\'ce\'b4\'b2\'a7\'47\'a5\'f4\'a4\'40\'a4\'ce\'a9\'d2\'a6\'b3\'a1\'75\'b5\'7b\'a6\'a1\'a1\'76\'a4\'ce (\'a9\'ce) \'a5\'bb\'b3\'6e\'c5\'e9\'a6\'d3\'be\'c9\'ad\'50\'a9\'ce\'b3\'79\'a6\'a8\'b2\'c4\'a4\'54\'a4\'e8\'b4\'a3\'a5\'58\'a8\'44\'c0\'76\'a1\'42\'b6\'44\'b3\'5e\'a9\'ce\'aa\'6b\'ab\'df\'a6\'e6\'b0\'ca\'a1\'41\'b9\'ef\'a9\'f3\'a5\'d1\'a6\'b9\'a6\'d3\'a5\'cd\'a4\'a7\'a5\'f4\'a6\'f3\'b7\'6c\'ae\'60\'a1\'42\'a6\'a8\'a5\'bb\'a4\'e4\'a5\'58\'a1\'42\'b3\'64\'a5\'f4\'a1\'42\'a9\'4d\'b8\'d1\'aa\'f7\'a4\'ce (\'a9\'ce) \'b6\'4f\'a5\'ce (\'a5\'5d\'ac\'41\'ab\'df\'ae\'76\'b6\'4f) \'a1\'41\'b1\'7a\'b1\'4e\'ac\'b0 Sun \'a4\'ce\'a8\'e4\'b1\'c2\'c5\'76\'aa\'cc\'b4\'a3\'a8\'d1\'c5\'47\'c5\'40\'a8\'c3\'b5\'b9\'a4\'a9\'b8\'c9\'c0\'76\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 C.\tab Java \'a7\'de\'b3\'4e\'ad\'ad\'a8\'ee\b0\'a1\'43\'b1\'7a\'a4\'a3\'b1\'6f\'ab\'d8\'a5\'df\'a9\'ce\'ad\'d7\'a7\'ef\'a5\'48\'a5\'f4\'a6\'f3\'a4\'e8\'a6\'a1\'b3\'51\'bc\'d0\'a5\'dc\'ac\'b0\'a1\'75java\'a1\'76\'a1\'42\'a1\'75javax\'a1\'76\'a9\'ce\'a1\'75sun\'a1\'76\'a9\'ce Sun \'a6\'62\'a5\'f4\'a6\'f3\'a9\'52\'a6\'57\'a8\'f3\'a9\'77\'a4\'a4\'ab\'fc\'a9\'fa\'c3\'fe\'a6\'fc\'a8\'f3\'a9\'77\'a4\'a7\'c3\'fe\'a7\'4f\'a1\'42\'a4\'b6\'ad\'b1\'a9\'ce\'a4\'6c\'ae\'4d\'b8\'cb\'b3\'6e\'c5\'e9\'a9\'ce\'a7\'ef\'c5\'dc\'a8\'e4\'a6\'e6\u29234?\'a1\'41\'a4\'5d\'a4\'a3\'b1\'6f\'b1\'c2\'c5\'76\'b3\'51\'b1\'c2\'c5\'76\'aa\'cc\'ab\'d8\'a5\'df\'a9\'ce\'ad\'d7\'a7\'ef\'b8\'d3\'b5\'a5\'c3\'fe\'a7\'4f\'a1\'42\'a4\'b6\'ad\'b1\'a9\'ce\'a4\'6c\'ae\'4d\'b8\'cb\'b3\'6e\'c5\'e9\'a9\'ce\'a7\'ef\'c5\'dc\'a8\'e4\'a6\'e6\u29234?\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 D.\tab\'ad\'ec\'a9\'6c\'bd\'58\b0\'a1\'43\'a1\'75\'b3\'6e\'c5\'e9\'a1\'76\'a5\'69\'af\'e0\'a5\'5d\'a7\'74\'ad\'ec\'a9\'6c\'bd\'58\'a1\'46\'b0\'a3\'ab\'44\'ac\'b0\'a8\'e4\'a5\'4c\'a5\'d8\'aa\'ba\'a9\'fa\'bd\'54\'a6\'d3\'b5\'b9\'a4\'a9\'b1\'c2\'c5\'76\'a1\'41\'b4\'a3\'a8\'d1\'ad\'ec\'a9\'6c\'bd\'58\'a4\'a7\'b0\'df\'a4\'40\'a5\'d8\'aa\'ba\'ab\'59\'ae\'da\'be\'da\'a6\'58\'ac\'f9\'a4\'a7\'b3\'57\'a9\'77\'a7\'40\'ac\'b0\'b1\'7a\'b0\'d1\'a6\'d2\'a4\'a7\'a5\'ce\'a1\'43\'ab\'44\'b8\'67\'a6\'58\'ac\'f9\'a9\'fa\'a9\'77\'a1\'41\'ad\'ec\'a9\'6c\'bd\'58\'a4\'a3\'b1\'6f\'ad\'ab\'b7\'73\'b4\'b2\'a7\'47\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\li360\qj\par -\pard\nowidctlpar\fi-360\li720\qj\tx720\lang1028\b\f0 E.\tab\'b2\'c4\'a4\'54\'a4\'e8\'bd\'58\b0\'a1\'43THIRDPARTYLICENSEREADME.txt file \'a7\'74\'a6\'b3\'c3\'f6\'a9\'f3\'b3\'6e\'c5\'e9\'ac\'59\'a8\'c7\'b3\'a1\'a4\'c0\'aa\'ba\'a8\'e4\'a5\'4c\'aa\'a9\'c5\'76\'b3\'71\'aa\'be\'a9\'4d\'b1\'c2\'c5\'76\'b1\'f8\'b4\'da\'a1\'43\'b0\'a3 THIRDPARTYLICENSEREADME.txt file \'a9\'d2\'a6\'43\'a5\'58\'aa\'ba\'b2\'c4\'a4\'54\'a4\'e8\'b6\'7d\'a9\'f1\'bd\'58/\'a6\'40\'a8\'c9\'b3\'6e\'c5\'e9\'a4\'a7\'b1\'f8\'b4\'da\'a9\'4d\'b1\'f8\'a5\'f3\'a4\'a7\'a5\'7e\'a1\'41\'a4\'47\'b6\'69\'a6\'ec\'b1\'c2\'c5\'76\'a6\'58\'ac\'f9\'b2\'c45\'b4\'da\'a9\'4d\'b2\'c46\'b4\'da\'aa\'ba\'a9\'da\'b5\'b4\'be\'e1\'ab\'4f\'a8\'c6\'b6\'b5\'a4\'ce\'b8\'71\'b0\'c8\'a4\'a7\'ad\'ad\'a8\'ee\'b3\'57\'a9\'77\'be\'41\'a5\'ce\'a9\'f3\'a5\'bb\'a6\'b8\'b4\'b2\'a7\'47\'aa\'ba\'a9\'d2\'a6\'b3\'b3\'6e\'c5\'e9\'a1\'43\lang5130\f1\par -\par -\lang1028\b\f0 F.\lang5130\b0\f1\tab\lang1028\b\f0\'b2\'d7\'a4\'ee\'ab\'49\'ae\'60\b0\'a1\'43 \'a5\'f4\'a6\'f3\'b3\'6e\'c5\'e9\'a6\'a8\'ac\'b0\'a9\'ce\'a5\'f4\'a4\'40\'a4\'e8\'aa\'ba\'a5\'44\'b1\'69\'a5\'69\'af\'e0\'a6\'a8\'ac\'b0\'a5\'f4\'a6\'f3\'aa\'be\'c3\'d1\'b2\'a3\'c5\'76\'aa\'ba\'ab\'49\'c5\'76\'af\'c1\'bd\'df\'b9\'ef\'b6\'48\'ab\'e1\'a1\'41\'a5\'f4\'a4\'40\'a4\'e8\'a5\'69\'a5\'df\'a7\'59\'b2\'d7\'a4\'ee\'a6\'b9\'a8\'f3\'c4\'b3\'a1\'43\lang5130\f1\par -\par -\lang1028\b\f0 G.\lang5130\b0\f1\tab\lang1028\b\f0\'a6\'77\'b8\'cb\'a9\'4d\'a6\'db\'b0\'ca\'a7\'f3\'b7\'73\b0\'a1\'43 \'b3\'6e\'c5\'e9\'aa\'ba\'a6\'77\'b8\'cb\'a9\'4d\'a6\'db\'b0\'ca\'a7\'f3\'b7\'73\'b9\'4c\'b5\'7b\'a6\'56 Sun (\'a9\'ce\'a8\'e4\'aa\'41\'b0\'c8\'a8\'d1\'c0\'b3\'b0\'d3) \'b6\'c7\'bf\'e9\'a6\'b3\'c3\'f6\'af\'53\'a9\'77\'b9\'4c\'b5\'7b\'aa\'ba\'a6\'b3\'ad\'ad\'b8\'ea\'ae\'c6\'a5\'48\'c0\'b0\'a7\'55 Sun \'b2\'7a\'b8\'d1\'a8\'c3\'b9\'ef\'a8\'e4\'b6\'69\'a6\'e6\'c0\'75\'a4\'c6\'a1\'43 Sun \'a5\'bc\'b1\'4e\'b3\'6f\'a8\'c7\'b8\'ea\'ae\'c6\'bb\'50\'ad\'d3\'a4\'48\'aa\'ba\'a5\'69\'c3\'d1\'a7\'4f\'b8\'ea\'b0\'54\'c3\'f6\'c1\'70\'a1\'43 \'ad\'59\'ad\'6e\'ac\'64\'a7\'e4\'a7\'f3\'a6\'68 Sun \'a6\'ac\'b6\'b0\'aa\'ba\'b8\'d3\'b8\'ea\'ae\'c6\'aa\'ba\'ac\'db\'c3\'f6\'b8\'ea\'b0\'54\'a1\'41\'bd\'d0\'b3\'58\'b0\'dd http://java.com/data/\'a1\'43\lang5130\f1\par -\pard\nowidctlpar\qj\par -\lang1028\f0\'ad\'59\'a6\'b3\'b0\'dd\'c3\'44\'a1\'41\'bd\'d0\'ad\'50\'a8\'e7\'a1\'47Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U\lang2052\f2 .\lang1028\f0 S\lang2052\f2 .\lang1028\f0 A\lang2052\f2 .\lang1028\f0\par -} diff --git a/ReplicatorG/build/windows/dist/java/README.txt b/ReplicatorG/build/windows/dist/java/README.txt deleted file mode 100644 index 079eb00..0000000 --- a/ReplicatorG/build/windows/dist/java/README.txt +++ /dev/null @@ -1,376 +0,0 @@ - README - - Java(TM) Platform, Standard Edition - Runtime Environment - Version 6 - - -The Java(TM) Platform, Standard Edition Runtime Environment (JRE(TM)), -excluding the JavaFX(TM) runtime, is intended for software developers -and vendors to redistribute with their applications. - -The Java SE Runtime Environment contains the Java virtual machine, -runtime class libraries, and Java application launcher that are -necessary to run programs written in the Java programming language. -It is not a development environment and does not contain development -tools such as compilers or debuggers. For development tools, see the -Java SE Development Kit (JDK(TM)). The JRE installation triggers the -download of the JavaFX runtime. The JavaFX runtime is also available -separately, and is not part of the JRE. For information on JavaFX, and -how to make changes, go to: http://java.com/javafx - - -======================================================================= - Deploying Applications with the Java SE Runtime Environment -======================================================================= - -When you deploy an application written in the Java programming -language, your software bundle will probably consist of the following -parts: - - Your own class, resource, and data files. - The Java SE Runtime Environment. - An installation procedure or program. - -You already have the first part, of course. The remainder of this -document covers the other two parts. See also the Notes for Developers -page on the Java Software website: - - http://java.sun.com/javase/6/webnotes/runtime.html - ------------------------------------------------------------------------ -Java Platform, Standard Edition Runtime Environment (JRE) ------------------------------------------------------------------------ - -To run your application, a user needs the Java SE Runtime Environment, -which is freely available from Sun. Or, you can redistribute the -Java SE Runtime Environment for free with your application, according -to the terms of the Java SE Platform Runtime Environment's license. The -JavaFX runtime is only required to run applications written in the -JavaFX scripting language; it is freely available from Sun, and must -not be redistributed with your application. - -The final step in the deployment process occurs when the software is -installed on an individual user's system. Installation consists of copying -software onto the user's system, then configuring the user's system -to support that software. You should ensure that your installation -procedure does not overwrite existing JRE installations, as they may -be required by other applications. - - -======================================================================= - Redistribution of the Java SE Runtime Environment (JRE) -======================================================================= - - -------------------------------------------------------- - NOTE - The license for this software does not allow the - redistribution of beta and other pre-release versions. - -------------------------------------------------------- - -Subject to the terms and conditions of the Software License -Agreement and the obligations, restrictions, and exceptions set -forth below, You may reproduce and distribute the Software (and -also portions of Software identified below as Redistributable), -provided that: - -(a) you distribute the Software complete and unmodified and only - bundled as part of your applets and applications ("Programs"), - -(b) your Programs add significant and primary functionality to the - Software, - -(c) your Programs are only intended to run on Java-enabled general - purpose desktop computers and servers, - -(d) you distribute Software for the sole purpose of running your - Programs, - -(e) you do not distribute additional software intended to replace - any component(s) of the Software, - -(f) you do not remove or alter any proprietary legends or notices - contained in or on the Software, - -(g) you only distribute the Software subject to a license agreement - that protects Sun's interests consistent with the terms - contained in this Agreement, and - -(h) you agree to defend and indemnify Sun and its licensors from - and against any damages, costs, liabilities, settlement amounts - and/or expenses (including attorneys' fees) incurred in - connection with any claim, lawsuit or action by any third party - that arises or results from the use or distribution of any and - all Programs and/or Software. - -The term "vendors" used here refers to licensees, developers, and -independent software vendors (ISVs) who license and distribute the -Java SE Runtime Environment with their programs. - -Vendors must follow the terms of the Java SE Runtime Environment Binary -Code License agreement. - ------------------------------------------------------------------------ -Required vs. Optional Files ------------------------------------------------------------------------ - -The files that make up the Java SE Runtime Environment are divided into -two categories: required and optional. Optional files may be excluded -from redistributions of the Java SE Runtime Environment at the -vendor's discretion. - -The following section contains a list of the files and directories that -may optionally be omitted from redistributions with the Java SE Runtime -Environment. All files not in these lists of optional files must be -included in redistributions of the runtime environment. - ------------------------------------------------------------------------ -Optional Files and Directories ------------------------------------------------------------------------ - -The following files may be optionally excluded from redistributions. -These files are located in the jre1.6.0_ directory, where - is the update version number. Solaris and Linux filenames -and separators are shown. Windows executables have the ".exe" suffix. -Corresponding files with _g in the name can also be excluded. -The corresponding man pages should be excluded for any excluded -executables (with paths listed below beginning with bin/ , -for the Solaris(TM) Operating System and Linux). - - lib/charsets.jar - Character conversion classes - lib/ext/ - sunjce_provider.jar - the SunJCE provider for Java - Cryptography APIs - localedata.jar - contains many of the resources - needed for non US English locales - ldapsec.jar - contains security features supported - by the LDAP service provider - dnsns.jar - for the InetAddress wrapper of JNDI DNS provider - bin/rmid - Java RMI Activation System Daemon - bin/rmiregistry - Java Remote Object Registry - bin/tnameserv - Java IDL Name Server - bin/keytool - Key and Certificate Management Tool - bin/kinit - Used to obtain and cache Kerberos ticket-granting tickets - bin/klist - Kerberos display entries in credentials cache and keytab - bin/ktab - Kerberos key table manager - bin/policytool - Policy File Creation and Management Tool - bin/orbd - Object Request Broker Daemon - bin/servertool - Java IDL Server Tool - bin/javaws, lib/javaws/ and lib/javaws.jar - Java Web Start - -When redistributing the JRE on Microsoft Windows as a private -application runtime (not accessible by other applications) -with a custom launcher, the following files are also -optional. These are libraries and executables that are used -for Java support in Internet Explorer and Mozilla family browsers; -these files are not needed in a private JRE redistribution. - - bin\java.exe - bin\javaw.exe - bin\javaws.exe - bin\javacpl.exe - bin\jucheck.exe - bin\jusched.exe - - bin\wsdetect.dll - bin\NPJPI*.dll (The filename changes in every release) - bin\NPJava11.dll - bin\NPJava12.dll - bin\NPJava13.dll - bin\NPJava14.dll - bin\NPJava32.dll - bin\NPOJI610.dll - bin\RegUtils.dll - bin\axbridge.dll - bin\deploy.dll - bin\jpicom.dll - bin\javacpl.cpl - bin\jpiexp.dll - bin\jpinscp.dll - bin\jpioji.dll - bin\jpishare.dll - lib\deploy.jar - lib\plugin.jar - lib\javaws.jar - lib\javaws\messages.properties - lib\javaws\messages_de.properties - lib\javaws\messages_es.properties - lib\javaws\messages_fr.properties - lib\javaws\messages_it.properties - lib\javaws\messages_ja.properties - lib\javaws\messages_ko.properties - lib\javaws\messages_sv.properties - lib\javaws\messages_zh_CN.properties - lib\javaws\messages_zh_HK.properties - lib\javaws\messages_zh_TW.properties - lib\javaws\miniSplash.jpg - - ------------------------------------------------------------------------ -Redistributable JDK(TM) Files ------------------------------------------------------------------------ - -The limited set of files from the Java SE Development Kit (JDK) -listed below may be included in vendor redistributions of the Java SE -Runtime Environment. All paths are relative to the top-level -directory of the JDK. The corresponding man pages should be included for -any included executables (with paths listed below beginning with bin/ , -for the Solaris(TM) Operating System and Linux). - - jre/lib/cmm/PYCC.pf - Color profile. This file is required only if one wishes to - convert between the PYCC color space and another color space. - - All .ttf font files in the jre/lib/fonts directory. - Note that the LucidaSansRegular.ttf font is already contained - in the Java SE Runtime Environment, so there is no need to - bring that file over from the JDK. - - jre/lib/audio/soundbank.gm - This MIDI soundbank is present in the JDK, but it has - been removed from the Java SE Runtime Environment in order to - reduce the size of the Runtime Environment's download bundle. - However, a soundbank file is necessary for MIDI playback, and - therefore the JDK's soundbank.gm file may be included in - redistributions of the Runtime Environment at the vendor's - discretion. Several versions of enhanced MIDI soundbanks are - available from the Java Sound web site: - http://java.sun.com/products/java-media/sound/ - These alternative soundbanks may be included in redistributions - of the Java SE Runtime Environment. - - The javac bytecode compiler, consisting of the following files: - bin/javac [Solaris(TM) Operating System - and Linux] - bin/sparcv9/javac [Solaris Operating System - (SPARC(R) Platform Edition)] - bin/amd64/javac [Solaris Operating System (AMD)] - bin/javac.exe [Microsoft Windows] - lib/tools.jar [All platforms] - - The Annotation Processing Tool, consisting of the following files: - lib/tools.jar [All platforms] - bin/apt [Solaris(TM) Operating System - and Linux] - bin/sparcv9/apt [Solaris Operating System - (SPARC(R) Platform Edition)] - bin/amd64/apt [Solaris Operating System (AMD)] - bin/apt.exe [Microsoft Windows] - - lib/jconsole.jar - The Jconsole application. NOTE: The Jconsole application requires - the dynamic attach mechanism. - - The dynamic attach mechanism consisting of the following files: - lib/tools.jar [All platforms] - jre/lib/sparc/libattach.so - [Solaris(TM) Operating System (SPARC(R) Platform Edition) and Linux] - jre/lib/sparcv9/libattach.so - [Solaris(TM) Operating System (SPARC(R) Platform Edition) and Linux] - jre/lib/i386/libattach.so - [Solaris(TM) Operating System (x86) and Linux] - jre/lib/amd64/libattach.so - [Solaris(TM) Operating System (AMD) and Linux] - jre\bin\attach.dll [Microsoft Windows] - - The Java Platform Debugger Architecture implementation consisting of the - files shown in the dynamic attach section above, and the following files: - lib/tools.jar [All platforms] - lib/sa-jdi.jar [All platforms] - jre/lib/sparc/libsaproc.so - [Solaris(TM) Operating System (SPARC(R) Platform Edition) and Linux] - jre/lib/sparcv9/libsaproc.so - [Solaris(TM) Operating System (SPARC(R) Platform Edition) and Linux] - jre/lib/i386/libsaproc.so - [Solaris(TM) Operating System (x86) and Linux] - jre/lib/amd64/libsaproc.so - [Solaris(TM) Operating System (AMD) and Linux] - - jre\bin\server\ - On Microsoft Windows platforms, the JDK includes both - the Java HotSpot(TM) Server VM and Java HotSpot Client VM. - However, the Java SE Runtime Environment for Microsoft Windows - platforms includes only the Java HotSpot Client VM. Those wishing - to use the Java HotSpot Server VM with the Java SE Runtime - Environment may copy the JDK's jre\bin\server folder to a - bin\server directory in the Java SE Runtime Environment. Software - vendors may redistribute the Java HotSpot Server VM with their - redistributions of the Java SE Runtime Environment. - - ------------------------------------------------------------------------ -Unlimited Strength Java Cryptography Extension ------------------------------------------------------------------------ - -Due to import control restrictions for some countries, the Java -Cryptography Extension (JCE) policy files shipped with the Java SE -Development Kit and the Java SE Runtime Environment allow strong but -limited cryptography to be used. These files are located at - - /lib/security/local_policy.jar - /lib/security/US_export_policy.jar - -where is the jre directory of the JDK or the -top-level directory of the Java SE Runtime Environment. - -An unlimited strength version of these files indicating no restrictions -on cryptographic strengths is available on the JDK web site for -those living in eligible countries. Those living in eligible countries -may download the unlimited strength version and replace the strong -cryptography jar files with the unlimited strength files. - ------------------------------------------------------------------------ -The cacerts Certificates File ------------------------------------------------------------------------ - -Root CA certificates may be added to or removed from the Java SE -certificate file located at - - /lib/security/cacerts - -For more information, see The cacerts Certificates File section -in the keytool documentation at: - -http://java.sun.com/javase/6/docs/tooldocs/solaris/keytool.html#cacerts - -======================================================================= -Endorsed Standards Override Mechanism -======================================================================= - -From time to time it is necessary to update the Java platform in order -to incorporate newer versions of standards that are created outside of -the Java Community Process(SM) (JCP(SM) http://www.jcp.org/) (Endorsed -Standards), or in order to update the version of a technology included -in the platform to correspond to a later standalone version of that -technology (Standalone Technologies). - -The Endorsed Standards Override Mechanism provides a means whereby -later versions of classes and interfaces that implement Endorsed -Standards or Standalone Technologies may be incorporated into the Java -Platform. - -For more information on the Endorsed Standards Override Mechanism, -including the list of platform packages that it may be used to -override, see - - http://java.sun.com/javase/6/docs/technotes/guides/standards/ - ------------------------------------------------------------------------ -The Java(TM) Runtime Environment (JRE) and the JavaFX(TM) runtime are -products of Sun Microsystems(TM), Inc. - -Copyright © 2009 Sun Microsystems, Inc. -4150 Network Circle, Santa Clara, California 95054, U.S.A. -All rights reserved. - diff --git a/ReplicatorG/build/windows/dist/java/THIRDPARTYLICENSEREADME.txt b/ReplicatorG/build/windows/dist/java/THIRDPARTYLICENSEREADME.txt deleted file mode 100644 index 05bfc24..0000000 --- a/ReplicatorG/build/windows/dist/java/THIRDPARTYLICENSEREADME.txt +++ /dev/null @@ -1,3011 +0,0 @@ -DO NOT TRANSLATE OR LOCALIZE. - -%% The following software may be included in this product: CS CodeViewer v1.0; Use of any of this software is governed by the terms of the license below: -Copyright 1999 by CoolServlets.com. - -Any errors or suggested improvements to this class can be reported as instructed on CoolServlets.com. We hope you enjoy this program... your comments will encourage further development! -This software is distributed under the terms of the BSD License. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -Neither name of CoolServlets.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING INANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." - -%% The following software may be included in this product: Crimson v1.1.1 ; Use of any of this software is governed by the terms of the license below: -/* -* The Apache Software License, Version 1.1 -* -* -* Copyright (c) 1999-2000 The Apache Software Foundation. All rights * reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in -* the documentation and/or other materials provided with the -* distribution. -* -* 3. The end-user documentation included with the redistribution, -* if any, must include the following acknowledgment: -* "This product includes software developed by the -* Apache Software Foundation (http://www.apache.org/)." -* Alternately, this acknowledgment may appear in the software itself, -* if and wherever such third-party acknowledgments normally appear. -* -* 4. The names "Crimson" and "Apache Software Foundation" must -* not be used to endorse or promote products derived from this -* software without prior written permission. For written -* permission, please contact apache@apache.org. -* -* 5. Products derived from this software may not be called "Apache", -* nor may "Apache" appear in their name, without prior written -* permission of the Apache Software Foundation. -* -* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR -* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -* SUCH DAMAGE. -* ====================================================================* -* This software consists of voluntary contributions made by many -* individuals on behalf of the Apache Software Foundation and was -* originally based on software copyright (c) 1999, International -* Business Machines, Inc., http://www.ibm.com. For more -* information on the Apache Software Foundation, please see -* . -*/ - - -%% The following software may be included in this product: Xalan J2; Use of any of this software is governed by the terms of the license below: - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owneror by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use,reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer,and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -%% The following software may be included in this product: NSIS 1.0j; Use of any of this software is governed by the terms of the license below: -Copyright (C) 1999-2000 Nullsoft, Inc. -This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. Justin Frankel justin@nullsoft.com" - -%% Some Portions licensed from IBM are available at: -http://www.ibm.com/software/globalization/icu/ - -%% Portions Copyright Eastman Kodak Company 1992 - -%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the U.S. and other countries. - -%% Portions licensed from Taligent, Inc. - -%% The following software may be included in this product:IAIK PKCS Wrapper; Use of any of this software is governed by the terms of the license below: - -Copyright (c) 2002 Graz University of Technology. All rights reserved. -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: - - "This product includes software developed by IAIK of Graz University of Technology." - - Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - -4. The names "Graz University of Technology" and "IAIK of Graz University of Technology" must not be used to endorse or promote products derived from this software without prior written permission. - -5. Products derived from this software may not be called "IAIK PKCS Wrapper", nor may "IAIK" appear in their name, without prior written permission of Graz University of Technology. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -%% The following software may be included in this product: Document Object Model (DOM) v. Level 3; Use of any of this software is governed by the terms of the license below: -W3C SOFTWARE NOTICE AND LICENSE - -http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - -This work (and included software, documentation such as READMEs, or other related items) is being provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. - -Permission to copy, modify, and distribute this software and its documentation, with or without modification, for -any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies -of the software and documentation or portions thereof, including modifications: - 1.The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. - 2.Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the - W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body - of any redistributed or derivative code. - 3.Notice of any changes or modifications to the files, including the date changes were made. (We - recommend you provide URIs to the location from which the code is derived.) -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKENO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THEUSE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. -The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the -software without specific, written prior permission. Title to copyright in this software and any associated -documentation will at all times remain with copyright holders. - -____________________________________ - -This formulation of W3C's notice and license became active on December 31 2002. This version removes the -copyright ownership notice such that this license can be used with materials other than those owned by the -W3C, reflects that ERCIM is now a host of the W3C, includes references to this specific dated version of the -license, and removes the ambiguous grant of "use". Otherwise, this version is the same as the previous -version and is written so as to preserve the Free Software Foundation's assessment of GPL compatibility and -OSI's certification under the Open Source Definition. Please see our Copyright FAQ for common questions -about using materials from our site, including specific terms and conditions for packages like libwww, Amaya, -and Jigsaw. Other questions about this notice can be directed to -site-policy@w3.org. - -%% The following software may be included in this product: Xalan, Xerces; Use of any of this software is governed by the terms of the license below: /* - * The Apache Software License, Version 1.1 - * - * - * Copyright (c) 1999-2003 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Xerces" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation and was - * originally based on software copyright (c) 1999, International - * Business Machines, Inc., http://www.ibm.com. For more - * information on the Apache Software Foundation, please see http://www.apache.org - * - -%% The following software may be included in this product: W3C XML Conformance Test Suites v. 20020606; Use of any of this software is governed by the terms of the license below: -W3C SOFTWARE NOTICE AND LICENSE -Copyright 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/ -This W3C work (including software, documents, or other related items) is beingprovided by the copyright holders under the following license. By obtaining,using and/or copying this work, you (the licensee) agree that you have read,understood, and will comply with the following terms and conditions: - -Permission to use, copy, modify, and distribute this software and its -documentation, with or without modification, for any purpose and without fee orroyalty is hereby granted, provided that you include the following on ALL copiesof the software and documentation or portions thereof, including modifications,that you make: - - 1. The full text of this NOTICE in a location viewable to users of theredistributed or derivative work. - 2. Any pre-existing intellectual property disclaimers, notices, or terms andconditions. If none exist, a short notice of the following form (hypertext ispreferred, text is permitted) should be used within the body of any -redistributed or derivative code: "Copyright ýý [$date-of-software] World WideWeb Consortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" - 3. Notice of any changes or modifications to the W3C files, including thedate changes were made. (We recommend you provide URIs to the location fromwhich the code is derived.) - -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKENO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITEDTO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THATTHE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTYPATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. -The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to the software without specific, written prior permission.Title to copyright in this software and any associated documentation will at alltimes remain with copyright holders. - -____________________________________ - -This formulation of W3C's notice and license became active on August 14 1998 soas to improve compatibility with GPL. This version ensures that W3C softwarelicensing terms are no more restrictive than GPL and consequently W3C softwaremay be distributed in GPL packages. See the older formulation for the policyprior to this date. Please see our Copyright FAQ for common questions aboutusing materials from our site, including specific terms and conditions forpackages like libwww, Amaya, and Jigsaw. Other questions about this notice canbe directed to site-policy@w3.org. - -%% The following software may be included in this product: W3C XML Schema Test Collection v. 1.16.2; Use of any of this software is governed by the terms of the license below: W3C DOCUMENT NOTICE AND LICENSE -Copyright 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. -http://www.w3.org/Consortium/Legal/ - -Public documents on the W3C site are provided by the copyright holders under thefollowing license. The software or Document Type Definitions (DTDs) associatedwith W3C specifications are governed by the Software Notice. By using and/orcopying this document, or the W3C document from which this statement is linked,you (the licensee) agree that you have read, understood, and will comply withthe following terms and conditions: - -Permission to use, copy, and distribute the contents of this document, or theW3C document from which this statement is linked, in any medium for any purposeand without fee or royalty is hereby granted, provided that you include thefollowing on ALL copies of the document, or portions thereof, that you use: - 1. A link or URL to the original W3C document. - 2. The pre-existing copyright notice of the original author, or if it doesn'texist, a notice of the form: "Copyright [$date-of-document] World Wide WebConsortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but atextual representation is permitted.) - 3. If it exists, the STATUS of the W3C document. - -When space permits, inclusion of the full text of this NOTICE should beprovided. We request that authorship attribution be provided in any software,documents, or other items or products that you create pursuant to the -implementation of the contents of this document, or any portion thereof. -No right to create modifications or derivatives of W3C documents is grantedpursuant to this license. However, if additional requirements (documented in theCopyright FAQ) are satisfied, the right to create modifications or derivativesis sometimes granted by the W3C to individuals complying with those requirements. -THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONSOR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE;THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THEIMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCEOR IMPLEMENTATION OF THE CONTENTS THEREOF. - -The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to this document or its contents without specific, writtenprior permission. Title to copyright in this document will at all times remainwith copyright holders. - ----------------------------------------------------------------------------- -This formulation of W3C's notice and license became active on April 05 1999 soas to account for the treatment of DTDs, schema's and bindings. See the olderformulation for the policy prior to this date. Please see our Copyright FAQ forcommon questions about using materials from our site, including specific termsand conditions for packages like libwww, Amaya, and Jigsaw. Other questionsabout this notice can be directed to site-policy@w3.org. -webmaster -(last updated by reagle on 1999/04/99.) - - - -%% The following software may be included in this product: Mesa 3-D graphics library v. 5; Use of any of this software is governed by the terms of the license below: -core Mesa code include/GL/gl.h Brian Paul -Mesa GLX driver include/GL/glx.h Brian Paul -Mesa Ext registry include/GL/glext.h SGI -SGI Free B include/GL/glxext.h - -Mesa license: - -The Mesa distribution consists of several components. Different copyrights andlicenses apply to different components. For example, GLUT is copyrighted by MarkKilgard, some demo programs are copyrighted by SGI, some of the Mesa devicedrivers are copyrighted by their authors. See below for a list of Mesa'scomponents and the copyright/license for each. - -The core Mesa library is licensed according to the terms of the XFree86copyright (an MIT-style license). This allows integration with the XFree86/DRIproject. Unless otherwise stated, the Mesa source code and documentation islicensed as follows: - -Copyright (C) 1999-2003 Brian Paul All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining acopy of this software and associated documentation files (the "Software"),to deal in the Software without restriction, including without limitationthe rights to use, copy, modify, merge, publish, distribute, sublicense,and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be includedin all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALLBRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER INAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -SGI FREE SOFTWARE LICENSE B (Version 1.1 [02/22/2000]) -1. Definitions. -1.1 "Additional Notice Provisions" means such additional provisions as appear in the Notice in Original Code under the heading "Additional Notice Provisions." -1.2 "Covered Code" means the Original Code or Modifications, or any combination thereof. -1.3 "Hardware" means any physical device that accepts input, processes input, stores the results of processing, and/or provides output. -1.4 "Larger Work" means a work that combines Covered Code or portions thereof with code not governed by the terms of this License. -1.5 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. -1.6 "License" means this document. -1.7 "Licensed Patents" means patent claims Licensable by SGI that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof. -1.8 "Modifications" means any addition to or deletion from the substance or structure of the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to the contents of a file containing Original Code and/or addition to or deletion from the contents of a file containing previous Modifications.B. Any new file that contains any part of the Original Code or previous Modifications. -1.9 "Notice" means any notice in Original Code or Covered Code, as required by and in compliance with this License. -1.10 "Original Code" means source code of computer software code that is described in the source code Notice required by Exhibit A as Original Code, and updates and error corrections specifically thereto. -1.11 "Recipient" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 8. For legal entities, "Recipient" includes any entity that controls, is controlled by, or is under common control with Recipient. For purposes of this definition, "control" of an entity means (a) the power, direct or indirect, to direct or manage such entity, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. -1.12 "Recipient Patents" means patent claims Licensable by a Recipient that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof. -1.13 "SGI" means Silicon Graphics, Inc. -1.14 "SGI Patents" means patent claims Licensable by SGI other than the Licensed Patents.2. License Grant and Restrictions. -2.1 SGI License Grant. Subject to the terms of this License and any third party intellectual property claims, for the duration of intellectual property protections inherent in the Original Code, SGI hereby grants Recipient a worldwide, royalty-free, non-exclusive license, to do the following: (i) under copyrights Licensable by SGI, to reproduce, distribute, create derivative works from, and, to the extent applicable, display and perform the Original Code and/or any Modifications provided by SGI alone and/or as part of a Larger Work; and (ii) under any Licensable Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI. Recipient accepts the terms and conditions of this License by undertaking any of the aforementioned actions. The patent license shall apply to the Covered Code if, at the time any related Modification is added, such addition of the Modification causes such combination to be covered by the Licensed Patents. The patent license in Section 2.1(ii) shall not apply to any other combinations that include the Modification. No patent license is provided under SGI Patents for infringements of SGI Patents by Modifications not provided by SGI or combinations of Original Code and Modifications not provided by SGI. 2.2 Recipient License Grant. Subject to the terms of this License and any third party intellectual property claims, Recipient hereby grants SGI and any other Recipients a worldwide, royalty-free, non-exclusive license, under any Recipient Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI. -2.3 No License For Hardware Implementations. The licenses granted in Section 2.1 and 2.2 are not applicable to implementation in Hardware of the algorithms embodied in the Original Code or any Modifications provided by SGI . -3. Redistributions. -3.1 Retention of Notice/Copy of License. The Notice set forth in Exhibit A, below, must be conspicuously retained or included in any and all redistributions of Covered Code. For distributions of the Covered Code in source code form, the Notice must appear in every file that can include a text comments field; in executable form, the Notice and a copy of this License must appear in related documentation or collateral where the Recipient's rights relating to Covered Code are described. Any Additional Notice Provisions which actually appears in the Original Code must also be retained or included in any and all redistributions of Covered Code. -3.2 Alternative License. Provided that Recipient is in compliance with the terms of this License, Recipient may, so long as without derogation of any of SGI's rights in and to the Original Code, distribute the source code and/or executable version(s) of Covered Code under (1) this License; (2) a license identical to this License but for only such changes as are necessary in order to clarify Recipient's role as licensor of Modifications; and/or (3) a license of Recipient's choosing, containing terms different from this License, provided that the license terms include this Section 3 and Sections 4, 6, 7, 10, 12, and 13, which terms may not be modified or superseded by any other terms of such license. If Recipient elects to use any license other than this License, Recipient must make it absolutely clear that any of its terms which differ from this License are offered by Recipient alone, and not by SGI. It is emphasized that this License is a limited license, and, regardless of the license form employed by Recipient in accordance with this Section 3.2, Recipient may relicense only such rights, in Original Code and Modifications by SGI, as it has actually been granted by SGI in this License. -3.3 Indemnity. Recipient hereby agrees to indemnify SGI for any liability incurred by SGI as a result of any such alternative license terms Recipient offers. -4. Termination. This License and the rights granted hereunder will terminate automatically if Recipient breaches any term herein and fails to cure such breach within 30 days thereof. Any sublicense to the Covered Code that is properly granted shall survive any termination of this License, absent termination by the terms of such sublicense. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive. -5. No Trademark Or Other Rights. This License does not grant any rights to: (i) any software apart from the Covered Code, nor shall any other rights or licenses not expressly granted hereunder arise by implication, estoppel or otherwise with respect to the Covered Code; (ii) any trade name, trademark or service mark whatsoever, including without limitation any related right for purposes of endorsement or promotion of products derived from the Covered Code, without prior written permission of SGI; or (iii) any title to or ownership of the Original Code, which shall at all times remains with SGI. All rights in the Original Code not expressly granted under this License are reserved. -6. Compliance with Laws; Non-Infringement. There are various worldwide laws, regulations, and executive orders applicable to dispositions of Covered Code, including without limitation export, re-export, and import control laws, regulations, and executive orders, of the U.S. government and other countries, and Recipient is reminded it is obliged to obey such laws, regulations, and executive orders. Recipient may not distribute Covered Code that (i) in any way infringes (directly or contributorily) any intellectual property rights of any kind of any other person or entity or (ii) breaches any representation or warranty, express, implied or statutory, to which, under any applicable law, it might be deemed to have been subject. -7. Claims of Infringement. If Recipient learns of any third party claim that any disposition of Covered Code and/or functionality wholly or partially infringes the third party's intellectual property rights, Recipient will promptly notify SGI of such claim. -8. Versions of the License. SGI may publish revised and/or new versions of the License from time to time, each with a distinguishing version number. Once Covered Code has been published under a particular version of the License, Recipient may, for the duration of the license, continue to use it under the terms of that version, or choose to use such Covered Code under the terms of any subsequent version published by SGI. Subject to the provisions of Sections 3 and 4 of this License, only SGI may modify the terms applicable to Covered Code created under this License. -9. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED "AS IS." ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. SGI ASSUMES NO RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY IS AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT SUBJECT TO THIS DISCLAIMER. -10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES NOR LEGAL THEORY, WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT. -11. Indemnity. Recipient shall be solely responsible for damages arising, directly or indirectly, out of its utilization of rights under this License. Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from and against any loss, liability, damages, costs or expenses (including the payment of reasonable attorneys fees) arising out of Recipient's use, modification, reproduction and distribution of the Covered Code or out of any representation or warranty made by Recipient. -12. U.S. Government End Users. The Covered Code is a "commercial item" consisting of "commercial computer software" as such terms are defined in title 48 of the Code of Federal Regulations and all U.S. Government End Users acquire only the rights set forth in this License and are subject to the terms of this License. -13. Miscellaneous. This License represents the complete agreement concerning the its subject matter. If any provision of this License is held to be unenforceable, such provision shall be reformed so as to achieve as nearly as possible the same legal and economic effect as the original provision and the remainder of this License will remain in effect. This License shall be governed by and construed in accordance with the laws of the United States and the State of California as applied to agreements entered into and to be performed entirely within California between California residents. Any litigation relating to this License shall be subject to the exclusive jurisdiction of the Federal Courts of the Northern District of California (or, absent subject matter jurisdiction in such courts, the courts of the State of California), with venue lying exclusively in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation that provides that the language of a contract shall be construed against the drafter shall not apply to this License. -Exhibit A -License Applicability. Except to the extent portions of this file are made subject to an alternative license as permitted in the SGI Free Software License B, Version 1.1 (the "License"), the contents of this file are subject only to the provisions of the License. You may not use this file except in compliance with the License. You may obtain a copy of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: http://oss.sgi.com/projects/FreeB -Note that, as provided in the License, the Software is distributed on an "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.Original Code. The Original Code is: [name of software, version number, and release date], developed by Silicon Graphics, Inc. The Original Code is Copyright (c) [dates of first publication, as appearing in the Notice in the Original Code] Silicon Graphics, Inc. Copyright in any portions created by third parties is as indicated elsewhere herein. All Rights Reserved.Additional Notice Provisions: [such additional provisions, if any, as appear in the Notice in the Original Code under the heading "Additional Notice Provisions"] - -%% The following software may be included in this product: Byte Code Engineering Library (BCEL) v. 5; Use of any of this software is governed by the terms of the license below: -Apache Software License - -/ -==================================================================== -The Apache Software License, Version 1.1 - -Copyright (c) 2001 The Apache Software Foundation. Allrights reserved. - -Redistribution and use in source and binary forms, withor without modification, are permitted provided that the followingconditions are met: - -1. Redistributions of source code must retain the abovecopyright notice, this list of conditions and the followingdisclaimer. - -2. Redistributions in binary form must reproduce theabove copyright notice, this list of conditions and the followingdisclaimer in the documentation and/or other materials providedwith the distribution. - -3. The end-user documentation included with theredistribution, if any, must include the following acknowledgment: -"This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in thesoftware itself, if and wherever such third-party acknowledgmentsnormally appear. - -4. The names "Apache" and "Apache Software Foundation"and "Apache BCEL" must not be used to endorse or promoteproducts derived from this software without prior writtenpermission. For written permission, please contact apache@apache.org. - -5. Products derived from this software may not be called"Apache", "Apache BCEL", nor may "Apache" appear in their name,without prior written permission of the Apache SoftwareFoundation. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED ORIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSEARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWAREFOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVERCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING INANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE. -==================================================================== - -This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache Software Foundation, please see http://www.apache.org. / - - - -%% The following software may be included in this product: Regexp, Regular Expression Package v. 1.2; Use of any of this software is governed by the terms of the license below: The Apache Software License, Version 1.1 -Copyright (c) 2001 The Apache Software Foundation. All rights reserved. -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: -"This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - -4. The names "Apache" and "Apache Software Foundation" and "Apache Turbine" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - -5. Products derived from this software may not be called "Apache", "Apache Turbine", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -==================================================================== -This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache Software Foundation, please see http://www.apache.org. - -%% The following software may be included in this product: CUP Parser Generator for Java v. 0.10k; Use of any of this software is governed by the terms of the license below: CUP Parser Generator Copyright Notice, License, and Disclaimer - -Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian -Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided thatthe above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the names of the authors or their employersnot be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. - -The authors and their employers disclaim all warranties with regard to thissoftware, including all implied warranties of merchantability and fitness. In no event shall the authors or their employers be liable for anyspecial, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract,negligence or other tortious action, arising out of or in connection withthe use or performance of this software. - -%% The following software may be included in this product: JLex: A Lexical Analyzer Generator for Java v. 1.2.5; Use of any of this software is governed by the terms of the license below: JLEX COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. - -Copyright 1996-2003 by Elliot Joel Berk and C. Scott Ananian - -Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright noticeappear in all copies and that both the copyright notice and this permission notice and warrantydisclaimer appear in supporting documentation, and that the name of the authors or their employersnot be used in advertising or publicity pertaining to distribution of the software withoutspecific, written prior permission. - -The authors and their employers disclaim all warranties with regard to thissoftware, including all implied warranties of merchantability and fitness. In no event shall the authorsor their employers be liable for any special, indirect or consequential damages or any damageswhatsoever resulting from loss of use, data or profits, whether in an action of contract, negligenceor other tortious action, arising out of or in connection with the use or performance of thissoftware. - -Java is a trademark of Sun Microsystems, Inc. References to the Java programminglanguage in relation to JLex are not meant to imply that Sun endorses this product. - -%% The following software may be included in this product: SAX v. 2.0.1; Use of any of this software is governed by the terms of the license below: Copyright Status - -SAX is free! - -In fact, it's not possible to own a license to SAX, since it's been placed in the public domain. - -No Warranty - -Because SAX is released to the public domain, there is no warranty for the design or for the software implementation, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide SAX "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of SAX is with you. Should SAX prove defective, you assume the cost of all necessary servicing, repair or correction. - -In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute SAX, be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to use SAX (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or third parties or a failure of the SAX to operate with any other programs), even if such holder or other party has been advised of the possibility of such damages. - -Copyright Disclaimers - -This page includes statements to that effect by David Megginson, who would have been able to claim copyright for the original work. - -SAX 1.0 - -Version 1.0 of the Simple API for XML (SAX), created collectively by the membership of the XML-DEV mailing list, is hereby released into the public domain. - -No one owns SAX: you may use it freely in both commercial and non-commercial applications, bundle it with your software distribution, include it on a CD-ROM, list the source code in a book, mirror the documentation at your own web site, or use it in any other way you see fit. - -David Megginson, sax@megginson.com -1998-05-11 - -SAX 2.0 - -I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and release all of the SAX 2.0 source code, compiled code, and documentation contained in this distribution into the Public Domain. SAX comes with NO WARRANTY or guarantee of fitness for any purpose. - -David Megginson, david@megginson.com -2000-05-05 - -%% The following software may be included in this product: Cryptix; Use of any of this software is governed by the terms of the license below: -Cryptix General License - -Copyright © 1995-2003 The Cryptix Foundation Limited. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions aremet: - -1.Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. -2.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS ORIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FORA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BELIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOTLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESSINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OFTHE POSSIBILITY OF SUCH DAMAGE. - -%% The following software may be included in this product: W3C XML Schema Test Collection; Use of any of this software is governed by the terms of the license below: -W3C® DOCUMENT NOTICE AND LICENSE -Copyright © 1994-2002 World Wide Web Consortium, (Massachusetts Institute ofTechnology, Institut National de Recherche en Informatique et en Automatique,Keio University). All Rights Reserved. -http://www.w3.org/Consortium/Legal/ - -Public documents on the W3C site are provided by the copyright holders under thefollowing license. The software or Document Type Definitions (DTDs) associatedwith W3C specifications are governed by the Software Notice. By using and/orcopying this document, or the W3C document from which this statement is linked,you (the licensee) agree that you have read, understood, and will comply withthe following terms and conditions: - -Permission to use, copy, and distribute the contents of this document, or theW3C document from which this statement is linked, in any medium for any purposeand without fee or royalty is hereby granted, provided that you include thefollowing on ALL copies of the document, or portions thereof, that you use: - 1. A link or URL to the original W3C document. - 2. The pre-existing copyright notice of the original author, or if it doesn'texist, a notice of the form: "Copyright © [$date-of-document] World Wide WebConsortium, (Massachusetts Institute of Technology, Institut National deRecherche en Informatique et en Automatique, Keio University). All RightsReserved. http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, but atextual representation is permitted.) - 3. If it exists, the STATUS of the W3C document. - -When space permits, inclusion of the full text of this NOTICE should beprovided. We request that authorship attribution be provided in any software,documents, or other items or products that you create pursuant to the -implementation of the contents of this document, or any portion thereof. -No right to create modifications or derivatives of W3C documents is grantedpursuant to this license. However, if additional requirements (documented in theCopyright FAQ) are satisfied, the right to create modifications or derivativesis sometimes granted by the W3C to individuals complying with those requirements. -THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONSOR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE;THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THEIMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL ORCONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCEOR IMPLEMENTATION OF THE CONTENTS THEREOF. - -The name and trademarks of copyright holders may NOT be used in advertising orpublicity pertaining to this document or its contents without specific, writtenprior permission. Title to copyright in this document will at all times remainwith copyright holders. - ----------------------------------------------------------------------------- -This formulation of W3C's notice and license became active on April 05 1999 soas to account for the treatment of DTDs, schema's and bindings. See the olderformulation for the policy prior to this date. Please see our Copyright FAQ forcommon questions about using materials from our site, including specific termsand conditions for packages like libwww, Amaya, and Jigsaw. Other questionsabout this notice can be directed to site-policy@w3.org. -webmaster -(last updated by reagle on 1999/04/99.) - -%% The following software may be included in this product: Stax API; Use of any of this software is governed by the terms of the license below: -Streaming API for XML (JSR-173) Specification -Reference Implementation -License Agreement - -READ THE TERMS OF THIS (THE "AGREEMENT") CAREFULLY BEFORE VIEWING OR USING THESOFTWARE LICENSED HEREUNDER. BY VIEWING OR USING THE SOFTWARE, YOU AGREE TO THE TERMS OF THISAGREEMENT. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, INDICATE YOUR ACCEPTANCE OF THESETERMS BY SELECTING THE "ACCEPT" BUTTON AT THE END OF THIS AGREEMENT. IF YOU DO NOT AGREE TOALL THESE TERMS, PROMPTLY RETURN THE UNUSED SOFTWARE TO ORIGINAL CONTRIBUTOR, DEFINED HEREIN. -1.0 DEFINITIONS. - -1.1. "BEA" means BEA Systems, Inc., the licensor of the Original Code. -1.2. "Contributor" means BEA and each entity that creates or contributes to thecreation of Modifications. - -1.3. "Covered Code" means the Original Code or Modifications or the combinationof the Original Code and Modifications, in each case including portions thereof and corresponding documentation released with the source code. - -1.4. "Executable" means Covered Code in any form other than Source Code. -1.5. "FCS" means first commercial shipment of a product. - -1.6. "Modifications" means any addition to or deletion from the substance orstructure of either the Original Code or any previous Modifications. When Covered Code isreleased as a series of files, a Modification is: - -(a) Any addition to or deletion from the contents of a file containing OriginalCode or previous Modifications. - -(b) Any new file that contains any part of the Original Code or previousModifications. - -1.7. "Original Code" means Source Code of computer software code ReferenceImplementation. - -1.8. "Patent Claims" means any patent claim(s), now owned or hereafter acquired,including without limitation, method, process, and apparatus claims, in any patent for whichthe grantor has the right to grant a license. - -1.9. "Reference Implementation" means the prototype or "proof of concept"implementaÂtion of the Specification developed and made available for license by or on behalf of BEA. -1.10. "Source Code" means the preferred form of the Covered Code for makingmodifications to it, including all modules it contains, plus any associated documentation,interface definition files, scripts used to control compilation and installation of an Executable, orsource code differential comparisons against either the Original Code or another well known,available Covered Code of the Contributor's choice. - -1.11. "Specification" means the written specification for the Streaming API forXML , Java technology developed pursuant to the Java Community Process. -1.12. "Technology Compatibility Kit" or "TCK" means the documentation, testingtools and test suites associated with the Specification as may be revised by BEA from time totime, that is provided so that an implementer of the SpecifiÂcation may determine if itsimplementation is compliant with the Specification. - -1.13. "You" (or "Your") means an individual or a legal entity exercising rightsunder, and complying with all of the terms of, this Agreement or a future version of thisAgreement issued under Section 6.1. For legal entities, "You" includes any entity which controls,is controlled by, or is under common control with You. For purposes of this definition,"control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of theoutstanding shares or beneficial ownership of such entity. - -2.0 SOURCE CODE LICENSE. - -2.1. Copyright Grant. Subject to the terms of this Agreement, each Contributorhereby grants You a non-exclusive, worldwide, royalty-free copyright license to reproduce,prepare derivative works of, publicly display, publicly perform, distribute and sublicense theCovered Code of such Contributor, if any, and such derivative works, in Source Code andExecutable form. - -2.2. Patent Grant. Subject to the terms of this Agreement, each Contributorhereby grants You a non-exclusive, worldwide, royalty-free patent license under the PatentClaims to make, use, sell, offer to sell, import and otherwise transfer the Covered Code preparedand provided by such Contributor, if any, in Source Code and Executable form. This patentlicense shall apply to the Covered Code if, at the time a Modification is added by the Contributor,such addition of the Modification causes such combination to be covered by the Patent Claims.The patent license shall not apply to any other combinations which include the Modification. -2.3. Conditions to Grants. You understand that although each Contributorgrants the licenses to the Covered Code prepared by it, no assurances are provided by anyContributor that the Covered Code does not infringe the patent or other intellectual property rights ofany other entity. Each Contributor disclaims any liability to You for claims brought by anyother entity based on infringement of intellectual property rights or otherwise. As a conditionto exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a thirdparty patent license is required to allow You to distribute Covered Code, it is Your responsibility to acquire that license before distributing such code. - -2.4. Contributors' Representation. Each Contributor represents that to itsknowledge it has sufficient copyright rights in the Covered Code it provides , if any, to grantthe copyright license set forth in this Agreement. - -3.0 DISTRIBUION RESTRICTIONS. - -3.1. Application of Agreement. - -The Modifications which You create or to which You contribute are governed bythe terms of this Agreement, including without limitation Section 2.0. The Source Code versionof Covered Code may be distributed only under the terms of this Agreement or a future versionof this Agreement released under Section 6.1, and You must include a copy of this Agreementwith every copy of the Source Code You distribute. You may not offer or impose any terms on anySource Code version that alters or restricts the applicable version of this Agreement or therecipients' rights hereunder. However, You may include an additional document offering theadditional rights described in Section 3.3. - -3.2. Description of Modifications. - -You must cause all Covered Code to which You contribute to contain a filedocumenting the changes You made to create that Covered Code and the date of any change. You mustinclude a prominent statement that the Modification is derived, directly or indirectly, fromOriginal Code provided by BEA and including the name of BEA in (a) the Source Code, and (b) inany notice in an Executable version or related documentation in which You describe the origin orownership ofthe Covered Code. - -%% The following software may be included in this product: X Window System; Use of any of this software is governed by the terms of the license below: -Copyright The Open Group - -Permission to use, copy, modify, distribute, and sell this software and itsdocumentation for any purpose is hereby granted without fee, provided that theabove copyright notice appear in all copies and that both that copyright noticeand this permission notice appear in supporting documentation. - -The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUPBE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OFCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THESOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be usedin advertising or otherwise to promote the sale, use or other dealings in thisSoftware without prior written authorization from The Open Group. - -Portions also covered by other licenses as noted in the above URL. - -%% The following software may be included in this product: dom4j v. 1.6; Use of any of this software is governed by the terms of the license below: -Redistribution and use of this software and associated documentation -("Software"), with or without modification, are permitted provided that thefollowing conditions are met: - - 1. Redistributions of source code must retain copyright statements andnotices. Redistributions must also contain a copy of this document. - 2. Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentation and/orother materials provided with the distribution. - 3. The name "DOM4J" must not be used to endorse or promote products derivedfrom this Software without prior written permission of MetaStuff, Ltd. Forwritten permission, please contact dom4j-info@metastuff.com. - 4. Products derived from this Software may not be called "DOM4J" nor may"DOM4J" appear in their names without prior written permission of MetaStuff,Ltd. DOM4J is a registered trademark of MetaStuff, Ltd. - 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org -THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND ANYEXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FORANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ONANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. - -%% The following software may be included in this product: Retroweaver; Use of any of this software is governed by the terms of the license below: -Copyright (c) February 2004, Toby Reyelts -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -Neither the name of Toby Reyelts nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -%% The following software may be included in this product: stripper; Use of any of this software is governed by the terms of the license below: -Stripper : debug information stripper -Copyright (c) 2003 Kohsuke Kawaguchi -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote products derived fromthis software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -%% The following software may be included in this product: libpng official PNG reference library; Use of any of this software is governed by the terms of the license below: -This copy of the libpng notices is provided for your convenience. In case ofany discrepancy between this copy and the notices in the file png.h that isincluded in the libpng distribution, the latter shall prevail. - -COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: - -If you modify libpng you may insert additional notices immediately followingthis sentence. - -libpng version 1.2.6, December 3, 2004, is Copyright (c) 2004 Glenn Randers-Pehrson, and is distributed according to the same disclaimer and license as libpng-1.2.5with the following individual added to the list of Contributing Authors - Cosmin Truta - -libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.0.6 with the following individuals added to the list of Contributing Authors - Simon-Pierre Cadieux - Eric S. Raymond - Gilles Vollant - -and with the following additions to the disclaimer: - - There is no warranty against interference with your enjoyment of the library or against infringement. There is no warranty that our efforts or the library will fulfill any of your particular purposes or needs. This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user. - -libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, areCopyright (c) 1998, 1999 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-0.96,with the following individuals added to the list of Contributing Authors: - Tom Lane - Glenn Randers-Pehrson - Willem van Schaik - -libpng versions 0.89, June 1996, through 0.96, May 1997, are Copyright (c) 1996, 1997 Andreas Dilger -Distributed according to the same disclaimer and license as libpng-0.88, with the following individuals added to the list of Contributing Authors: - John Bowler - Kevin Bracey - Sam Bushell - Magnus Holmgren - Greg Roelofs - Tom Tanner - -libpng versions 0.5, May 1995, through 0.88, January 1996, are Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. - -For the purposes of this copyright and license, "Contributing Authors"is defined as the following set of individuals: - - Andreas Dilger - Dave Martindale - Guy Eric Schalnat - Paul Schmidt - Tim Wegner - -The PNG Reference Library is supplied "AS IS". The Contributing Authorsand Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and offitness for any purpose. The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary,or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage. - -Permission is hereby granted to use, copy, modify, and distribute thissource code, or portions hereof, for any purpose, without fee, subjectto the following restrictions: - -1. The origin of this source code must not be misrepresented. - -2. Altered versions must be plainly marked as such and must not be misrepresented as being the original source. - -3. This Copyright notice may not be removed or altered from any source or altered source distribution. - -The Contributing Authors and Group 42, Inc. specifically permit, withoutfee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products. If you use thissource code in a product, acknowledgment is not required but would be appreciated. - - -A "png_get_copyright" function is available, for convenient use in "about"boxes and the like: - - printf("%s",png_get_copyright(NULL)); - -Also, the PNG logo (in PNG format, of course) is supplied in the files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). - -Libpng is OSI Certified Open Source Software. OSI Certified Open Source is acertification mark of the Open Source Initiative. - -Glenn Randers-Pehrson -glennrp at users.sourceforge.net -December 3, 2004 - -%% The following software may be included in this product: Libungif - An uncompressed GIF library; Use of any of this software is governed by the terms of the license below: -The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond - -Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE. - - -%% The following software may be included in this product: Ant; Use of any of this software is governed by the terms of the license below: -License -The Apache Software License Version 2.0 - -The Apache Software License Version 2.0 applies to all releases of Ant startingwith ant 1.6.1 - -/* - * Apache License - * Version 2.0, January 2004 - * http://www.apache.org/licenses/ - * - * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - * - * 1. Definitions. - * - * "License" shall mean the terms and conditions for use, reproduction, - * and distribution as defined by Sections 1 through 9 of this document. - * - * "Licensor" shall mean the copyright owner or entity authorized by - * the copyright owner that is granting the License. - * - * "Legal Entity" shall mean the union of the acting entity and all - * other entities that control, are controlled by, or are under common - * control with that entity. For the purposes of this definition, - * "control" means (i) the power, direct or indirect, to cause the - * direction or management of such entity, whether by contract or - * otherwise, or (ii) ownership of fifty percent (50%) or more of the - * outstanding shares, or (iii) beneficial ownership of such entity. - * - * "You" (or "Your") shall mean an individual or Legal Entity - * exercising permissions granted by this License. - * - * "Source" form shall mean the preferred form for making modifications, - * including but not limited to software source code, documentation - * source, and configuration files. - * - * "Object" form shall mean any form resulting from mechanical - * transformation or translation of a Source form, including but - * not limited to compiled object code, generated documentation, - * and conversions to other media types. - * - * "Work" shall mean the work of authorship, whether in Source or - * Object form, made available under the License, as indicated by a - * copyright notice that is included in or attached to the work - * (an example is provided in the Appendix below). - * - * "Derivative Works" shall mean any work, whether in Source or Object - * form, that is based on (or derived from) the Work and for which the - * editorial revisions, annotations, elaborations, or other modifications - * represent, as a whole, an original work of authorship. For the purposes - * of this License, Derivative Works shall not include works that remain - * separable from, or merely link (or bind by name) to the interfaces of, - * the Work and Derivative Works thereof. - * - * "Contribution" shall mean any work of authorship, including - * the original version of the Work and any modifications or additions - * to that Work or Derivative Works thereof, that is intentionally - * submitted to Licensor for inclusion in the Work by the copyright owner - * or by an individual or Legal Entity authorized to submit on behalf of - * the copyright owner. For the purposes of this definition, "submitted" - * means any form of electronic, verbal, or written communication sent - * to the Licensor or its representatives, including but not limited to - * communication on electronic mailing lists, source code control systems, - * and issue tracking systems that are managed by, or on behalf of, the - * Licensor for the purpose of discussing and improving the Work, but - * excluding communication that is conspicuously marked or otherwise - * designated in writing by the copyright owner as "Not a Contribution." - * - * "Contributor" shall mean Licensor and any individual or Legal Entity - * on behalf of whom a Contribution has been received by Licensor and - * subsequently incorporated within the Work. - * - * 2. Grant of Copyright License. Subject to the terms and conditions of - * this License, each Contributor hereby grants to You a perpetual, - * worldwide, non-exclusive, no-charge, royalty-free, irrevocable - * copyright license to reproduce, prepare Derivative Works of, - * publicly display, publicly perform, sublicense, and distribute the - * Work and such Derivative Works in Source or Object form. - * - * 3. Grant of Patent License. Subject to the terms and conditions of - * this License, each Contributor hereby grants to You a perpetual, - * worldwide, non-exclusive, no-charge, royalty-free, irrevocable - * (except as stated in this section) patent license to make, have made, - * use, offer to sell, sell, import, and otherwise transfer the Work, - * where such license applies only to those patent claims licensable - * by such Contributor that are necessarily infringed by their - * Contribution(s) alone or by combination of their Contribution(s) - * with the Work to which such Contribution(s) was submitted. If You - * institute patent litigation against any entity (including a - * cross-claim or counterclaim in a lawsuit) alleging that the Work - * or a Contribution incorporated within the Work constitutes direct - * or contributory patent infringement, then any patent licenses - * granted to You under this License for that Work shall terminate - * as of the date such litigation is filed. - * - * 4. Redistribution. You may reproduce and distribute copies of the - * Work or Derivative Works thereof in any medium, with or without - * modifications, and in Source or Object form, provided that You - * meet the following conditions: - * - * (a) You must give any other recipients of the Work or - * Derivative Works a copy of this License; and - * - * (b) You must cause any modified files to carry prominent notices - * stating that You changed the files; and - * - * (c) You must retain, in the Source form of any Derivative Works - * that You distribute, all copyright, patent, trademark, and - * attribution notices from the Source form of the Work, - * excluding those notices that do not pertain to any part of - * the Derivative Works; and - * - * (d) If the Work includes a "NOTICE" text file as part of its - * distribution, then any Derivative Works that You distribute must - * include a readable copy of the attribution notices contained - * within such NOTICE file, excluding those notices that do not - * pertain to any part of the Derivative Works, in at least one - * of the following places: within a NOTICE text file distributed - * as part of the Derivative Works; within the Source form or - * documentation, if provided along with the Derivative Works; or, - * within a display generated by the Derivative Works, if and - * wherever such third-party notices normally appear. The contents - * of the NOTICE file are for informational purposes only and - * do not modify the License. You may add Your own attribution - * notices within Derivative Works that You distribute, alongside - * or as an addendum to the NOTICE text from the Work, provided - * that such additional attribution notices cannot be construed - * as modifying the License. - * - * You may add Your own copyright statement to Your modifications and - * may provide additional or different license terms and conditions - * for use, reproduction, or distribution of Your modifications, or - * for any such Derivative Works as a whole, provided Your use, - * reproduction, and distribution of the Work otherwise complies with - * the conditions stated in this License. - * - * 5. Submission of Contributions. Unless You explicitly state otherwise, - * any Contribution intentionally submitted for inclusion in the Work - * by You to the Licensor shall be under the terms and conditions of - * this License, without any additional terms or conditions. - * Notwithstanding the above, nothing herein shall supersede or modify - * the terms of any separate license agreement you may have executed - * with Licensor regarding such Contributions. - * - * 6. Trademarks. This License does not grant permission to use the trade - * names, trademarks, service marks, or product names of the Licensor, - * except as required for reasonable and customary use in describing the - * origin of the Work and reproducing the content of the NOTICE file. - * - * 7. Disclaimer of Warranty. Unless required by applicable law or - * agreed to in writing, Licensor provides the Work (and each - * Contributor provides its Contributions) on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied, including, without limitation, any warranties or conditions - * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - * PARTICULAR PURPOSE. You are solely responsible for determining the - * appropriateness of using or redistributing the Work and assume any - * risks associated with Your exercise of permissions under this License. - * - * 8. Limitation of Liability. In no event and under no legal theory, - * whether in tort (including negligence), contract, or otherwise, - * unless required by applicable law (such as deliberate and grossly - * negligent acts) or agreed to in writing, shall any Contributor be - * liable to You for damages, including any direct, indirect, special, - * incidental, or consequential damages of any character arising as a - * result of this License or out of the use or inability to use the - * Work (including but not limited to damages for loss of goodwill, - * work stoppage, computer failure or malfunction, or any and all - * other commercial damages or losses), even if such Contributor - * has been advised of the possibility of such damages. - * - * 9. Accepting Warranty or Additional Liability. While redistributing - * the Work or Derivative Works thereof, You may choose to offer, - * and charge a fee for, acceptance of support, warranty, indemnity, - * or other liability obligations and/or rights consistent with this - * License. However, in accepting such obligations, You may act only - * on Your own behalf and on Your sole responsibility, not on behalf - * of any other Contributor, and only if You agree to indemnify, - * defend, and hold each Contributor harmless for any liability - * incurred by, or claims asserted against, such Contributor by reason - * of your accepting any such warranty or additional liability. - * - * END OF TERMS AND CONDITIONS - * - * APPENDIX: How to apply the Apache License to your work. - * - * To apply the Apache License to your work, attach the following - * boilerplate notice, with the fields enclosed by brackets "[]" - * replaced with your own identifying information. (Don't include - * the brackets!) The text should be enclosed in the appropriate - * comment syntax for the file format. We also recommend that a - * file or class name and description of purpose be included on the - * same "printed page" as the copyright notice for easier - * identification within third-party archives. - * - * Copyright [yyyy] Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -You can download the original license file here. - -The License is accompanied by a NOTICE - - ========================================================================= - == NOTICE file corresponding to the section 4 d of == - == the Apache License, Version 2.0, == - == in this case for the Apache Ant distribution. == - ========================================================================= - This product includes software developed by - The Apache Software Foundation (http://www.apache.org/). - - This product includes also software developed by : - - the W3C consortium (http://www.w3c.org) , - - the SAX project (http://www.saxproject.org) - - Please read the different LICENSE files present in the root directory of this distribution. - - The names "Ant" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - -The Apache Software License, Version 1.1 - -The Apache Software License, Version 1.1, applies to all versions of up to ant1.6.0 included. - -/* - * ============================================================================ - * The Apache Software License, Version 1.1 - * ============================================================================ - * - * Copyright (C) 2000-2003 The Apache Software Foundation. All - * rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The end-user documentation included with the redistribution, if any, must - * include the following acknowledgment: "This product includes software - * developed by the Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, if - * and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Ant" and "Apache Software Foundation" must not be used to - * endorse or promote products derived from this software without prior - * written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", nor may - * "Apache" appear in their name, without prior written permission of the - * Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * on behalf of the Apache Software Foundation. For more information on the - * Apache Software Foundation, please see http://www.apache.org. - * - */ - - -%% The following software may be included in this product: XML Resolver library; Use of any of this software is governed by the terms of the license below: - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or -documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - - -%% The following software may be included in this product: ICU4J; Use of any of this software is governed by the terms of the license below: -ICU License - ICU 1.8.1 and later COPYRIGHT AND PERMISSION NOTICE Cop -yright (c) -1995-2003 International Business Machines Corporation and others All rightsreserved. Permission is hereby granted, free of charge, to any person obtaininga copy of this software and associated documentation files (the "Software"), todeal in the Software without restriction, including without limitation therights to use, copy, modify, merge, publish, distribute, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,provided that the above copyright notice(s) and this permission notice appear inall copies of the Software and that both the above copyright notice(s) and thispermission notice appear in supporting documentation. THE SOFTWARE IS PROVIDED"AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOTLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSEAND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHTHOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANYSPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTINGFROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCEOR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE ORPERFORMANCE OF THIS SOFTWARE. Except as contained in this notice, the name of acopyright holder shall not be used in advertising or otherwise to promote thesale, use or other dealings in this Software without prior written authorizationof the copyright holder. - - -%% The following software may be included in this product: NekoHTML; Use of any of this software is governed by the terms of the license below: -The CyberNeko Software License, Version 1.0 - - -(C) Copyright 2002,2003, Andy Clark. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - -3. The end-user documentation included with the redistribution, - if any, must include the following acknowledgment: - "This product includes software developed by Andy Clark." - Alternately, this acknowledgment may appear in the software itself, - if and wherever such third-party acknowledgments normally appear. - -4. The names "CyberNeko" and "NekoHTML" must not be used to endorse - or promote products derived from this software without prior - written permission. For written permission, please contact - andy@cyberneko.net. - -5. Products derived from this software may not be called "CyberNeko", - nor may "CyberNeko" appear in their name, without prior written - permission of the author. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -==================================================================== -This license is based on the Apache Software License, version 1.1 - - -%% The following software may be included in this product: Jing; Use of any of this software is governed by the terms of the license below: -Jing Copying Conditions - -Copyright (c) 2001-2003 Thai Open Source Software Center Ltd -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice,this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice,this list of conditions and the following disclaimer in the documentation and/orother materials provided with the distribution. - * Neither the name of the Thai Open Source Software Center Ltd nor the namesof its contributors may be used to endorse or promote products derived from thissoftware without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ANDANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ONANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -%% The following software may be included in this product: RelaxNGCC; Use of any of this software is governed by the terms of the license below: -Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: - - "This product includes software developed by Daisuke Okajima - and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)." - -Alternately, this acknowledgment may appear in the software itself, -if and wherever such third-party acknowledgments normally appear. - -4. The names of the copyright holders must not be used to endorse or -promote products derived from this software without prior written -permission. For written permission, please contact the copyright -holders. - -5. Products derived from this software may not be called "RELAXNGCC", -nor may "RELAXNGCC" appear in their name, without prior written -permission of the copyright holders. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -%% The following software may be included in this product: RELAX NG Object Model/Parser; Use of any of this software is governed by the terms of the license below: -The MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy ofthis software and associated documentation files (the "Software"), to deal inthe Software without restriction, including without limitation the rights touse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,subject to the following conditions: - -The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS ORCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHERIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -%% The following software may be included in this product: XFree86-VidMode Extension; Use of any of this software is governed by the terms of the license below: -Version 1.1 of ProjectLicence. - - Copyright (C) 1994-2004 The Project, Inc. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to deal inthe Software without restriction, including without limitation the rights touse, copy, modify, merge, publish, distribute, sublicence, and/or sell copies ofthe Software, and to permit persons to whom the Software is furnished to do so,subject to the following conditions: - - 1. Redistributions of source code must retain the above copyright notice,this list of conditions, and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution, and in thesame place and form as other copyright, license and disclaimer information. 3. The end-user documentation included with the redistribution, if any,must include the following acknowledgment: "This product includes softwaredeveloped by The XFree86 Project, Inc (http://www.xfree86.org/) and itscontributors", in the same place and form as other third-party acknowledgments.Alternately, this acknowledgment may appear in the software itself, in the sameform and location as other such third-party acknowledgments. - 4. Except as contained in this notice, the name of The XFree86 Project,Inc shall not be used in advertising or otherwise to promote the sale, use orother dealings in this Software without prior written authorization from TheXFree86 Project, Inc. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ANDFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE XFREE86PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ORBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER INCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISINGIN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITYOF SUCH DAMAGE. - - -%% The following software may be included in this product: RelaxNGCC; Use of any of this software is governed by the terms of the license below: -This is version 2003-May-08 of the Info-ZIP copyright and license. -The definitive version of this document should be available at -ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely. - - -Copyright (c) 1990-2003 Info-ZIP. All rights reserved. - -For the purposes of this copyright and license, "Info-ZIP" is defined asthe following set of individuals: - - Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, Jean-loup Gailly, Hunter Goatley, Ian Gorman, Chris Herborth, Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, Kai Uwe Rommel, Steve Salisbury, Dave Smith, Christian Spieler, Antoine Verheijen, - Paul von Behren, Rich Wales, Mike White - -This software is provided "as is," without warranty of any kind, expressor implied. In no event shall Info-ZIP or its contributors be held liablefor any direct, indirect, incidental, special or consequential damagesarising out of the use of or inability to use this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute itfreely, subject to the following restrictions: - - 1. Redistributions of source code must retain the above copyright notice, definition, disclaimer, and this list of conditions. - - 2. Redistributions in binary form (compiled executables) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution. The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled. - - 3. Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, and dynamic, shared, or static library versions--must be plainly marked as such and must not be misrepresented as being the original source. Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP. Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or of the Info-ZIP URL(s). - 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases. - - -%% The following software may be included in this product: XML Security; Use of any of this software is governed by the terms of the license below: - The Apache Software License, -Version 1.1 -PDF - -Copyright (C) 2002 The Apache SoftwareFoundation. -All rights reserved. Redistribution anduse in source and binary forms, with or withoutmodifica- -tion, are permitted provided that thefollowing conditions are met: -1. Redistributions ofsource code must retain the above copyrightnotice, this list of conditions and the followingdisclaimer. -2. Redistributions in binary form mustreproduce the above copyright notice, this list of conditions and the following disclaimerin the documentation and/or other materialsprovided with the distribution. -3. The end-userdocumentation included with the redistribution, if any,must include the following acknowledgment:"This product includes software developed bythe Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment mayappear in the software itself, if and wherever suchthird-party acknowledgments normally appear. -4. The names"Apache Forrest" and "Apache SoftwareFoundation" must not be used to endorse or promoteproducts -derived from this software without priorwritten permission. For written permission,please contact apache@apache.org. 5. Products derivedfrom this software may not be called "Apache", normay "Apache" appear in their name, without prior written permission of the Apache Software Foundation. -THIS SOFTWARE IS PROVIDED``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ORSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANYTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICTLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache SoftwareFoundation, please see http://www.apache.org. - - -%% The following software may be included in this product: Regexp, Regular Expression Package v. 1.2; Use of any of this software is governed by the terms of the license below: The Apache Software License, Version 1.1 -Copyright (c) 2001 The Apache Software Foundation. All rights -reserved. -Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: -"This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - -4. The names "Apache" and "Apache Software Foundation" and "Apache Turbine" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org. - -5. Products derived from this software may not be called "Apache", "Apache Turbine", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF -USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -==================================================================== -This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache Software Foundation, please see http://www.apache.org. - - -%% The following software may be included in this product: Visual Studio. Use of any of this software is governed by the terms of the license below: - -END-USER LICENSE AGREEMENT FOR MICROSOFT SOFTWARE -IMPORTANT-READ CAREFULLY: This End-User License Agreement ("EULA") is a legal agreement between you (either an individual or a single entity) and Microsoft Corporation ("Microsoft) for the Microsoft software that accompanies this EULA, which includes computer software and may include associated media, printed materials, "online" or electronic documentation, and Internet-based services ("Software"). An amendment or addendum to this EULA may accompany the Software. YOU AGREE TO BE BOUND BY THE TERMS OF THIS EULA BY INSTALLING, COPYING, OR OTHERWISE USING THE SOFTWARE. IF YOU DO NOT AGREE, DO NOT INSTALL, COPY, OR USE THE SOFTWARE; YOU MAY RETURN IT TO YOUR PLACE OF PURCHASE (IF APPLICABLE) FOR A FULL REFUND. - -MICROSOFT SOFTWARE LICENSE - -1. GRANTS OF LICENSE. Microsoft grants you the rights described in this EULA provided that you comply with all terms and conditions of this EULA. NOTE: Microsoft is not licensing to you any rights with respect to Crystal Reports for Microsoft Visual Studio .NET; your use of Crystal Reports for Microsoft Visual Studio .NET is subject to your acceptance of the terms and conditions of the enclosed (hard copy) end user license agreement from Crystal -Decisions for that product. -1.1 General License Grant. Microsoft grants to you as an individual, a personal, nonexclusive license to use the Software, and to make and use copies of the Software for the purposes of designing, developing, testing, and demonstrating your software product(s), provided that you are the only individual using the Software. If you are an entity, Microsoft grants to you a personal, nonexclusive license to use the Software, and to make and use copies of the Software, provided that for each individual using the Software within your organization, you have acquired a separate and valid license for each such individual. -1.2 Documentation. You may make and use an unlimited number of copies of any documentation, provided that such copies shall be used only for personal purposes and are not to be republished or distributed (either in hard copy or electronic form) beyond your premises. -1.3 Storage/Network Use. You may also store or install a copy of the Software on a storage device, such as a network server, used only to install or run the Software on computers used by licensed end users in accordance with Section 1.1. A single license for the Software may not be shared or used concurrently by multiple end users. -1.4 Visual Studio—Effect of EULA. As a suite of development tools and other Microsoft software programs (each such tool or software program, a "Component"), Components that you receive as part of the Software may include a separate end-user license agreement (each, a "Component EULA"). Except as provided in Section 4 ("Prerelease Code"), in the event of inconsistencies between this EULA and any Component EULA, the terms of this EULA shall control. The Software may also contain third-party software programs. Any such software is provided for your use as a convenience and your use is subject to the terms and conditions of any license agreement contained in that software. -2. ADDITIONAL LICENSE RIGHTS -- REDISTRIBUTABLE CODE. In addition to the rights granted in Section 1, certain portions of the Software, as described in this Section 2, are provided to you with additional license rights. These additional license rights are conditioned -Everett VSPro 1 -Final 11.04.02 -upon your compliance with the distribution requirements and license limitations described in -Section 3. -2.1 Sample Code. Microsoft grants you a limited, nonexclusive, royalty-free license -to: (a) use and modify the source code version of those portions of the Software identified as -"Samples" in REDIST.TXT or elsewhere in the Software ("Sample Code") for the sole purposes -of designing, developing, and testing your software product(s), and (b) reproduce and -distribute the Sample Code, along with any modifications thereof, in object and/or source code -form. For applicable redistribution requirements for Sample Code, see Section 3.1 below. -2.2 Redistributable Code—General. Microsoft grants you a limited, nonexclusive, -royalty-free license to reproduce and distribute the object code form of any portion of the -Software listed in REDIST.TXT ("Redistributable Code"). For general redistribution -requirements for Redistributable Code, see Section 3.1 below. -2.3 Redistributable Code—Microsoft Merge Modules ("MSM"). Microsoft grants -you a limited, nonexclusive, royalty-free license to reproduce and distribute the content of MSM -file(s) listed in REDIST.TXT in the manner described in the Software documentation only so -long as you redistribute such content in its entirety and do not modify such content in any way. -For all other applicable redistribution requirements for MSM files, see Section 3.1 below. -2.4 Redistributable Code—Microsoft Foundation Classes (MFC), Active Template -Libraries (ATL), and C runtimes (CRTs). In addition to the rights granted in Section 1, -Microsoft grants you a license to use and modify the source code version of those portions of -the Software that are identified as MFC, ATL, or CRTs (collectively, the "VC Redistributables"), -for the sole purposes of designing, developing, and testing your software product(s). Provided -you comply with Section 3.1 and you rename any files created by you that are included in the -Licensee Software (defined below), Microsoft grants you a limited, nonexclusive, royalty-free -license to reproduce and distribute the object code version of the VC Redistributables, including -any modifications you make. For purposes of this section, "modifications" shall mean -enhancements to the functionality of the VC Redistributables. For all other applicable -redistribution requirements for VC Redistributables, see Section 3.1 below. -3. DISTRIBUTION REQUIREMENTS AND OTHER LICENSE RIGHTS AND -LIMITATIONS. If you choose to exercise your rights under Section 2, any redistribution by -you is subject to your compliance with Section 3.1; some of the Redistributable Code has -additional limited use rights described in Section 3.2. -3.1 General Distribution Requirements. -(a) If you choose to redistribute Sample Code, or Redistributable Code -(collectively, the "Redistributables") as described in Section 2, you agree: (i) except as otherwise -noted in Section 2.1 (Sample Code), to distribute the Redistributables only in object code form -and in conjunction with and as a part of a software application product developed by you that -adds significant and primary functionality to the Redistributables ("Licensee Software"); -(ii) that the Redistributables only operate in conjunction with Microsoft Windows platforms; -(iii) that if the Licensee Software is distributed beyond Licensee's premises or externally from -Licensee's organization, to distribute the Licensee Software containing the Redistributables -pursuant to an end user license agreement (which may be "break-the-seal", "click-wrap" or -signed), with terms no less protective than those contained in this EULA; (iv) not to use -Microsoft's name, logo, or trademarks to market the Licensee Software; (v) to display your own -valid copyright notice which shall be sufficient to protect Microsoft's copyright in the Software; -Everett VSPro 2 -Final 11.04.02 -(vi) not to remove or obscure any copyright, trademark or patent notices that appear on the -Software as delivered to you; (vii) to indemnify, hold harmless, and defend Microsoft from and -against any claims or lawsuits, including attorney's fees, that arise or result from the use or -distribution of the Licensee Software; (viii) to otherwise comply with the terms of this EULA; -and (ix) agree that Microsoft reserves all rights not expressly granted. -You also agree not to permit further distribution of the Redistributables by your -end users except you may permit further redistribution of the Redistributables by your -distributors to your end-user customers if your distributors only distribute the Redistributables -in conjunction with, and as part of, the Licensee Software, you comply with all other terms of -this EULA, and your distributors comply with all restrictions of this EULA that are applicable -to you. - -(b) If you use the Redistributables, then in addition to your compliance with -the applicable distribution requirements described for the Redistributables, the following also -applies. Your license rights to the Redistributables are conditioned upon your not (i) creating -derivative works of the Redistributables in any manner that would cause the Redistributables in -whole or in part to become subject to any of the terms of an Excluded License; or (ii) -distributing the Redistributables (or derivative works thereof) in any manner that would cause -the Redistributables to become subject to any of the terms of an Excluded License. An -"Excluded License" is any license that requires as a condition of use, modification and/or -distribution of software subject to the Excluded License, that such software or other software -combined and/or distributed with such software be (x) disclosed or distributed in source code -form; (y) licensed for the purpose of making derivative works; or (z) redistributable at no -charge. -3.2 Additional Distribution Requirements for Certain Redistributable Code. -If you choose to redistribute the files discussed in this Section, then in addition to the terms of -Section 3.1, you must ALSO comply with the following. -(a) Microsoft SQL Server Desktop Engine ("MSDE"). If you redistribute -MSDE you agree to comply with the following additional requirements: (a) Licensee -Software shall not substantially duplicate the capabilities of Microsoft Access or, in the -reasonable opinion of Microsoft, compete with same; and (b) unless Licensee Software -requires your customers to license Microsoft Access in order to operate, you shall not -reproduce or use MSDE for commercial distribution in conjunction with a general -purpose word processing, spreadsheet or database management software product, or an -integrated work or product suite whose components include a general purpose word -processing, spreadsheet, or database management software product except for the -exclusive use of importing data to the various formats supported by Microsoft Access. -A product that includes limited word processing, spreadsheet or database components -along with other components which provide significant and primary value, such as an -accounting product with limited spreadsheet capability, is not considered to be a -"general purpose" product. -(b) Microsoft Data Access Components. If you redistribute the Microsoft -Data Access Component file identified as MDAC_TYP.EXE, you also agree to -redistribute such file in object code only in conjunction with and as a part of a Licensee -Software developed by you with a Microsoft development tool product that adds -significant and primary functionality to MDAC_TYP.EXE. -Everett VSPro 3 -Final 11.04.02 -3.3 Separation of Components. The Software is licensed as a single product. Its -component parts may not be separated for use by more than one user. -3.4 Benchmark Testing. The Software may contain the Microsoft .NET Framework. -You may not disclose the results of any benchmark test of the .NET Framework component of -the Software to any third party without Microsoft's prior written approval. -4. PRERELEASE CODE. Portions of the Software may be identified as prerelease code -("Prerelease Code"). Such Prerelease Code is not at the level of performance and compatibility -of the final, generally available product offering. The Prerelease Code may not operate correctly -and may be substantially modified prior to first commercial shipment. Microsoft is not -obligated to make this or any later version of the Prerelease Code commercially available. The -grant of license to use Prerelease Code expires upon availability of a commercial release of the -Prerelease Code from Microsoft. NOTE: In the event that Prerelease Code contains a separate -end-user license agreement, the terms and conditions of such end-user license agreement shall -govern your use of the corresponding Prerelease Code. -5. RESERVATION OF RIGHTS AND OWNERSHIP. Microsoft reserves all rights not -expressly granted to you in this EULA. The Software is protected by copyright and other -intellectual property laws and treaties. Microsoft or its suppliers own the title, copyright, and -other intellectual property rights in the Software. The Software is licensed, not sold. -6. LIMITATIONS ON REVERSE ENGINEERING, DECOMPILATION, AND -DISASSEMBLY. You may not reverse engineer, decompile, or disassemble the Software, -except and only to the extent that such activity is expressly permitted by applicable law -notwithstanding this limitation. -7. NO RENTAL/COMMERCIAL HOSTING. You may not rent, lease, lend or provide -commercial hosting services with the Software. -8. CONSENT TO USE OF DATA. You agree that Microsoft and its affiliates may collect -and use technical information gathered as part of the product support services provided to you, -if any, related to the Software. Microsoft may use this information solely to improve our -products or to provide customized services or technologies to you and will not disclose this -information in a form that personally identifies you. -9. LINKS TO THIRD PARTY SITES. You may link to third party sites through the use of -the Software. The third party sites are not under the control of Microsoft, and Microsoft is not -responsible for the contents of any third party sites, any links contained in third party sites, or -any changes or updates to third party sites. Microsoft is not responsible for webcasting or any -other form of transmission received from any third party sites. Microsoft is providing these -links to third party sites to you only as a convenience, and the inclusion of any link does not -imply an endorsement by Microsoft of the third party site. -10. ADDITIONAL SOFTWARE/SERVICES. This EULA applies to updates, supplements, -add-on components, or Internet-based services components, of the Software that Microsoft may -provide to you or make available to you after the date you obtain your initial copy of the -Software, unless we provide other terms along with the update, supplement, add-on -component, or Internet-based services component. Microsoft reserves the right to discontinue -any Internet-based services provided to you or made available to you through the use of the -Software. -11. UPGRADES/DOWNGRADES -Everett VSPro 4 -Final 11.04.02 -11.1 Upgrades. To use a version of the Software identified as an upgrade, you must -first be licensed for the software identified by Microsoft as eligible for the upgrade. After -upgrading, you may no longer use the software that formed the basis for your upgrade -eligibility. -11.2 Downgrades. Instead of installing and using the Software, you may install and -use copies of an earlier version of the Software, provided that you completely remove such -earlier version and install the current version of the Software within a reasonable time. Your -use of such earlier version shall be governed by this EULA, and your rights to use such earlier -version shall terminate when you install the Software. -11.3 Special Terms for Version 2003 Upgrade Editions of the Software. If the -Software accompanying this EULA is the version 2003 edition of the Software and you have -acquired it as an upgrade from the corresponding "2002" edition of the Microsoft software -product with the same product name as the Software (the "Qualifying Software"), then -Section 11.1 does not apply to you. Instead, you may continue to use the Qualifying Software -AND the version 2003 upgrade for so long as you continue to comply with the terms of this -EULA and the EULA governing your use of the Qualifying Software. Qualifying Software does -not include non-Microsoft software products. -12. NOT FOR RESALE SOFTWARE. Software identified as "Not For Resale" or "NFR," -may not be sold or otherwise transfered for value, or used for any purpose other than -demonstration, test or evaluation. -13. ACADEMIC EDITION SOFTWARE. To use Software identified as "Academic -Edition" or "AE," you must be a "Qualified Educational User." For qualification-related -questions, please contact the Microsoft Sales Information Center/One Microsoft -Way/Redmond, WA 98052-6399 or the Microsoft subsidiary serving your country. -14. EXPORT RESTRICTIONS. You acknowledge that the Software is subject to U.S. export -jurisdiction. You agree to comply with all applicable international and national laws that apply -to the Software, including the U.S. Export Administration Regulations, as well as end-user, end- -use, and destination restrictions issued by U.S. and other governments. For additional -information see . -15. SOFTWARE TRANSFER. The initial user of the Software may make a one-time -permanent transfer of this EULA and Software to another end user, provided the initial user -retains no copies of the Software. This transfer must include all of the Software (including all -component parts, the media and printed materials, any upgrades (including any Qualifying -Software as defined in Section 11.3), this EULA, and, if applicable, the Certificate of -Authenticity). The transfer may not be an indirect transfer, such as a consignment. Prior to the -transfer, the end user receiving the Software must agree to all the EULA terms. -16. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this -EULA if you fail to comply with the terms and conditions of this EULA. In such event, you -must destroy all copies of the Software and all of its component parts. -Everett VSPro 5 -Final 11.04.02 -17. LIMITED WARRANTY FOR SOFTWARE ACQUIRED IN THE US AND CANADA. -Except for the "Redistributables," which are provided AS IS without warranty of any kind, -Microsoft warrants that the Software will perform substantially in accordance with the -accompanying materials for a period of ninety (90) days from the date of receipt. - -If an implied warranty or condition is created by your state/jurisdiction and federal or -state/provincial law prohibits disclaimer of it, you also have an implied warranty or condition, -BUT ONLY AS TO DEFECTS DISCOVERED DURING THE PERIOD OF THIS LIMITED -WARRANTY (NINETY DAYS). AS TO ANY DEFECTS DISCOVERED AFTER THE -NINETY-DAY PERIOD, THERE IS NO WARRANTY OR CONDITION OF ANY KIND. - -Some states/jurisdictions do not allow limitations on how long an implied warranty or - - -condition lasts, so the above limitation may not apply to you. -Any supplements or updates to the Software, including without limitation, any (if any) service -packs or hot fixes provided to you after the expiration of the ninety day Limited Warranty -period are not covered by any warranty or condition, express, implied or statutory. - - -LIMITATION ON REMEDIES; NO CONSEQUENTIAL OR OTHER DAMAGES. Your -exclusive remedy for any breach of this Limited Warranty is as set forth below. Except for any -refund elected by Microsoft, YOU ARE NOT ENTITLED TO ANY DAMAGES, -INCLUDING BUT NOT LIMITED TO CONSEQUENTIAL DAMAGES, if the Software does -not meet Microsoft's Limited Warranty, and, to the maximum extent allowed by applicable  -law, even if any remedy fails of its essential purpose. The terms of Section 19 ("Exclusion of -Incidental, Consequential and Certain Other Damages") are also incorporated into this Limited -Warranty. Some states/jurisdictions do not allow the exclusion or limitation of incidental or -consequential damages, so the above limitation or exclusion may not apply to you. This -Limited Warranty gives you specific legal rights. You may have other rights which vary from -state/jurisdiction to state/jurisdiction. YOUR EXCLUSIVE REMEDY. Microsoft's and its -suppliers' entire liability and your exclusive remedy for any breach of this Limited Warranty or -for any other breach of this EULA or for any other liability relating to the Software shall be, at -Microsoft's option from time to time exercised subject to applicable law, (a) return of the -amount paid (if any) for the Software, or (b) repair or replacement of the Software, that does not -meet this Limited Warranty and that is returned to Microsoft with a copy of your receipt. You -will receive the remedy elected by Microsoft without charge, except that you are responsible for -any expenses you may incur (e.g. cost of shipping the Software to Microsoft). This Limited -Warranty is void if failure of the Software has resulted from accident, abuse, misapplication, -  -abnormal use or a virus. Any replacement Software will be warranted for the remainder of the -original warranty period or thirty (30) days, whichever is longer, and Microsoft will use -commercially reasonable efforts to provide your remedy within a commercially reasonable time -of your compliance with Microsoft's warranty remedy procedures. Outside the United States or -Canada, neither these remedies nor any product support services offered by Microsoft are -available without proof of purchase from an authorized international source. To exercise your -remedy, contact: Microsoft, Attn. Microsoft Sales Information Center/One Microsoft -Way/Redmond, WA 98052-6399, or the Microsoft subsidiary serving your country. -    - -18. DISCLAIMER OF WARRANTIES. The Limited Warranty that appears above is the -only express warranty made to you and is provided in lieu of any other express warranties or -similar obligations (if any) created by any advertising, documentation, packaging, or other -communications. EXCEPT FOR THE LIMITED WARRANTY AND TO THE MAXIMUM -Everett VSPro 6 -Final 11.04.02 -EXTENT PERMITTED BY APPLICABLE LAW, MICROSOFT AND ITS SUPPLIERS -PROVIDE THE SOFTWARE AND SUPPORT SERVICES (IF ANY) AS IS AND WITH ALL -FAULTS, AND HEREBY DISCLAIM ALL OTHER WARRANTIES AND CONDITIONS, -WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, -ANY (IF ANY) IMPLIED WARRANTIES, DUTIES OR CONDITIONS OF -MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF RELIABILITY -OR AVAILABILITY, OF ACCURACY OR COMPLETENESS OF RESPONSES, OF -RESULTS, OF WORKMANLIKE EFFORT, OF LACK OF VIRUSES, AND OF LACK OF -NEGLIGENCE, ALL WITH REGARD TO THE SOFTWARE, AND THE PROVISION OF OR -FAILURE TO PROVIDE SUPPORT OR OTHER SERVICES, INFORMATION, SOFTWARE, -AND RELATED CONTENT THROUGH THE SOFTWARE OR OTHERWISE ARISING -OUT OF THE USE OF THE SOFTWARE. ALSO, THERE IS NO WARRANTY OR -CONDITION OF TITLE, QUIET ENJOYMENT, QUIET POSSESSION, -CORRESPONDENCE TO DESCRIPTION OR NON-INFRINGEMENT WITH REGARD TO -THE SOFTWARE. - -19. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER -DAMAGES. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL MICROSOFT OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, -INCIDENTAL, PUNITIVE, INDIRECT, OR CONSEQUENTIAL DAMAGES -WHATSOEVER (INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF -PROFITS OR CONFIDENTIAL OR OTHER INFORMATION, FOR BUSINESS -INTERRUPTION, FOR PERSONAL INJURY, FOR LOSS OF PRIVACY, FOR FAILURE TO -MEET ANY DUTY INCLUDING OF GOOD FAITH OR OF REASONABLE CARE, FOR -NEGLIGENCE, AND FOR ANY OTHER PECUNIARY OR OTHER LOSS WHATSOEVER) -ARISING OUT OF OR IN ANY WAY RELATED TO THE USE OF OR INABILITY TO USE -THE SOFTWARE, THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT OR -OTHER SERVICES, INFORMATION, SOFTWARE, AND RELATED CONTENT -THROUGH THE SOFTWARE OR OTHERWISE ARISING OUT OF THE USE OF THE -SOFTWARE, OR OTHERWISE UNDER OR IN CONNECTION WITH ANY PROVISION -OF THIS EULA, EVEN IN THE EVENT OF THE FAULT, TORT (INCLUDING -NEGLIGENCE), MISREPRESENTATION, STRICT LIABILITY, BREACH OF CONTRACT -OR BREACH OF WARRANTY OF MICROSOFT OR ANY SUPPLIER, AND EVEN IF -MICROSOFT OR ANY SUPPLIER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. -20. LIMITATION OF LIABILITY AND REMEDIES. NOTWITHSTANDING ANY -DAMAGES THAT YOU MIGHT INCUR FOR ANY REASON WHATSOEVER -(INCLUDING, WITHOUT LIMITATION, ALL DAMAGES REFERENCED HEREIN AND -ALL DIRECT OR GENERAL DAMAGES IN CONTRACT OR ANYTHING ELSE), THE -ENTIRE LIABILITY OF MICROSOFT AND ANY OF ITS SUPPLIERS UNDER ANY -PROVISION OF THIS EULA AND YOUR EXCLUSIVE REMEDY HEREUNDER (EXCEPT -FOR ANY REMEDY OF REPAIR OR REPLACEMENT ELECTED BY MICROSOFT WITH -RESPECT TO ANY BREACH OF THE LIMITED WARRANTY) SHALL BE LIMITED TO -THE GREATER OF THE ACTUAL DAMAGES YOU INCUR IN REASONABLE RELIANCE -ON THE SOFTWARE UP TO THE AMOUNT ACTUALLY PAID BY YOU FOR THE -SOFTWARE OR US$5.00. THE FOREGOING LIMITATIONS, EXCLUSIONS AND -DISCLAIMERS (INCLUDING SECTIONS 17, 18, AND 19) SHALL APPLY TO THE -MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, EVEN IF ANY REMEDY FAILS -ITS ESSENTIAL PURPOSE. -Everett VSPro 7 -Final 11.04.02 -21. U.S. GOVERNMENT LICENSE RIGHTS. All Software provided to the U.S. -Government pursuant to solicitations issued on or after December 1, 1995 is provided with the -commercial license rights and restrictions described elsewhere herein. All Software provided to -the U.S. Government pursuant to solicitations issued prior to December 1, 1995 is provided with -"Restricted Rights" as provided for in FAR, 48 CFR 52.227-14 (JUNE 1987) or DFAR, 48 CFR -252.227-7013 (OCT 1988), as applicable. -22. APPLICABLE LAW. If you acquired this Software in the United States, this EULA is -governed by the laws of the State of Washington. If you acquired this Software in Canada, -unless expressly prohibited by local law, this EULA is governed by the laws in force in the -Province of Ontario, Canada; and, in respect of any dispute which may arise hereunder, you -consent to the jurisdiction of the federal and provincial courts sitting in Toronto, Ontario. If you -acquired this Software in the European Union, Iceland, Norway, or Switzerland, then local law -applies. If you acquired this Software in any other country, then local law may apply. -23. ENTIRE AGREEMENT; SEVERABILITY. This EULA (including any addendum or -amendment to this EULA which is included with the Software) are the entire agreement -between you and Microsoft relating to the Software and the support services (if any) and they -supersede all prior or contemporaneous oral or written communications, proposals and -representations with respect to the Software or any other subject matter covered by this EULA. -To the extent the terms of any Microsoft policies or programs for support services conflict with -the terms of this EULA, the terms of this EULA shall control. If any provision of this EULA is -held to be void, invalid, unenforceable or illegal, the other provisions shall continue in full force -and effect. -Si vous avez acquis votre produit Microsoft au CANADA, la garantie limitée suivante -s'applique : - -GARANTIE LIMITÉE - -Sauf pur celles du "Redistributables," qui sont fournies "comme telles," Microsoft garantit que -le Logiciel fonctionnera conformément aux documents inclus pendant une période de 90 jours -suivant la date de réception. - -Si une garantie ou condition implicite est créée par votre État ou votre territoire et qu'une loifédérale ou provinciale ou d'un État en interdit le déni, vous jouissez également d'une -garantie ou condition implicite, MAIS UNIQUEMENT POUR LES DÉFAUTS DÉCOUVERTS -DURANT LA PÉRIODE DE LA PRÉSENTE GARANTIE LIMITÉE (QUATRE-VINGT-DIX -JOURS). IL N'Y A AUCUNE GARANTIE OU CONDITION DE QUELQUE NATURE QUECE SOIT QUANT AUX DÉFAUTS DÉCOUVERTS APRÈS CETTE PÉRIODE DE QUATRE- -VINGT-DIX JOURS. Certains États ou territoires ne permettent pas de limiter la durée d'une -garantie ou condition implicite de sorte que la limitation ci-dessus peut ne pas s'appliquer à -vous. - -Tous les suppléments ou toutes les mises à jour relatifs au Logiciel, notamment, les ensembles -de services ou les réparations à chaud (le cas échéant) qui vous sont fournis après l'expiration -de la période de quatre-vingt-dix jours de la garantie limitée ne sont pas couverts par quelque -garantie ou condition que ce soit, expresse, implicite ou en vertu de la loi. - -LIMITATION DES RECOURS; ABSENCE DE DOMMAGES INDIRECTS OU AUTRES. - -Votre recours exclusif pour toute violation de la présente garantie limitée est décrit ci-après. - -Sauf pour tout remboursement au choix de Microsoft, si le Logiciel ne respecte pas la - -Everett VSPro 8 -Final 11.04.02 - -garantie limitée de Microsoft et, dans la mesure maximale permise par les lois applicables, -même si tout recours n'atteint pas son but essentiel, VOUS N'AVEZ DROIT À AUCUNS -DOMMAGES, NOTAMMENT DES DOMMAGES INDIRECTS. Les termes de la -clause «Exclusion des dommages accessoires, indirects et de certains autres dommages » sontégalement intégrées à la présente garantie limitée. Certains États ou territoires ne permettent -pas l'exclusion ou la limitation des dommages indirects ou accessoires de sorte que la limitation -ou l'exclusion ci-dessus peut ne pas s'appliquer à vous. La présente garantie limitée vous donne -des droits légaux spécifiques. Vous pouvez avoir d'autres droits qui peuvent varier d'unterritoire ou d'un État à un autre. VOTRE RECOURS EXCLUSIF. La seule responsabilité -obligation de Microsoft et de ses fournisseurs et votre recours exclusif pour toute violation de -la présente garantie limitée ou pour toute autre violation du présent contrat ou pour toute autre -responsabilité relative au Logiciel seront, selon le choix de Microsoft exercé de temps à autre -sous réserve de toute loi applicable, a) le remboursement du prix payé, le cas échéant, pour le -Logiciel ou b) la réparation ou le remplacement du Logiciel qui ne respecte pas la présente -garantie limitée et qui est retourné à Microsoft avec une copie de votre reçu. Vous recevrez la -compensation choisie par Microsoft, sans frais, sauf que vous êtes responsable des dépenses que -vous pourriez engager (p. ex., les frais d'envoi du Logiciel à Microsoft). La présente garantie -limitée est nulle si la défectuosité du Logiciel est causée par un accident, un usage abusif, une -mauvaise application, un usage anormal ou un virus. Tout Logiciel de remplacement sera -garanti pour le reste de la période initiale de la garantie ou pendant trente (30) jours, selon la -plus longue entre ces deux périodes. À l'extérieur des États-Unis ou du Canada, ces recours ou -l'un quelconque des services de soutien technique offerts par Microsoft ne sont pas disponibles -sans preuve d'achat d'une source internationale autorisée. Pour exercer votre recours, vous -devez communiquer avec Microsoft et vous adresser au Microsoft Sales Information -Center/One Microsoft Way/Redmond, WA 98052-6399, ou à la filiale de Microsoft de votre -pays. - -DÉNI DE GARANTIES. La garantie limitée qui apparaît ci-dessus constitue la seule garantie -expresse qui vous est donnée et remplace toutes autres garanties expresses (s'il en est) crées par -une publicité, un document, un emballage ou une autre communication. SAUF EN CE QUI A -TRAIT À LA GARANTIE LIMITÉE ET DANS LA MESURE MAXIMALE PERMISE PAR -LES LOIS APPLICABLES, LE LOGICIEL ET LES SERVICES DE SOUTIEN TECHNIQUE -(LE CAS ÉCHÉANT) SONT FOURNIS TELS QUELS ET AVEC TOUS LES DÉFAUTS PAR -MICROSOFT ET SES FOURNISSEURS, LESQUELS PAR LES PRÉSENTES DÉNIENT -TOUTES AUTRES GARANTIES ET CONDITIONS EXPRESSES, IMPLICITES OU EN -VERTU DE LA LOI, NOTAMMENT, MAIS SANS LIMITATION, (LE CAS ÉCHÉANT) LESGARANTIES, DEVOIRS OU CONDITIONS IMPLICITES DE QUALITÉ MARCHANDE, -D'ADAPTATION À UNE FIN PARTICULIÈRE, DE FIABILITÉ OU DE DISPONIBILITÉ, -D'EXACTITUDE OU D'EXHAUSTIVITÉ DES RÉPONSES, DES RÉSULTATS, DES -EFFORTS DÉPLOYÉS SELON LES RÈGLES DE L'ART, D'ABSENCE DE VIRUS ET -D'ABSENCE DE NÉGLIGENCE, LE TOUT À L'ÉGARD DU LOGICIEL ET DE LA -PRESTATION OU DE L'OMISSION DE LA PRESTATION DES SERVICES DE SOUTIEN -TECHNIQUE OU À L'ÉGARD DE LA FOURNITURE OU DE L'OMISSION DE LA -FOURNITURE DE TOUS AUTRES SERVICES, RENSEIGNEMENTS, LOGICIELS, ET -CONTENU QUI S'Y RAPPORTE GRÂCE AU LOGICIEL OU PROVENANT AUTREMENT -DE L'UTILISATION DU LOGICIEL . PAR AILLEURS, IL N'Y A AUCUNE GARANTIE OU -CONDITION QUANT AU TITRE DE PROPRIÉTÉ, À LA JOUISSANCE OU LA -POSSESSION PAISIBLE, À LA CONCORDANCE À UNE DESCRIPTION NI QUANT À -UNE ABSENCE DE CONTREFAÇON CONCERNANT LE LOGICIEL. - -EXCLUSION DES DOMMAGES ACCESSOIRES, INDIRECTS ET DE CERTAINS AUTRES -DOMMAGES. DANS LA MESURE MAXIMALE PERMISE PAR LES LOIS APPLICABLES, -EN AUCUN CAS MICROSOFT OU SES FOURNISSEURS NE SERONT RESPONSABLES -DES DOMMAGES SPÉCIAUX, CONSÉCUTIFS, ACCESSOIRES OU INDIRECTS DE - -Everett VSPro 9 -Final 11.04.02 - -QUELQUE NATURE QUE CE SOIT (NOTAMMENT, LES DOMMAGES À L'ÉGARD DUMANQUE À GAGNER OU DE LA DIVULGATION DE RENSEIGNEMENTS -CONFIDENTIELS OU AUTRES, DE LA PERTE D'EXPLOITATION, DE BLESSURES -CORPORELLES, DE LA VIOLATION DE LA VIE PRIVÉE, DE L'OMISSION DE REMPLIR -TOUT DEVOIR, Y COMPRIS D'AGIR DE BONNE FOI OU D'EXERCER UN SOIN -RAISONNABLE, DE LA NÉGLIGENCE ET DE TOUTE AUTRE PERTE PÉCUNIAIRE OU -AUTRE PERTE DE QUELQUE NATURE QUE CE SOIT) SE RAPPORTANT DE QUELQUEMANIÈRE QUE CE SOIT À L'UTILISATION DU LOGICIEL OU À L'INCAPACITÉ DE -S'EN SERVIR, À LA PRESTATION OU À L'OMISSION DE LA PRESTATION DE -SERVICES DE SOUTIEN TECHNIQUE OU À LA FOURNITURE OU À L'OMISSION DE -LA FOURNITURE DE TOUS AUTRES SERVICES, RENSEIGNEMENTS, LOGICIELS, ET -CONTENU QUI S'Y RAPPORTE GRÂCE AU LOGICIEL OU PROVENANT AUTREMENT -DE L'UTILISATION DU LOGICIEL OU AUTREMENT AUX TERMES DE TOUTE -DISPOSITION DE LA PRÉSENTE CONVENTION OU RELATIVEMENT À UNE TELLE -DISPOSITION, MÊME EN CAS DE FAUTE, DE DÉLIT CIVIL (Y COMPRIS LANÉGLIGENCE), DE RESPONSABILITÉ STRICTE, DE VIOLATION DE CONTRAT OU DEVIOLATION DE GARANTIE DE MICROSOFT OU DE TOUT FOURNISSEUR ET MÊME -SI MICROSOFT OU TOUT FOURNISSEUR A ÉTÉ AVISÉ DE LA POSSIBILITÉ DE TELS -DOMMAGES. - -LIMITATION DE RESPONSABILITÉ ET RECOURS. MALGRÉ LES DOMMAGES QUE -VOUS PUISSIEZ SUBIR POUR QUELQUE MOTIF QUE CE SOIT (NOTAMMENT, MAISSANS LIMITATION, TOUS LES DOMMAGES SUSMENTIONNÉS ET TOUS LES -DOMMAGES DIRECTS OU GÉNÉRAUX OU AUTRES), LA SEULE RESPONSABILITÉ DE -MICROSOFT ET DE L'UN OU L'AUTRE DE SES FOURNISSEURS AUX TERMES DE -TOUTE DISPOSITION DE LA PRÉSENTE CONVENTION ET VOTRE RECOURS -EXCLUSIF À L'ÉGARD DE TOUT CE QUI PRÉCÈDE (SAUF EN CE QUI CONCERNETOUT RECOURS DE RÉPARATION OU DE REMPLACEMENT CHOISI PAR -MICROSOFT À L'ÉGARD DE TOUT MANQUEMENT À LA GARANTIE LIMITÉE) SELIMITE AU PLUS ÉLEVÉ ENTRE LES MONTANTS SUIVANTS : LE MONTANT QUE -VOUS AVEZ RÉELLEMENT PAYÉ POUR LE LOGICIEL OU 5,00 $US. LES LIMITES, -EXCLUSIONS ET DÉNIS QUI PRÉCÈDENT (Y COMPRIS LES CLAUSES CI-DESSUS), -S'APPLIQUENT DANS LA MESURE MAXIMALE PERMISE PAR LES LOIS -APPLICABLES, MÊME SI TOUT RECOURS N'ATTEINT PAS SON BUT ESSENTIEL. - -À moins que cela ne soit prohibé par le droit local applicable, la présente Convention est régie -par les lois de la province d'Ontario, Canada. Vous consentez à la compétence des tribunaux -fédéraux et provinciaux siégeant à Toronto, dans la province d'Ontario. - -Au cas où vous auriez des questions concernant cette licence ou que vous désiriez vous mettre -en rapport avec Microsoft pour quelque raison que ce soit, veuillez utiliser l'information -contenue dans le Logiciel pour contacter la filiale de Microsoft desservant votre pays, ou visitez -Microsoft sur le World Wide Web à http://www.microsoft.com. - -The following MICROSOFT GUARANTEE applies to you if you acquired this Software in -any other country: - -Statutory rights not affected -The following guarantee is not restricted to any territory and does -not affect any statutory rights that you may have from your reseller or from Microsoft if you -acquired the Software directly from Microsoft. If you acquired the Software or any support -services in Australia, New Zealand or Malaysia, please see the "Consumer rights" section -below. - -Everett VSPro 10 -Final 11.04.02 - -The guarantee -The Software is designed and offered as a general-purpose software, not for any -user's particular purpose. You accept that no Software is error free and you are strongly -advised to back-up your files regularly. Provided that you have a valid license, Microsoft -guarantees that a) for a period of 90 days from the date of receipt of your license to use the -Software or the shortest period permitted by applicable law it will perform substantially in -accordance with the written materials that accompany the Software; and b) any support services -provided by Microsoft shall be substantially as described in applicable written materials -provided to you by Microsoft and Microsoft support engineers will use reasonable efforts, care -and skill to solve any problem issues. In the event that the Software fails to comply with this -guarantee, Microsoft will either (a) repair or replace the Software or (b) return the price you -paid. This guarantee is void if failure of the Software results from accident, abuse or -misapplication. Any replacement Software will be guaranteed for the remainder of the original -guarantee period or 30 days, whichever period is longer. You agree that the above guarantee is -your sole guarantee in relation to the Software and any support services. - -Exclusion of All Other Terms -To the maximum extent permitted by applicable law and subject to -the guarantee above, Microsoft disclaims all warranties, conditions and other terms, either -express or implied (whether by statute, common law, collaterally or otherwise) including but -not limited to implied warranties of satisfactory quality and fitness for particular purpose with -respect to the Software and the written materials that accompany the Software. Any implied -warranties that cannot be excluded are limited to 90 days or to the shortest period permitted by -applicable law, whichever is greater. - -Limitation of Liability -To the maximum extent permitted by applicable law and except as -provided in the Microsoft Guarantee, Microsoft and its suppliers shall not be liable for any -damages whatsoever (including without limitation, damages for loss of business profits, -business interruption, loss of business information or other pecuniary loss) arising out of the -use or inability to use the Software, even if Microsoft has been advised of the possibility of such -damages. In any case Microsoft's entire liability under any provision of this Agreement shall be -limited to the amount actually paid by you for the Software. These limitations do not apply to -any liabilities that cannot be excluded or limited by applicable laws. - -Consumer rights -Consumers in Australia, New Zealand or Malaysia may have the benefit of -certain rights and remedies by reason of the Trade Practices Act and similar state and territory -laws in Australia, the Consumer Guarantees Act in New Zealand and the Consumer Protection -Act in Malaysia in respect of which liability cannot lawfully be modified or excluded. If you -acquired the Software in New Zealand for the purposes of a business, you confirm that the -Consumer Guarantees Act does not apply. If you acquired the Software in Australia and if -Microsoft breaches a condition or warranty implied under any law which cannot lawfully be -modified or excluded by this agreement then, to the extent permitted by law, Microsoft's -liability is limited, at Microsoft's option, to: (i) in the case of the Software: a) repairing or -replacing the Software; or b) the cost of such repair or replacement; and (ii) in the case of -support services: a) re-supply of the services; or b) the cost of having the services supplied -again. - -Everett VSPro 11 -Final 11.04.02 - -Should you have any questions concerning this EULA, or if you desire to contact Microsoft for -any reason, please use the address information enclosed in this Software to contact the -Microsoft subsidiary serving your country or visit Microsoft on the World Wide Web at -http://www.microsoft.com. - -Everett VSPro 12 -Final 11.04.02 - -%% The following software may be included in this product: zlib; Use of any of this software is governed by the terms of the license below: - -zlib.h -- interface of the 'zlib' general purpose compression library - version 1.1.3, July 9th, 1998 - - Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format - - -%% The following software may be included in this product: Mozilla Rhino. Use of any of this software is governed by the terms of the license below: - - * The contents of this file are subject to the Netscape Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is Rhino code, released - * May 6, 1999. - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1997-2000 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - * - * Kemal Bayram - * Patrick Beard - * Norris Boyd - * Igor Bukanov, igor@mir2.org - * Brendan Eich - * Ethan Hugg - * Roger Lawrence - * Terry Lucas - * Mike McCabe - * Milen Nankov - * Attila Szegedi, szegedia@freemail.hu - * Ian D. Stewart - * Andi Vajda - * Andrew Wason - */ - -%% The following software may be included in this product: Apache Derby. Use of any of this software is governed by the terms of the license below: - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -%% The following software may be included in this product: 7-Zip. Use of any of this software is governed by the terms of the license below: - - ~~~~~ - License for use and distribution - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - 7-Zip Copyright (C) 1999-2007 Igor Pavlov. - - Licenses for files are: - - 1) 7z.dll: GNU LGPL + AES code license + unRAR restriction - 2) 7za.exe, 7z.sfx and 7zCon.sfx: GNU LGPL + AES code license - 3) All other files: GNU LGPL - - The GNU LGPL + AES code license + unRAR restriction means that you must follow - GNU LGPL rules, AES code license rules and unRAR restriction rules. - - The GNU LGPL + AES code license means that you must follow both GNU LGPL rules - and AES code license rules. - - - Note: - You can use 7-Zip on any computer, including a computer in a commercial - organization. You don't need to register or pay for 7-Zip. - - - GNU LGPL information - -------------------- - -GNU Lesser General Public License - -Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - [This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - -Preamble - -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - -This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - -When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - -To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - -For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - -We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - -To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - -Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - -Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - -When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - -We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - -For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - -In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - -Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - -The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - -A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - -The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - -"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - -1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - - (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) - - These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - - Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. - - In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - -Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - -This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - -4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - -If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - -5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - -However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - -When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - -If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - -Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - -6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - -You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - - a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - - e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - -For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - -7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - - b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - -8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - -10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - -11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - -14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -END OF TERMS AND CONDITIONS -How to Apply These Terms to Your New Libraries - -If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). - -To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in - the library `Frob' (a library for tweaking knobs) written - by James Random Hacker. - - signature of Ty Coon, 1 April 1990 - - Ty Coon, President of Vice - -That's all there is to it! - - - unRAR restriction - ----------------- - - The unRAR sources cannot be used to re-create the RAR compression -algorithm, - which is proprietary. Distribution of modified unRAR sources in separate -form - or as a part of other software is permitted, provided that it is clearly - stated in the documentation and source comments that the code may - not be used to develop a RAR (WinRAR) compatible archiver. - - - AES code license - ---------------- - - Copyright (c) 2001, Dr Brian Gladman - - LICENSE TERMS - - The free distribution and use of this software in both source and binary - form is allowed (with or without changes) provided that: - - 1. distributions of this source code include the above copyright - notice, this list of conditions and the following disclaimer; - - 2. distributions in binary form include the above copyright - notice, this list of conditions and the following disclaimer - in the documentation and/or other associated materials; - - 3. the copyright holder's name is not used to endorse products - built using this software without specific written permission. - - DISCLAIMER - - This software is provided 'as is' with no explicit or implied warranties - in respect of its properties, including, but not limited to, correctness - and fitness for purpose. - - -*************************************************************************** - -%%The following software may be included in this product: -UPX - -Use of any of this software is governed by the terms of the license below: - ------BEGIN PGP SIGNED MESSAGE----- - - - ooooo ooo ooooooooo. ooooooo ooooo - `888' `8' `888 `Y88. `8888 d8' - 888 8 888 .d88' Y888..8P - 888 8 888ooo88P' `8888' - 888 8 888 .8PY888. - `88. .8' 888 d8' `888b - `YbodP' o888o o888o o88888o - - - The Ultimate Packer for eXecutables - Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar - http://wildsau.idv.uni-linz.ac.at/mfx/upx.html - http://www.nexus.hu/upx - http://upx.tsx.org - - -PLEASE CAREFULLY READ THIS LICENSE AGREEMENT, ESPECIALLY IF YOU PLAN -TO MODIFY THE UPX SOURCE CODE OR USE A MODIFIED UPX VERSION. - - -ABSTRACT -======== - - UPX and UCL are copyrighted software distributed under the terms - of the GNU General Public License (hereinafter the "GPL"). - - The stub which is imbedded in each UPX compressed program is part - of UPX and UCL, and contains code that is under our copyright. The - terms of the GNU General Public License still apply as compressing - a program is a special form of linking with our stub. - - As a special exception we grant the free usage of UPX for all - executables, including commercial programs. - See below for details and restrictions. - - -COPYRIGHT -========= - - UPX and UCL are copyrighted software. All rights remain with the authors. - - UPX is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer - UPX is Copyright (C) 1996-2000 Laszlo Molnar - - UCL is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer - - -GNU GENERAL PUBLIC LICENSE -========================== - - UPX and the UCL library are free software; you can redistribute them - and/or modify them under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - UPX and UCL are distributed in the hope that they will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. - - -SPECIAL EXCEPTION FOR COMPRESSED EXECUTABLES -============================================ - - The stub which is imbedded in each UPX compressed program is part - of UPX and UCL, and contains code that is under our copyright. The - terms of the GNU General Public License still apply as compressing - a program is a special form of linking with our stub. - - Hereby Markus F.X.J. Oberhumer and Laszlo Molnar grant you special - permission to freely use and distribute all UPX compressed programs - (including commercial ones), subject to the following restrictions: - - 1. You must compress your program with a completely unmodified UPX - version; either with our precompiled version, or (at your option) - with a self compiled version of the unmodified UPX sources as - distributed by us. - 2. This also implies that the UPX stub must be completely unmodfied, i.e. - the stub imbedded in your compressed program must be byte-identical - to the stub that is produced by the official unmodified UPX version. - 3. The decompressor and any other code from the stub must exclusively get - used by the unmodified UPX stub for decompressing your program at - program startup. No portion of the stub may get read, copied, - called or otherwise get used or accessed by your program. - - -ANNOTATIONS -=========== - - - You can use a modified UPX version or modified UPX stub only for - programs that are compatible with the GNU General Public License. - - - We grant you special permission to freely use and distribute all UPX - compressed programs. But any modification of the UPX stub (such as, - but not limited to, removing our copyright string or making your - program non-decompressible) will immediately revoke your right to - use and distribute a UPX compressed program. - - - UPX is not a software protection tool; by requiring that you use - the unmodified UPX version for your proprietary programs we - make sure that any user can decompress your program. This protects - both you and your users as nobody can hide malicious code - - any program that cannot be decompressed is highly suspicious - by definition. - - - You can integrate all or part of UPX and UCL into projects that - are compatible with the GNU GPL, but obviously you cannot grant - any special exceptions beyond the GPL for our code in your project. - - - We want to actively support manufacturers of virus scanners and - similar security software. Please contact us if you would like to - incorporate parts of UPX or UCL into such a product. - - - -Markus F.X.J. Oberhumer Laszlo Molnar -markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu - -Linz, Austria, 25 Feb 2000 - -Additional License(s) - -The UPX license file is at http://upx.sourceforge.net/upx-license.html. - -*************************************************************************** - -%%The following software may be included in this product: -LZMA Software Development Kit - -Use of any of this software is governed by the terms of the license below: - -License - -LZMA SDK is available under any of the following licenses: - - 1. GNU Lesser General Public License (GNU LGPL) - 2. Common Public License (CPL) - 3. Simplified license for unmodified code (read SPECIAL EXCEPTION) - 4. Proprietary license - -This means that you can select one of these four options and follow rules of that license. - -SPECIAL EXCEPTION: Igor Pavlov, as the author of this code, expressly permit you statically or dynamically to link your code (or bind by name) to the files from LZMA SDK without subjecting your linked code to the terms of the CPL or GNU LGPL. Any modification or addition to any file in the LZMA SDK, however, is subject to the GNU LGPL or CPL terms. - -This SPECIAL EXCEPTION allows you to use LZMA SDK in applications with proprietary code, provided you keep the LZMA SDK code unmodified. - -SPECIAL EXCEPTION #2: Igor Pavlov, as the author of this code, expressly permits you to use LZMA SDK 4.43 under the same terms and conditions contained in the License Agreement you have for any previous version of LZMA SDK developed by Igor Pavlov. - -SPECIAL EXCEPTION #2 allows holders of proprietary licenses to use latest version of LZMA SDK as update for previous versions. - -GNU LGPL and CPL are pretty similar and both these licenses are classified as free software licenses at http://www.gnu.org/ and OSI-approved at http://www.opensource.org/. - -LZMA SDK also is available under a proprietary license which can include: - - 1. The right to modify code from the LZMA SDK without subjecting the modified code to the terms of the CPL or GNU LGPL - 2. Technical support for LZMA SDK via email - -To request such a proprietary license, or for any additional consultations, send an email message, using the 7-Zip support page: Send message to LZMA developer - -The source code of 7-Zip is released under the terms of the GNU LGPL. You can download the source code of 7-Zip at 7-Zip's Source Forge Page - -Additional License(s) - -The license included with the software differs slightly from the version posted on the website. Specifically it includes SPECIAL EXCEPTION #3, which is not present in the license on the website. The license from the software archive follows: - -LICENSE -------- - -LZMA SDK is available under any of the following licenses: - -1) GNU Lesser General Public License (GNU LGPL) -2) Common Public License (CPL) -3) Simplified license for unmodified code (read SPECIAL EXCEPTION) -4) Proprietary license - -It means that you can select one of these four options and follow rules of that license. - - -1,2) GNU LGPL and CPL licenses are pretty similar and both these licenses are classified as - - "Free software licenses" at http://www.gnu.org/ - - "OSI-approved" at http://www.opensource.org/ - - -3) SPECIAL EXCEPTION - -Igor Pavlov, as the author of this code, expressly permits you to statically or dynamically link your code (or bind by name) to the files from LZMA SDK without subjecting your linked code to the terms of the CPL or GNU LGPL. Any modifications or additions to files from LZMA SDK, however, -are subject to the GNU LGPL or CPL terms. - -SPECIAL EXCEPTION allows you to use LZMA SDK in applications with -closed code, -while you keep LZMA SDK code unmodified. - - -SPECIAL EXCEPTION #2: Igor Pavlov, as the author of this code, expressly permits you to use this code under the same terms and conditions contained in the License Agreement you have for any previous version of LZMA SDK developed by Igor Pavlov. - -SPECIAL EXCEPTION #2 allows owners of proprietary licenses to use latest version of LZMA SDK as update for previous versions. - - -SPECIAL EXCEPTION #3: Igor Pavlov, as the author of this code, expressly permits you to use code of the following files: BranchTypes.h, LzmaTypes.h, LzmaTest.c, LzmaStateTest.c, LzmaAlone.cpp, LzmaAlone.cs, LzmaAlone.java as public domain code. - - -4) Proprietary license - -LZMA SDK also can be available under a proprietary license which -can include: - -1) Right to modify code without subjecting modified code to the terms of the CPL or GNU LGPL -2) Technical support for code - -To request such proprietary license or any additional consultations, send email message from that page:http://www.7-zip.org/support.html - - -You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -You should have received a copy of the Common Public License along with this library. - -*************************************************************************** - -%%The following software may be included in this product: -Active Template Library (ATL) - -Use of any of this software is governed by the terms of the license below: - -(note: search for "ATL") - -Visual Studio 2005 EULA - MICROSOFT SOFTWARE LICENSE TERMS -MICROSOFT VISUAL STUDIO 2005 PROFESSIONAL EDITION - -These license terms are an agreement between Microsoft Corporation (or based on -where you live, one of its affiliates) and you. Please read them. They apply -to the software named above, which includes the media on which you received it, -if any. The terms also apply to any Microsoft - • updates, - • supplements, - • Internet-based services, and - • support services -for this software, unless other terms accompany those items. If so, those terms -apply. - -BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO -NOT USE THE SOFTWARE. INSTEAD, RETURN IT TO THE RETAILER FOR A REFUND OR -CREDIT. If you cannot obtain a refund there, contact Microsoft or the Microsoft -affiliate serving your country for information about Microsoft’s refund -policies. See www.microsoft.com/worldwide. In the United States and Canada, -call (800) MICROSOFT or see www.microsoft.com/info/nareturns.htm. -AS DESCRIBED BELOW, USING SOME FEATURES ALSO OPERATES AS YOUR CONSENT TO THE -TRANSMISSION OF CERTAIN STANDARD COMPUTER INFORMATION FOR INTERNET-BASED SERVICES. - -NOTICE: APPLICATIONS AND SERVICES BUILT WITH MICROSOFT VISUAL J# 2005 WILL RUN -ONLY IN THE MICROSOFT .NET FRAMEWORK. VISUAL J# 2005 HAS BEEN INDEPENDENTLY -DEVELOPED BY MICROSOFT. IT IS NOT ENDORSED OR APPROVED BY SUN MICROSYSTEMS, INC. ------------------------------- -IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW FOR EACH -LICENSE YOU ACQUIRE. - -1. OVERVIEW. - -a. Software. The software includes development tools, software programs and -documentation. - -b. License Model. The software is licensed on a per user basis. - -2. INSTALLATION AND USE RIGHTS. - -a. General. One user may install and use copies of the software to design, -develop, test and demonstrate your programs. Testing does not include staging -on a server in a production environment, such as loading content prior to -production use. - -b. Included Microsoft Programs. These license terms apply to all Microsoft -programs included with the software. If the license terms with any of those -programs give you other rights that do not expressly conflict with these license -terms, you also have those rights. - -c. Third Party Programs. The software contains third party programs. The -license terms with those programs apply to your use of them. - -3. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. - -a. User Testing. Your end users may access the software to perform acceptance -tests on your programs. - -b. Distributable Code. The software contains code that you are permitted to -distribute in programs you develop if you comply with the terms below. - -i. Right to Use and Distribute. The code and text files listed below are -“Distributable Code.” - • REDIST.TXT Files. You may copy and distribute the object code form of code -listed in REDIST.TXT files. - • Sample Code. You may modify, copy, and distribute the source and object -code form of code marked as “sample.” - • Microsoft Merge Modules. You may copy and distribute the unmodified output -of Microsoft Merge Modules. - • MFCs, ATLs and CRTs. You may modify the source code form of Microsoft -Foundation Classes (MFCs), Active Template Libraries (ATLs), and C runtimes -(CRTs) to design, develop and test your programs, and copy and distribute the -object code form of your modified files under a new name. - • MDAC. You may copy and distribute the object code form of the MDAC_TYP.EXE -file. - • Image Library. You may copy and distribute images and animations in the -Image Library as described in the software documentation. You may also modify -that content. If you modify the content, it must be for use that is consistent -with the permitted use of the unmodified content. - • Third Party Distribution. You may permit distributors of your programs to -copy and distribute the Distributable Code as part of those programs. - -ii. Distribution Requirements. For any Distributable Code you distribute, you must - • add significant primary functionality to it in your programs; - • require distributors and external end users to agree to terms that protect -it at least as much as this agreement; - • display your valid copyright notice on your programs; and - • indemnify, defend, and hold harmless Microsoft from any claims, including -attorneys’ fees, related to the distribution or use of your programs. - -iii. Distribution Restrictions. You may not - • alter any copyright, trademark or patent notice in the Distributable Code; - • use Microsoft’s trademarks in your programs’ names or in a way that suggests -your programs come from or are endorsed by Microsoft; - • distribute Distributable Code, other than code listed in OTHER-DIST.TXT -files, to run on a platform other than the Windows platform; - • include Distributable Code in malicious, deceptive or unlawful programs; or - • modify or distribute the source code of any Distributable Code so that any -part of it becomes subject to an Excluded License. An Excluded License is one -that requires, as a condition of use, modification or distribution, that - • the code be disclosed or distributed in source code form; or - • others have the right to modify it. - -c. Additional Functionality. Microsoft may provide additional functionality for -the software. Other license terms and fees may apply. - -4. INTERNET-BASED SERVICES. Microsoft provides Internet-based services with the -software. It may change or cancel them at any time. - -a. Consent for Internet-Based Services. The software feature described below -connects to Microsoft or service provider computer systems over the Internet. -In some cases, you will not receive a separate notice when they connect. You -may switch off this feature or not use it. For more information about this -feature, see the software documentation. BY USING THIS FEATURE, YOU CONSENT TO -THE TRANSMISSION OF THIS INFORMATION. Microsoft does not use the information to -identify or contact you. - -Computer Information. The following feature uses Internet protocols, which send -to the appropriate systems computer information, such as your Internet protocol -address, the type of operating system, browser and name and version of the -software you are using, and the language code of the device where you installed -the software. Microsoft uses this information to make the Internet-based -service available to you. - • Digital Certificates. The software uses digital certificates. These -digital certificates confirm the identity of Internet users sending X.509 -standard encrypted information. The software retrieves certificates and updates -certificate revocation lists. These security features operate only when you use -the Internet. - -b. Misuse of Internet-based Services. You may not use this service in any way -that could harm it or impair anyone else’s use of it. You may not use the -service to try to gain unauthorized access to any service, data, account or -network by any means. - -5. TIME-SENSITIVE SOFTWARE. If the version of the software is a trial version, -the software will stop running either ninety days or one hundred eighty days -after you install it, depending on the trial version you have. You will receive -notice before it stops running. You may not be able to access data used with -the software when it stops running. - -6. PRODUCT KEYS. The software requires a key to install or access it. You are -responsible for the use of keys assigned to you. You should not share the keys -with third parties. - -7. MICROSOFT WINDOWS SOFTWARE. The software contains the Microsoft .NET -Framework 2.0 and Microsoft Data Access Component 2.8 SP1 software. These -software are part of Windows. The license terms for Windows apply to your use -of the .NET Framework 2.0 and Microsoft Data Access Component software. - -8. SQL SERVER BENCHMARK TESTING. You must obtain Microsoft’s prior written -approval to disclose to a third party the results of any benchmark test of the -SQL Server software that accompanies this software. - -9. MICROSOFT .NET FRAMEWORK BENCHMARK TESTING. The software includes the .NET -Framework component of the Windows operating systems (“.NET Component”). You -may conduct internal benchmark testing of the .NET Component. You may disclose -the results of any benchmark test of the .NET Component, provided that you -comply with the following terms: (1) you must disclose all the information -necessary for replication of the tests, including complete and accurate details -of your benchmark testing methodology, the test scripts/cases, tuning -parameters applied, hardware and software platforms tested, the name and version -number of any third party testing tool used to conduct the testing, and complete -source code for the benchmark suite/harness that is developed by or for you and -used to test both the .NET Component and the competing implementation(s); (2) -you must disclose the date (s) that you conducted the benchmark tests, along -with specific version information for all Microsoft software products tested, -including the .NET Component; (3) your benchmark testing was performed using all -performance tuning and best practice guidance set forth in the product -documentation and/or on Microsoft’s support web sites, and uses the latest -updates, patches and fixes available for the .NET Component and the relevant -Microsoft operating system; (4) it shall be sufficient if you make the -disclosures provided for above at a publicly available location such as a -website, so long as every public disclosure of the results of your benchmark -test expressly identifies the public site containing all required disclosures; -and (5) nothing in this provision shall be deemed to waive any other right that -you may have to conduct benchmark testing. The foregoing obligations shall not -apply to your disclosure of the results of any customized benchmark test of the -.NET Component, whereby such disclosure is made under confidentiality in -conjunction with a bid request by a prospective customer, such customer’s -application(s) are specifically tested and the results are only disclosed to -such specific customer. Notwithstanding any other agreement you may have with -Microsoft, if you disclose such benchmark test results, Microsoft shall have the -right to disclose the results of benchmark tests it conducts of your products -that compete with the .NET Component, provided it complies with the same -conditions above. - -10. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only -gives you some rights to use the software. Microsoft reserves all other rights. - Unless applicable law gives you more rights despite this limitation, you may -use the software only as expressly permitted in this agreement. In doing so, -you must comply with any technical limitations in the software that only allow -you to use it in certain ways. For more information, see -www.microsoft.com/licensing/userights. You may not - • work around any technical limitations in the software; - • reverse engineer, decompile or disassemble the software, except and only to -the extent that applicable law expressly permits, despite this limitation; - • make more copies of the software than specified in this agreement or allowed -by applicable law, despite this limitation; - • publish the software for others to copy; - • rent, lease or lend the software; or - • use the software for commercial software hosting services. - -11. BACKUP COPY. You may make one backup copy of the software. You may use it -only to reinstall the software. - -12. DOCUMENTATION. Any person that has valid access to your computer or -internal network may copy and use the documentation for your internal, reference -purposes. - -13. NOT FOR RESALE SOFTWARE. You may not sell software marked as “NFR” or “Not -for Resale.” - -14. ACADEMIC EDITION SOFTWARE. You must be a “Qualified Educational User” to -use software marked as “Academic Edition” or “AE.” If you do not know whether -you are a Qualified Educational User, visit www.microsoft.com/education or -contact the Microsoft affiliate serving your country. - -15. UPGRADE. If this software is marked as an upgrade version, you may use it -only if you have a license to use the software eligible for upgrade. If you -upgrade, this software takes the place of the earlier version, and this -agreement takes the place of the agreement for that earlier version. You may -use the earlier version only as permitted in the Downgrade clause below. - -16. DOWNGRADE. You may install and use this version and an earlier version of -the software at the same time. This agreement applies to your use of the -earlier version. If the earlier version includes different components, any - -terms for those components in the agreement that comes with the earlier version -apply to your use of them. Microsoft is not obligated to supply earlier -versions to you. - -17. TRANSFER TO A THIRD PARTY. The first user of the software may transfer it, -and this agreement, directly to a third party. Before the transfer, that party -must agree that this agreement applies to the transfer and use of the software. - The first user must uninstall the software before transferring it separately -from the device. The first user may not retain any copies. - -18. EXPORT RESTRICTIONS. The software is subject to United States export laws -and regulations. You must comply with all domestic and international export -laws and regulations that apply to the software. These laws include -restrictions on destinations, end users and end use. For additional -information, see www.microsoft.com/exporting. - -19. SUPPORT SERVICES. Microsoft provides support services for the software as -described at www.support.microsoft.com/common/international.aspx. - -20. ENTIRE AGREEMENT. This agreement (including the warranty below), and the -terms for supplements, updates, Internet-based services and support services -that you use, are the entire agreement for the software and support services. - -21. APPLICABLE LAW. - -a. United States. If you acquired the software in the United States, Washington -state law governs the interpretation of this agreement and applies to claims for -breach of it, regardless of conflict of laws principles. The laws of the state -where you live govern all other claims, including claims under state consumer -protection laws, unfair competition laws, and in tort. - -b. Outside the United States. If you acquired the software in any other -country, the laws of that country apply. - -22. LEGAL EFFECT. This agreement describes certain legal rights. You may have -other rights under the laws of your state or country. You may also have rights -with respect to the party from whom you acquired the software. This agreement -does not change your rights under the laws of your state or country if the laws -of your state or country do not permit it to do so. - -23. LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND -ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO THE AMOUNT YOU PAID FOR THE SOFTWARE. -YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, -SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to - • anything related to the software, services, content (including code) on -third party Internet sites, or third party programs; and - • claims for breach of contract, breach of warranty, guarantee or condition, -strict liability, negligence, or other tort to the extent permitted by -applicable law. - -It also applies even if - • repair, replacement or a refund for the software does not fully compensate -you for any losses; or - • Microsoft knew or should have known about the possibility of the damages. - -Some states do not allow the exclusion or limitation of incidental or -consequential damages, so the above limitation or exclusion may not apply to -you. They also may not apply to you because your country may not allow the -exclusion or limitation of incidental, consequential or other damages. - -************************************************************************************** -LIMITED WARRANTY -A. LIMITED WARRANTY. If you follow the instructions, the software will perform -substantially as described in the Microsoft materials that you receive in or -with the software. - -B. TERM OF WARRANTY; WARRANTY RECIPIENT; LENGTH OF ANY IMPLIED WARRANTIES. THE -LIMITED WARRANTY COVERS THE SOFTWARE FOR ONE YEAR AFTER ACQUIRED BY THE FIRST -USER. IF YOU RECEIVE SUPPLEMENTS, UPDATES, OR REPLACEMENT SOFTWARE DURING THAT -YEAR, THEY WILL BE COVERED FOR THE REMAINDER OF THE WARRANTY OR 30 DAYS, -WHICHEVER IS LONGER. If the first user transfers the software, the remainder of -the warranty will apply to the recipient. -TO THE EXTENT PERMITTED BY LAW, ANY IMPLIED WARRANTIES, GUARANTEES OR CONDITIONS -LAST ONLY DURING THE TERM OF THE LIMITED WARRANTY. Some states do not allow -limitations on how long an implied warranty lasts, so these limitations may not -apply to you. They also might not apply to you because some countries may not -allow limitations on how long an implied warranty, guarantee or condition lasts. - -C. EXCLUSIONS FROM WARRANTY. This warranty does not cover problems caused by -your acts (or failures to act), the acts of others, or events beyond Microsoft’s -reasonable control. - -D. REMEDY FOR BREACH OF WARRANTY. MICROSOFT WILL REPAIR OR REPLACE THE SOFTWARE -AT NO CHARGE. IF MICROSOFT CANNOT REPAIR OR REPLACE IT, MICROSOFT WILL REFUND -THE AMOUNT SHOWN ON YOUR RECEIPT FOR THE SOFTWARE. IT WILL ALSO REPAIR OR -REPLACE SUPPLEMENTS, UPDATES AND REPLACEMENT SOFTWARE AT NO CHARGE. IF -MICROSOFT CANNOT REPAIR OR REPLACE THEM, IT WILL REFUND THE AMOUNT YOU PAID FOR -THEM, IF ANY. YOU MUST UNINSTALL THE SOFTWARE AND RETURN ANY MEDIA AND OTHER -ASSOCIATED MATERIALS TO MICROSOFT WITH PROOF OF PURCHASE TO OBTAIN A REFUND. -THESE ARE YOUR ONLY REMEDIES FOR BREACH OF THE LIMITED WARRANTY. - -E. CONSUMER RIGHTS NOT AFFECTED. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS UNDER -YOUR LOCAL LAWS, WHICH THIS AGREEMENT CANNOT CHANGE. - -F. WARRANTY PROCEDURES. You need proof of purchase for warranty service. - -1. United States and Canada. For warranty service or information about how to -obtain a refund for software acquired in the United States and Canada, contact -Microsoft at - • (800) MICROSOFT; - • Microsoft Customer Service and Support, One Microsoft Way, Redmond, WA -98052-6399; or - • visit www.microsoft.com/info/nareturns.htm. - -2. Europe, Middle East and Africa. If you acquired the software in Europe, the -Middle East or Africa, Microsoft Ireland Operations Limited makes this limited -warranty. To make a claim under this warranty, you should contact either - • Microsoft Ireland Operations Limited, Customer Care Centre, Atrium Building -Block B, Carmanhall Road, Sandyford Industrial Estate, Dublin 18, Ireland; or - • the Microsoft affiliate serving your country (see www.microsoft.com/worldwide). - -3. Outside United States, Canada, Europe, Middle East and Africa. If you -acquired the software outside the United States, Canada, Europe, the Middle East -and Africa, contact the Microsoft affiliate serving your country (see -www.microsoft.com/worldwide). - -G. NO OTHER WARRANTIES. THE LIMITED WARRANTY IS THE ONLY DIRECT WARRANTY FROM -MICROSOFT. MICROSOFT GIVES NO OTHER EXPRESS WARRANTIES, GUARANTEES OR -CONDITIONS. WHERE ALLOWED BY YOUR LOCAL LAWS, MICROSOFT EXCLUDES IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT. If your local laws give you any implied warranties, -guarantees or conditions, despite this exclusion, your remedies are described in -the Remedy for Breach of Warranty clause above, to the extent permitted by your -local laws. - -H. LIMITATION ON AND EXCLUSION OF DAMAGES FOR BREACH OF WARRANTY. THE -LIMITATION ON AND EXCLUSION OF DAMAGES CLAUSE ABOVE APPLIES TO BREACHES OF THIS -LIMITED WARRANTY. - -THIS WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS, AND YOU MAY ALSO HAVE OTHER -RIGHTS WHICH VARY FROM STATE TO STATE. YOU MAY ALSO HAVE OTHER RIGHTS WHICH -VARY FROM COUNTRY TO COUNTRY. - -Please note: As this software is distributed in Quebec, Canada, some of the -clauses in this agreement are provided below in French. - -Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses -dans ce contrat sont fournies ci-dessous en français. - -GARANTIE LIMITÉE - -A. GARANTIE LIMITÉE. Si vous suivez les instructions, le logiciel fonctionnera -dans son ensemble comme il est décrit dans la documentation de Microsoft reçue -avec ou dans le logiciel. - -B. DURÉE DE LA GARANTIE ; BÉNÉFICIAIRE DE LA GARANTIE ; DURÉE DE TOUTE GARANTIE -IMPLICITE. La garantie limitée couvre le logiciel pendant un an après son -acquisition par le premier utilisateur. Si vous recevez des compléments, des -mises à jour ou un logiciel de remplacement au cours de cette année, ils seront -couverts par la garantie pendant la durée restante ou pendant 30 jours, la -période la plus longue étant retenue. Si le premier utilisateur transfère le -logiciel, la durée restante de la garantie s’applique au destinataire. -Dans la limite autorisée par la loi en vigueur, toute garantie ou condition -implicite dont vous bénéficiez prendra fin au terme de la garantie limitée. -Certains États n’autorisent pas les limitations portant sur la durée d’une -garantie implicite, de sorte que les limitations ci-dessus peuvent ne pas vous -être applicables. Elles peuvent également ne pas vous être applicables, car -certains pays n’autorisent pas les limitations portant sur la durée d’une -garantie ou condition implicite. - -C. EXCLUSIONS DE LA GARANTIE. Cette garantie ne couvre pas les problèmes -engendrés par vos propres actes (ou absences d’actes), ceux de tiers ou tout -autre événement indépendant de la volonté de Microsoft. - -D. RECOURS DANS LE CADRE DE LA VIOLATION DE GARANTIE. Nous nous engageons à -réparer ou à remplacer le logiciel gratuitement. Si nous ne pouvons pas le -réparer ni le remplacer, nous rembourserons le montant que vous avez payé pour -le logiciel figurant sur le reçu. Nous nous engageons à réparer ou à remplacer -les compléments, les mises à jour et le logiciel de remplacement gratuitement. -Si nous ne pouvons pas les réparer ni les remplacer, nous rembourserons le -montant que vous avez payé pour ces composants, le cas échéant. Vous devez -désinstaller le logiciel et le renvoyer à Microsoft avec une preuve d’achat pour -vous faire rembourser. Ces recours sont les seuls dont vous disposez dans le -cadre de la violation de garantie limitée. - -E. DROITS DES CONSOMMATEURS NON AFFECTÉS. Vous pouvez bénéficier de droits des -consommateurs supplémentaires dans le cadre du droit local, que ce contrat ne -peut modifier. - -F. PROCÉDURES RELATIVES AUX RÉCLAMATIONS DANS LE CADRE DE LA GARANTIE. Vous -devrez fournir une preuve d’achat pour obtenir de l’aide en matière de garantie. - -1. États-Unis et Canada. Pour obtenir de l’aide en matière de garantie ou des -informations sur la procédure à suivre pour vous faire rembourser un logiciel -acquis aux États-Unis et au Canada, mettez-vous en rapport avec Microsoft - • (800) MICROSOFT ; - • Microsoft Customer Service and Support, One Microsoft Way, Redmond, WA -98052-6399 ; ou - • en visitant www.microsoft.com/info/nareturns.htm. - -2. Europe, Moyen-Orient et Afrique. Si vous avez acquis le logiciel en Europe, -au Moyen-Orient ou en Afrique, Microsoft Ireland Operations Limited offre cette -garantie limitée. Pour faire une réclamation au titre de cette garantie, vous -devez vous mettre en rapport avec - • Microsoft Ireland Operations Limited, Customer Care Centre, Atrium Building -Block B, Carmanhall Road, Sandyford Industrial Estate, Dublin 18, Irlande ; ou - • votre filiale nationale de Microsoft (visitez le site -www.microsoft.com/worldwide). - -3. En dehors des États-Unis, du Canada, de l’Europe, du Moyen-Orient et de -l’Afrique. Si vous avez acquis le logiciel en dehors des États-Unis, du Canada, -de l’Europe, du Moyen-Orient et de l’Afrique, mettez-vous en rapport avec votre -filiale nationale de Microsoft (visitez le site www.microsoft.com/worldwide). - -G. AUCUNE AUTRE GARANTIE. La garantie limitée est la seule garantie directe de -Microsoft. Nous n’accordons aucune autre garantie ou condition expresse. Dans -toute la mesure permise par le droit local, les garanties implicites de qualité -marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont -exclues. Si le droit local vous accorde des garanties ou conditions implicites, -nonobstant la présente exclusion, les recours dont vous disposez sont ceux -présentés dans la clause de recours dans le cadre de la violation de garantie -ci-dessus, dans la limite autorisée par le droit local. - -H. LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ DANS LE CADRE -DE LA VIOLATION DE GARANTIE. La clause de limitation des dommages-intérêts et -exclusion de responsabilité ci-dessous s’applique aux violations de cette -garantie limitée. - -La présente garantie vous confère des droits légaux spécifiques et vous pouvez -également bénéficier d’autres droits qui varient d’un État à l’autre. Vous -pouvez également bénéficier d’autres droits qui varient d’un pays à l’autre. - -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES -DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une -indemnisation en cas de dommages directs uniquement à hauteur du montant que -vous avez payé pour le logiciel. Vous ne pouvez prétendre à aucune indemnisation -pour les autres dommages, y compris les dommages spéciaux, indirects ou -accessoires et pertes de bénéfices. - -Cette limitation concerne - • toute affaire liée au logiciel, aux services ou au contenu (y compris le -code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et - • les réclamations au titre de violation de contrat ou de garantie ou -condition, ou au titre de responsabilité stricte, de négligence ou d’une autre -faute dans la limite autorisée par la loi en vigueur. - -Elle s’applique également, même si - • la réparation, le remplacement ou le remboursement du logiciel ne compense -pas intégralement toute perte subie ; ou - • Microsoft connaissait l’éventualité d’un tel dommage. - -Certains États n’autorisent pas l’exclusion ou la limitation de responsabilité -pour les dommages indirects ou accessoires, de sorte que la limitation ou -l’exclusion ci-dessus peut ne pas vous être applicable. Elles peuvent également -ne pas vous être applicables, car votre pays n’autorise pas l’exclusion ou la -limitation de responsabilité pour les dommages indirects, accessoires ou de -quelque nature que ce soit. - -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous -pourriez avoir d’autres droits prévus par les lois de votre État ou pays. Vous -pourriez également avoir des droits à l’égard de la partie de qui vous avez -acquis de logiciel. Le présent contrat ne modifie pas les droits que vous -confèrent les lois de votre État ou pays si celles ci ne le permettent pas. - -*************************************************************************** diff --git a/ReplicatorG/build/windows/dist/java/Welcome.html b/ReplicatorG/build/windows/dist/java/Welcome.html deleted file mode 100644 index c55c68a..0000000 --- a/ReplicatorG/build/windows/dist/java/Welcome.html +++ /dev/null @@ -1,26 +0,0 @@ - - - -Welcome to the Java(TM) Platform - - - - -

Welcome to the JavaTM Platform

-

Welcome to the JavaTM Standard Edition Runtime - Environment. This provides complete runtime support for Java applications. -

The runtime environment includes the JavaTM - Plug-in product which supports the Java environment inside web browsers. -

References

-

-See the Java Plug-in product -documentation for more information on using the Java Plug-in product. -

See the Java Platform web site for - more information on the Java Platform. -


-Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle, Santa -Clara, California 95054, U.S.A.
-All rights reserved.
-

- - diff --git a/ReplicatorG/build/windows/dist/java/bin/JdbcOdbc.dll b/ReplicatorG/build/windows/dist/java/bin/JdbcOdbc.dll deleted file mode 100644 index 8da11d6..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/JdbcOdbc.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/attach.dll b/ReplicatorG/build/windows/dist/java/bin/attach.dll deleted file mode 100644 index bc42a02..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/attach.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/awt.dll b/ReplicatorG/build/windows/dist/java/bin/awt.dll deleted file mode 100644 index 46627da..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/awt.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/axbridge.dll b/ReplicatorG/build/windows/dist/java/bin/axbridge.dll deleted file mode 100644 index b680443..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/axbridge.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/client/Xusage.txt b/ReplicatorG/build/windows/dist/java/bin/client/Xusage.txt deleted file mode 100644 index 11302aa..0000000 --- a/ReplicatorG/build/windows/dist/java/bin/client/Xusage.txt +++ /dev/null @@ -1,24 +0,0 @@ - -Xmixed mixed mode execution (default) - -Xint interpreted mode execution only - -Xbootclasspath: - set search path for bootstrap classes and resources - -Xbootclasspath/a: - append to end of bootstrap class path - -Xbootclasspath/p: - prepend in front of bootstrap class path - -Xnoclassgc disable class garbage collection - -Xincgc enable incremental garbage collection - -Xloggc: log GC status to a file with time stamps - -Xbatch disable background compilation - -Xms set initial Java heap size - -Xmx set maximum Java heap size - -Xss set java thread stack size - -Xprof output cpu profiling data - -Xfuture enable strictest checks, anticipating future default - -Xrs reduce use of OS signals by Java/VM (see documentation) - -Xcheck:jni perform additional checks for JNI functions - -Xshare:off do not attempt to use shared class data - -Xshare:auto use shared class data if possible (default) - -Xshare:on require using shared class data, otherwise fail. - -The -X options are non-standard and subject to change without notice. diff --git a/ReplicatorG/build/windows/dist/java/bin/client/classes.jsa b/ReplicatorG/build/windows/dist/java/bin/client/classes.jsa deleted file mode 100644 index 0258a6f..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/client/classes.jsa and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/client/jvm.dll b/ReplicatorG/build/windows/dist/java/bin/client/jvm.dll deleted file mode 100644 index 3f8efa7..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/client/jvm.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/cmm.dll b/ReplicatorG/build/windows/dist/java/bin/cmm.dll deleted file mode 100644 index 754aede..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/cmm.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/dcpr.dll b/ReplicatorG/build/windows/dist/java/bin/dcpr.dll deleted file mode 100644 index 82e22a8..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/dcpr.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/deploy.dll b/ReplicatorG/build/windows/dist/java/bin/deploy.dll deleted file mode 100644 index e3ecb58..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/deploy.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/deploytk.dll b/ReplicatorG/build/windows/dist/java/bin/deploytk.dll deleted file mode 100644 index 01f016d..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/deploytk.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/dt_shmem.dll b/ReplicatorG/build/windows/dist/java/bin/dt_shmem.dll deleted file mode 100644 index 28605ba..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/dt_shmem.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/dt_socket.dll b/ReplicatorG/build/windows/dist/java/bin/dt_socket.dll deleted file mode 100644 index 377182a..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/dt_socket.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/eula.dll b/ReplicatorG/build/windows/dist/java/bin/eula.dll deleted file mode 100644 index 00ac819..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/eula.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/fontmanager.dll b/ReplicatorG/build/windows/dist/java/bin/fontmanager.dll deleted file mode 100644 index d5c6e20..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/fontmanager.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/hpi.dll b/ReplicatorG/build/windows/dist/java/bin/hpi.dll deleted file mode 100644 index cced3cb..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/hpi.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/hprof.dll b/ReplicatorG/build/windows/dist/java/bin/hprof.dll deleted file mode 100644 index 29a470f..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/hprof.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/instrument.dll b/ReplicatorG/build/windows/dist/java/bin/instrument.dll deleted file mode 100644 index 4cd1a30..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/instrument.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/ioser12.dll b/ReplicatorG/build/windows/dist/java/bin/ioser12.dll deleted file mode 100644 index 77b40f9..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/ioser12.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/j2pcsc.dll b/ReplicatorG/build/windows/dist/java/bin/j2pcsc.dll deleted file mode 100644 index 849f521..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/j2pcsc.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/j2pkcs11.dll b/ReplicatorG/build/windows/dist/java/bin/j2pkcs11.dll deleted file mode 100644 index 4032091..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/j2pkcs11.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jaas_nt.dll b/ReplicatorG/build/windows/dist/java/bin/jaas_nt.dll deleted file mode 100644 index fa11d26..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jaas_nt.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/java-rmi.exe b/ReplicatorG/build/windows/dist/java/bin/java-rmi.exe deleted file mode 100644 index ca32913..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/java-rmi.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/java.dll b/ReplicatorG/build/windows/dist/java/bin/java.dll deleted file mode 100644 index b16670f..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/java.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/java.exe b/ReplicatorG/build/windows/dist/java/bin/java.exe deleted file mode 100644 index 15a4c37..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/java.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/java_crw_demo.dll b/ReplicatorG/build/windows/dist/java/bin/java_crw_demo.dll deleted file mode 100644 index e4f2764..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/java_crw_demo.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/javacpl.cpl b/ReplicatorG/build/windows/dist/java/bin/javacpl.cpl deleted file mode 100644 index 3da45fc..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/javacpl.cpl and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/javacpl.exe b/ReplicatorG/build/windows/dist/java/bin/javacpl.exe deleted file mode 100644 index aecbaf9..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/javacpl.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/javaw.exe b/ReplicatorG/build/windows/dist/java/bin/javaw.exe deleted file mode 100644 index c297274..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/javaw.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/javaws.exe b/ReplicatorG/build/windows/dist/java/bin/javaws.exe deleted file mode 100644 index a5cea0e..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/javaws.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jawt.dll b/ReplicatorG/build/windows/dist/java/bin/jawt.dll deleted file mode 100644 index b3618b8..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jawt.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jbroker.exe b/ReplicatorG/build/windows/dist/java/bin/jbroker.exe deleted file mode 100644 index 8f97294..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jbroker.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jdwp.dll b/ReplicatorG/build/windows/dist/java/bin/jdwp.dll deleted file mode 100644 index e31aef5..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jdwp.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jkernel.dll b/ReplicatorG/build/windows/dist/java/bin/jkernel.dll deleted file mode 100644 index 4859942..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jkernel.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jli.dll b/ReplicatorG/build/windows/dist/java/bin/jli.dll deleted file mode 100644 index db2d337..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jli.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jp2iexp.dll b/ReplicatorG/build/windows/dist/java/bin/jp2iexp.dll deleted file mode 100644 index 538159d..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jp2iexp.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jp2launcher.exe b/ReplicatorG/build/windows/dist/java/bin/jp2launcher.exe deleted file mode 100644 index 3a288f1..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jp2launcher.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jp2native.dll b/ReplicatorG/build/windows/dist/java/bin/jp2native.dll deleted file mode 100644 index 55455e1..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jp2native.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jp2ssv.dll b/ReplicatorG/build/windows/dist/java/bin/jp2ssv.dll deleted file mode 100644 index 0ab8636..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jp2ssv.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jpeg.dll b/ReplicatorG/build/windows/dist/java/bin/jpeg.dll deleted file mode 100644 index 1dd14ee..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jpeg.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jpicom.dll b/ReplicatorG/build/windows/dist/java/bin/jpicom.dll deleted file mode 100644 index f30dcd2..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jpicom.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jpiexp.dll b/ReplicatorG/build/windows/dist/java/bin/jpiexp.dll deleted file mode 100644 index 8a31f4b..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jpiexp.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jpinscp.dll b/ReplicatorG/build/windows/dist/java/bin/jpinscp.dll deleted file mode 100644 index 5f04077..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jpinscp.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jpioji.dll b/ReplicatorG/build/windows/dist/java/bin/jpioji.dll deleted file mode 100644 index 4914620..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jpioji.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jpishare.dll b/ReplicatorG/build/windows/dist/java/bin/jpishare.dll deleted file mode 100644 index 999b06e..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jpishare.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jqs.exe b/ReplicatorG/build/windows/dist/java/bin/jqs.exe deleted file mode 100644 index 542b5be..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jqs.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jqsnotify.exe b/ReplicatorG/build/windows/dist/java/bin/jqsnotify.exe deleted file mode 100644 index cf0b15c..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jqsnotify.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jsound.dll b/ReplicatorG/build/windows/dist/java/bin/jsound.dll deleted file mode 100644 index 1e32cf2..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jsound.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jsoundds.dll b/ReplicatorG/build/windows/dist/java/bin/jsoundds.dll deleted file mode 100644 index 26da010..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jsoundds.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jucheck.exe b/ReplicatorG/build/windows/dist/java/bin/jucheck.exe deleted file mode 100644 index f837c7c..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jucheck.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jureg.exe b/ReplicatorG/build/windows/dist/java/bin/jureg.exe deleted file mode 100644 index d35b0dd..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jureg.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/jusched.exe b/ReplicatorG/build/windows/dist/java/bin/jusched.exe deleted file mode 100644 index b6cd063..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/jusched.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/keytool.exe b/ReplicatorG/build/windows/dist/java/bin/keytool.exe deleted file mode 100644 index e65acba..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/keytool.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/kinit.exe b/ReplicatorG/build/windows/dist/java/bin/kinit.exe deleted file mode 100644 index 2dc53da..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/kinit.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/klist.exe b/ReplicatorG/build/windows/dist/java/bin/klist.exe deleted file mode 100644 index 2250e90..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/klist.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/ktab.exe b/ReplicatorG/build/windows/dist/java/bin/ktab.exe deleted file mode 100644 index e30601d..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/ktab.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/management.dll b/ReplicatorG/build/windows/dist/java/bin/management.dll deleted file mode 100644 index 3735738..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/management.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/mlib_image.dll b/ReplicatorG/build/windows/dist/java/bin/mlib_image.dll deleted file mode 100644 index fd6c434..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/mlib_image.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/msvcr71.dll b/ReplicatorG/build/windows/dist/java/bin/msvcr71.dll deleted file mode 100644 index 9d9e028..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/msvcr71.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/msvcrt.dll b/ReplicatorG/build/windows/dist/java/bin/msvcrt.dll deleted file mode 100644 index 16bb340..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/msvcrt.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/net.dll b/ReplicatorG/build/windows/dist/java/bin/net.dll deleted file mode 100644 index dd9fdad..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/net.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/new_plugin/msvcr71.dll b/ReplicatorG/build/windows/dist/java/bin/new_plugin/msvcr71.dll deleted file mode 100644 index 9d9e028..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/new_plugin/msvcr71.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/new_plugin/npjp2.dll b/ReplicatorG/build/windows/dist/java/bin/new_plugin/npjp2.dll deleted file mode 100644 index 4619afe..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/new_plugin/npjp2.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/nio.dll b/ReplicatorG/build/windows/dist/java/bin/nio.dll deleted file mode 100644 index 3ffbb84..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/nio.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/npdeploytk.dll b/ReplicatorG/build/windows/dist/java/bin/npdeploytk.dll deleted file mode 100644 index 07c6126..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/npdeploytk.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/npjpi160_16.dll b/ReplicatorG/build/windows/dist/java/bin/npjpi160_16.dll deleted file mode 100644 index 625673b..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/npjpi160_16.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/npoji610.dll b/ReplicatorG/build/windows/dist/java/bin/npoji610.dll deleted file mode 100644 index 9f76467..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/npoji610.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/npt.dll b/ReplicatorG/build/windows/dist/java/bin/npt.dll deleted file mode 100644 index a2e7324..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/npt.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/orbd.exe b/ReplicatorG/build/windows/dist/java/bin/orbd.exe deleted file mode 100644 index c687954..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/orbd.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/pack200.exe b/ReplicatorG/build/windows/dist/java/bin/pack200.exe deleted file mode 100644 index 2d43ec6..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/pack200.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/policytool.exe b/ReplicatorG/build/windows/dist/java/bin/policytool.exe deleted file mode 100644 index aea4e20..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/policytool.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/regutils.dll b/ReplicatorG/build/windows/dist/java/bin/regutils.dll deleted file mode 100644 index 1b7d471..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/regutils.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/rmi.dll b/ReplicatorG/build/windows/dist/java/bin/rmi.dll deleted file mode 100644 index 7ad9833..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/rmi.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/rmid.exe b/ReplicatorG/build/windows/dist/java/bin/rmid.exe deleted file mode 100644 index 3896f50..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/rmid.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/rmiregistry.exe b/ReplicatorG/build/windows/dist/java/bin/rmiregistry.exe deleted file mode 100644 index 474969b..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/rmiregistry.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/server/Xusage.txt b/ReplicatorG/build/windows/dist/java/bin/server/Xusage.txt deleted file mode 100644 index 11302aa..0000000 --- a/ReplicatorG/build/windows/dist/java/bin/server/Xusage.txt +++ /dev/null @@ -1,24 +0,0 @@ - -Xmixed mixed mode execution (default) - -Xint interpreted mode execution only - -Xbootclasspath: - set search path for bootstrap classes and resources - -Xbootclasspath/a: - append to end of bootstrap class path - -Xbootclasspath/p: - prepend in front of bootstrap class path - -Xnoclassgc disable class garbage collection - -Xincgc enable incremental garbage collection - -Xloggc: log GC status to a file with time stamps - -Xbatch disable background compilation - -Xms set initial Java heap size - -Xmx set maximum Java heap size - -Xss set java thread stack size - -Xprof output cpu profiling data - -Xfuture enable strictest checks, anticipating future default - -Xrs reduce use of OS signals by Java/VM (see documentation) - -Xcheck:jni perform additional checks for JNI functions - -Xshare:off do not attempt to use shared class data - -Xshare:auto use shared class data if possible (default) - -Xshare:on require using shared class data, otherwise fail. - -The -X options are non-standard and subject to change without notice. diff --git a/ReplicatorG/build/windows/dist/java/bin/server/jvm.dll b/ReplicatorG/build/windows/dist/java/bin/server/jvm.dll deleted file mode 100644 index f98e043..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/server/jvm.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/servertool.exe b/ReplicatorG/build/windows/dist/java/bin/servertool.exe deleted file mode 100644 index 1615fb8..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/servertool.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/splashscreen.dll b/ReplicatorG/build/windows/dist/java/bin/splashscreen.dll deleted file mode 100644 index 2ccb38a..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/splashscreen.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/ssv.dll b/ReplicatorG/build/windows/dist/java/bin/ssv.dll deleted file mode 100644 index a92c98e..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/ssv.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/ssvagent.exe b/ReplicatorG/build/windows/dist/java/bin/ssvagent.exe deleted file mode 100644 index 8d75c5d..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/ssvagent.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/sunmscapi.dll b/ReplicatorG/build/windows/dist/java/bin/sunmscapi.dll deleted file mode 100644 index 848292e..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/sunmscapi.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/tnameserv.exe b/ReplicatorG/build/windows/dist/java/bin/tnameserv.exe deleted file mode 100644 index 22c7f1e..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/tnameserv.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/unicows.dll b/ReplicatorG/build/windows/dist/java/bin/unicows.dll deleted file mode 100644 index 7f5aea7..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/unicows.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/unpack.dll b/ReplicatorG/build/windows/dist/java/bin/unpack.dll deleted file mode 100644 index bdebf21..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/unpack.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/unpack200.exe b/ReplicatorG/build/windows/dist/java/bin/unpack200.exe deleted file mode 100644 index b9b820e..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/unpack200.exe and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/verify.dll b/ReplicatorG/build/windows/dist/java/bin/verify.dll deleted file mode 100644 index 6d46c3a..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/verify.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/w2k_lsa_auth.dll b/ReplicatorG/build/windows/dist/java/bin/w2k_lsa_auth.dll deleted file mode 100644 index d8d6d04..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/w2k_lsa_auth.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/wsdetect.dll b/ReplicatorG/build/windows/dist/java/bin/wsdetect.dll deleted file mode 100644 index 9613f9c..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/wsdetect.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/bin/zip.dll b/ReplicatorG/build/windows/dist/java/bin/zip.dll deleted file mode 100644 index 975a58a..0000000 Binary files a/ReplicatorG/build/windows/dist/java/bin/zip.dll and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/alt-rt.jar b/ReplicatorG/build/windows/dist/java/lib/alt-rt.jar deleted file mode 100644 index e510bc0..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/alt-rt.jar and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/audio/soundbank.gm b/ReplicatorG/build/windows/dist/java/lib/audio/soundbank.gm deleted file mode 100644 index 83c2f87..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/audio/soundbank.gm and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/calendars.properties b/ReplicatorG/build/windows/dist/java/lib/calendars.properties deleted file mode 100644 index 5ae5fdf..0000000 --- a/ReplicatorG/build/windows/dist/java/lib/calendars.properties +++ /dev/null @@ -1,37 +0,0 @@ -# -# @(#)calendars.properties 1.2 07/01/18 -# -# Copyright 2005 Sun Microsystems, Inc. All rights reserved. -# SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. -# - -# -# Japanese imperial calendar -# -# Meiji since 1868-01-01 00:00:00 local time (Gregorian) -# Taisho since 1912-07-30 00:00:00 local time (Gregorian) -# Showa since 1926-12-25 00:00:00 local time (Gregorian) -# Heisei since 1989-01-08 00:00:00 local time (Gregorian) -calendar.japanese.type: LocalGregorianCalendar -calendar.japanese.eras: \ - name=Meiji,abbr=M,since=-3218832000000; \ - name=Taisho,abbr=T,since=-1812153600000; \ - name=Showa,abbr=S,since=-1357603200000; \ - name=Heisei,abbr=H,since=600220800000 - -# -# Taiwanese calendar -# Minguo since 1911-01-01 00:00:00 local time (Gregorian) -calendar.taiwanese.type: LocalGregorianCalendar -calendar.taiwanese.eras: \ - name=MinGuo,since=-1830384000000 - -# -# Thai Buddhist calendar -# Buddhist Era since -542-01-01 00:00:00 local time (Gregorian) -calendar.thai-buddhist.type: LocalGregorianCalendar -calendar.thai-buddhist.eras: \ - name=BuddhistEra,abbr=B.E.,since=-79302585600000 -calendar.thai-buddhist.year-boundary: \ - day1=4-1,since=-79302585600000; \ - day1=1-1,since=-915148800000 diff --git a/ReplicatorG/build/windows/dist/java/lib/charsets.jar b/ReplicatorG/build/windows/dist/java/lib/charsets.jar deleted file mode 100644 index 3752c64..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/charsets.jar and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/classlist b/ReplicatorG/build/windows/dist/java/lib/classlist deleted file mode 100644 index 103b3f3..0000000 --- a/ReplicatorG/build/windows/dist/java/lib/classlist +++ /dev/null @@ -1,2345 +0,0 @@ -java/lang/Object -java/lang/String -java/io/Serializable -java/lang/Comparable -java/lang/CharSequence -java/lang/Class -java/lang/reflect/GenericDeclaration -java/lang/reflect/Type -java/lang/reflect/AnnotatedElement -java/lang/Cloneable -java/lang/ClassLoader -java/lang/System -java/lang/Throwable -java/lang/Error -java/lang/ThreadDeath -java/lang/Exception -java/lang/RuntimeException -java/security/ProtectionDomain -java/security/AccessControlContext -java/lang/ClassNotFoundException -java/lang/NoClassDefFoundError -java/lang/LinkageError -java/lang/ClassCastException -java/lang/ArrayStoreException -java/lang/VirtualMachineError -java/lang/OutOfMemoryError -java/lang/StackOverflowError -java/lang/IllegalMonitorStateException -java/lang/ref/Reference -java/lang/ref/SoftReference -java/lang/ref/WeakReference -java/lang/ref/FinalReference -java/lang/ref/PhantomReference -java/lang/ref/Finalizer -java/lang/Thread -java/lang/Runnable -java/lang/ThreadGroup -java/lang/Thread$UncaughtExceptionHandler -java/util/Properties -java/util/Hashtable -java/util/Map -java/util/Dictionary -java/lang/reflect/AccessibleObject -java/lang/reflect/Field -java/lang/reflect/Member -java/lang/reflect/Method -java/lang/reflect/Constructor -sun/reflect/MagicAccessorImpl -sun/reflect/MethodAccessorImpl -sun/reflect/MethodAccessor -sun/reflect/ConstructorAccessorImpl -sun/reflect/ConstructorAccessor -sun/reflect/DelegatingClassLoader -sun/reflect/ConstantPool -sun/reflect/UnsafeStaticFieldAccessorImpl -sun/reflect/UnsafeFieldAccessorImpl -sun/reflect/FieldAccessorImpl -sun/reflect/FieldAccessor -java/util/Vector -java/util/List -java/util/Collection -java/lang/Iterable -java/util/RandomAccess -java/util/AbstractList -java/util/AbstractCollection -java/lang/StringBuffer -java/lang/AbstractStringBuilder -java/lang/Appendable -java/lang/StackTraceElement -java/nio/Buffer -sun/misc/AtomicLongCSImpl -sun/misc/AtomicLong -java/lang/Boolean -java/lang/Character -java/lang/Float -java/lang/Number -java/lang/Double -java/lang/Byte -java/lang/Short -java/lang/Integer -java/lang/Long -java/lang/NullPointerException -java/lang/ArithmeticException -java/io/ObjectStreamField -java/lang/String$CaseInsensitiveComparator -java/util/Comparator -java/lang/RuntimePermission -java/security/BasicPermission -java/security/Permission -java/security/Guard -sun/misc/SoftCache -java/util/AbstractMap -java/lang/ref/ReferenceQueue -java/lang/ref/ReferenceQueue$Null -java/lang/ref/ReferenceQueue$Lock -java/util/HashMap -java/lang/annotation/Annotation -java/util/HashMap$Entry -java/util/Map$Entry -java/security/AccessController -java/lang/reflect/ReflectPermission -sun/reflect/ReflectionFactory$GetReflectionFactoryAction -java/security/PrivilegedAction -java/util/Stack -sun/reflect/ReflectionFactory -java/lang/ref/Reference$Lock -java/lang/ref/Reference$ReferenceHandler -java/lang/ref/Finalizer$FinalizerThread -java/util/Hashtable$EmptyEnumerator -java/util/Enumeration -java/util/Hashtable$EmptyIterator -java/util/Iterator -java/util/Hashtable$Entry -sun/misc/Version -java/lang/Runtime -sun/reflect/Reflection -java/util/Collections -java/util/Collections$EmptySet -java/util/AbstractSet -java/util/Set -java/util/Collections$EmptyList -java/util/Collections$EmptyMap -java/util/Collections$ReverseComparator -java/util/Collections$SynchronizedMap -java/io/File -java/io/FileSystem -java/io/WinNTFileSystem -java/io/Win32FileSystem -java/io/ExpiringCache -java/io/ExpiringCache$1 -java/util/LinkedHashMap -java/util/LinkedHashMap$Entry -sun/security/action/GetPropertyAction -java/lang/StringBuilder -java/util/Arrays -java/lang/Math -java/io/File$1 -sun/misc/JavaIODeleteOnExitAccess -sun/misc/SharedSecrets -sun/misc/Unsafe -java/lang/NoSuchMethodError -java/lang/IncompatibleClassChangeError -sun/jkernel/DownloadManager -sun/jkernel/DownloadManager$1 -java/lang/ThreadLocal -java/util/concurrent/atomic/AtomicInteger -java/lang/Class$3 -java/lang/reflect/Modifier -java/lang/reflect/ReflectAccess -sun/reflect/LangReflectAccess -sun/jkernel/DownloadManager$2 -java/lang/ClassLoader$3 -java/io/ExpiringCache$Entry -java/lang/ClassLoader$NativeLibrary -java/io/FileInputStream -java/io/InputStream -java/io/Closeable -java/io/FileDescriptor -java/io/FileOutputStream -java/io/OutputStream -java/io/Flushable -java/io/BufferedInputStream -java/io/FilterInputStream -java/util/concurrent/atomic/AtomicReferenceFieldUpdater -java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl -sun/reflect/misc/ReflectUtil -java/io/PrintStream -java/io/FilterOutputStream -java/io/BufferedOutputStream -java/io/OutputStreamWriter -java/io/Writer -sun/nio/cs/StreamEncoder -java/nio/charset/Charset -sun/nio/cs/StandardCharsets -sun/nio/cs/FastCharsetProvider -java/nio/charset/spi/CharsetProvider -sun/nio/cs/StandardCharsets$Aliases -sun/util/PreHashedMap -sun/nio/cs/StandardCharsets$Classes -sun/nio/cs/StandardCharsets$Cache -sun/nio/cs/MS1252 -sun/nio/cs/HistoricallyNamedCharset -java/lang/Class$1 -sun/reflect/ReflectionFactory$1 -sun/reflect/NativeConstructorAccessorImpl -sun/reflect/DelegatingConstructorAccessorImpl -sun/misc/VM -sun/nio/cs/MS1252$Encoder -sun/nio/cs/SingleByteEncoder -java/nio/charset/CharsetEncoder -java/nio/charset/CodingErrorAction -sun/nio/cs/MS1252$Decoder -sun/nio/cs/SingleByteDecoder -java/nio/charset/CharsetDecoder -java/nio/ByteBuffer -java/nio/HeapByteBuffer -java/nio/Bits -java/nio/ByteOrder -java/nio/CharBuffer -java/lang/Readable -java/nio/HeapCharBuffer -java/nio/charset/CoderResult -java/nio/charset/CoderResult$1 -java/nio/charset/CoderResult$Cache -java/nio/charset/CoderResult$2 -sun/nio/cs/Surrogate$Parser -sun/nio/cs/Surrogate -java/io/BufferedWriter -java/lang/Terminator -java/lang/Terminator$1 -sun/misc/SignalHandler -sun/misc/Signal -sun/misc/NativeSignalHandler -java/io/Console -java/io/Console$1 -sun/misc/JavaIOAccess -java/io/Console$1$1 -java/lang/Shutdown -java/util/ArrayList -java/lang/Shutdown$Lock -java/lang/ApplicationShutdownHooks -java/util/IdentityHashMap -sun/misc/OSEnvironment -sun/io/Win32ErrorMode -java/lang/System$2 -sun/misc/JavaLangAccess -java/lang/Compiler -java/lang/Compiler$1 -sun/misc/Launcher -sun/misc/Launcher$Factory -java/net/URLStreamHandlerFactory -sun/misc/Launcher$ExtClassLoader -java/net/URLClassLoader -java/security/SecureClassLoader -sun/security/util/Debug -java/net/URLClassLoader$7 -sun/misc/JavaNetAccess -java/util/StringTokenizer -sun/misc/Launcher$ExtClassLoader$1 -java/security/PrivilegedExceptionAction -sun/misc/MetaIndex -java/io/BufferedReader -java/io/Reader -java/io/FileReader -java/io/InputStreamReader -sun/nio/cs/StreamDecoder -java/lang/reflect/Array -java/util/Locale -java/util/concurrent/ConcurrentHashMap -java/util/concurrent/ConcurrentMap -java/util/concurrent/ConcurrentHashMap$Segment -java/util/concurrent/locks/ReentrantLock -java/util/concurrent/locks/Lock -java/util/concurrent/locks/ReentrantLock$NonfairSync -java/util/concurrent/locks/ReentrantLock$Sync -java/util/concurrent/locks/AbstractQueuedSynchronizer -java/util/concurrent/locks/AbstractOwnableSynchronizer -java/util/concurrent/locks/AbstractQueuedSynchronizer$Node -java/util/concurrent/ConcurrentHashMap$HashEntry -java/lang/CharacterDataLatin1 -java/io/ObjectStreamClass -sun/net/www/ParseUtil -java/util/BitSet -java/net/URL -java/net/Parts -sun/net/www/protocol/file/Handler -java/net/URLStreamHandler -java/util/HashSet -sun/misc/URLClassPath -sun/net/www/protocol/jar/Handler -sun/misc/Launcher$AppClassLoader -sun/misc/Launcher$AppClassLoader$1 -java/lang/SystemClassLoaderAction -java/lang/StringCoding -java/lang/ThreadLocal$ThreadLocalMap -java/lang/ThreadLocal$ThreadLocalMap$Entry -java/lang/StringCoding$StringDecoder -java/net/URLClassLoader$1 -sun/misc/URLClassPath$3 -sun/misc/URLClassPath$JarLoader -sun/misc/URLClassPath$Loader -java/security/PrivilegedActionException -sun/misc/URLClassPath$FileLoader -sun/misc/URLClassPath$FileLoader$1 -sun/misc/Resource -sun/nio/ByteBuffered -java/security/CodeSource -java/security/Permissions -java/security/PermissionCollection -sun/net/www/protocol/file/FileURLConnection -sun/net/www/URLConnection -java/net/URLConnection -java/net/UnknownContentHandler -java/net/ContentHandler -sun/net/www/MessageHeader -java/io/FilePermission -java/io/FilePermission$1 -sun/security/provider/PolicyFile -java/security/Policy -java/security/Policy$UnsupportedEmptyCollection -java/io/FilePermissionCollection -java/security/AllPermission -java/security/UnresolvedPermission -java/security/BasicPermissionCollection -java/security/Principal -java/security/cert/Certificate -java/util/AbstractList$Itr -java/util/IdentityHashMap$KeySet -java/util/IdentityHashMap$KeyIterator -java/util/IdentityHashMap$IdentityHashMapIterator -java/io/DeleteOnExitHook -java/util/LinkedHashSet -java/util/HashMap$KeySet -java/util/LinkedHashMap$KeyIterator -java/util/LinkedHashMap$LinkedHashIterator -java/awt/Frame -java/awt/MenuContainer -java/awt/Window -javax/accessibility/Accessible -java/awt/Container -java/awt/Component -java/awt/image/ImageObserver -java/lang/InterruptedException -java/awt/Label -java/util/logging/Logger -java/util/logging/Handler -java/util/logging/Level -java/util/logging/LogManager -java/util/logging/LogManager$1 -java/beans/PropertyChangeSupport -java/util/logging/LogManager$LogNode -java/util/logging/LoggingPermission -java/util/logging/LogManager$Cleaner -java/util/logging/LogManager$RootLogger -java/util/logging/LogManager$2 -java/util/Properties$LineReader -java/util/Hashtable$Enumerator -java/beans/PropertyChangeEvent -java/util/EventObject -java/awt/Component$AWTTreeLock -sun/awt/DebugHelper -sun/awt/NativeLibLoader -sun/security/action/LoadLibraryAction -sun/awt/DebugHelperStub -java/awt/Toolkit -java/awt/Toolkit$3 -sun/util/CoreResourceBundleControl -java/util/ResourceBundle$Control -java/util/Arrays$ArrayList -java/util/Collections$UnmodifiableRandomAccessList -java/util/Collections$UnmodifiableList -java/util/Collections$UnmodifiableCollection -java/util/ResourceBundle -java/util/ResourceBundle$1 -java/util/ResourceBundle$RBClassLoader -java/util/ResourceBundle$RBClassLoader$1 -java/util/ResourceBundle$CacheKey -java/util/ResourceBundle$LoaderReference -java/util/ResourceBundle$CacheKeyReference -java/util/ResourceBundle$SingleFormatControl -sun/awt/resources/awt -java/util/ListResourceBundle -java/awt/Toolkit$1 -java/io/FileNotFoundException -java/io/IOException -java/awt/GraphicsEnvironment -java/awt/GraphicsEnvironment$1 -java/awt/Insets -sun/awt/windows/WComponentPeer -java/awt/peer/ComponentPeer -java/awt/dnd/peer/DropTargetPeer -sun/awt/DisplayChangedListener -java/util/EventListener -sun/awt/windows/WObjectPeer -java/awt/Font -java/awt/geom/AffineTransform -sun/font/AttributeValues -sun/font/EAttribute -java/lang/Enum -java/text/AttributedCharacterIterator$Attribute -java/lang/Class$4 -sun/reflect/NativeMethodAccessorImpl -sun/reflect/DelegatingMethodAccessorImpl -java/awt/font/TextAttribute -java/lang/Integer$IntegerCache -java/awt/Component$1 -sun/awt/AWTAccessor$ComponentAccessor -sun/awt/AWTAccessor -java/util/WeakHashMap -java/util/WeakHashMap$Entry -java/awt/AWTEvent -java/awt/Component$DummyRequestFocusController -sun/awt/RequestFocusController -java/awt/LayoutManager -java/awt/LightweightDispatcher -java/awt/event/AWTEventListener -java/awt/Dimension -java/awt/geom/Dimension2D -sun/awt/util/IdentityArrayList -java/util/concurrent/atomic/AtomicBoolean -java/awt/Color -java/awt/Paint -java/awt/Transparency -java/awt/Window$1 -sun/awt/AWTAccessor$WindowAccessor -java/awt/ComponentOrientation -java/awt/Component$3 -java/lang/NoSuchMethodException -sun/awt/AppContext -sun/awt/AppContext$1 -sun/awt/AppContext$2 -sun/awt/MostRecentKeyValue -java/awt/Cursor -java/awt/Point -java/awt/geom/Point2D -sun/awt/Win32GraphicsEnvironment -sun/java2d/SunGraphicsEnvironment -sun/java2d/FontSupport -sun/java2d/SunGraphicsEnvironment$1 -sun/java2d/SunGraphicsEnvironment$TTFilter -java/io/FilenameFilter -sun/java2d/SunGraphicsEnvironment$T1Filter -sun/awt/windows/WToolkit -sun/awt/SunToolkit -sun/awt/WindowClosingSupport -sun/awt/WindowClosingListener -sun/awt/ComponentFactory -sun/awt/InputMethodSupport -java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject -java/util/concurrent/locks/Condition -sun/awt/AWTAutoShutdown -sun/awt/AWTAutoShutdown$PeerMap -sun/awt/SunToolkit$6 -java/awt/Dialog$ModalExclusionType -java/awt/Dialog -java/awt/Dialog$ModalityType -java/awt/ModalEventFilter -java/awt/EventFilter -sun/reflect/UnsafeFieldAccessorFactory -sun/awt/windows/WWindowPeer -java/awt/peer/WindowPeer -java/awt/peer/ContainerPeer -sun/awt/windows/WPanelPeer -java/awt/peer/PanelPeer -sun/awt/windows/WCanvasPeer -java/awt/peer/CanvasPeer -sun/awt/windows/WToolkit$5 -java/awt/GraphicsConfiguration -java/awt/image/BufferStrategy -java/awt/dnd/DropTarget -java/awt/dnd/DropTargetListener -java/awt/event/ComponentListener -java/awt/event/FocusListener -java/awt/event/HierarchyListener -java/awt/event/HierarchyBoundsListener -java/awt/event/KeyListener -java/awt/event/MouseListener -java/awt/event/MouseMotionListener -java/awt/event/MouseWheelListener -java/awt/event/InputMethodListener -java/awt/EventQueueItem -java/awt/Component$NativeInLightFixer -java/awt/event/ContainerListener -javax/accessibility/AccessibleContext -sun/awt/windows/WToolkit$6 -java/io/ObjectOutputStream -java/io/ObjectOutput -java/io/DataOutput -java/io/ObjectStreamConstants -java/awt/Shape -java/io/ObjectInputStream -java/io/ObjectInput -java/io/DataInput -java/awt/HeadlessException -java/lang/UnsupportedOperationException -java/awt/image/BufferedImage -java/awt/image/WritableRenderedImage -java/awt/image/RenderedImage -java/awt/Image -java/awt/Rectangle -java/awt/geom/Rectangle2D -java/awt/geom/RectangularShape -java/awt/event/KeyEvent -java/awt/event/InputEvent -java/awt/event/ComponentEvent -java/awt/Event -java/beans/PropertyChangeListener -java/awt/event/WindowFocusListener -java/awt/event/WindowListener -java/awt/event/WindowStateListener -java/awt/BufferCapabilities -java/awt/AWTException -java/awt/event/MouseWheelEvent -java/awt/event/MouseEvent -java/awt/im/InputContext -java/awt/event/WindowEvent -java/lang/SecurityException -sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl -sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl -sun/java2d/SurfaceData -sun/java2d/DisposerTarget -sun/java2d/Surface -sun/java2d/InvalidPipeException -java/lang/IllegalStateException -sun/java2d/NullSurfaceData -sun/java2d/loops/SurfaceType -sun/awt/image/PixelConverter -sun/awt/image/PixelConverter$Xrgb -sun/awt/image/PixelConverter$Argb -sun/awt/image/PixelConverter$ArgbPre -sun/awt/image/PixelConverter$Xbgr -sun/awt/image/PixelConverter$Rgba -sun/awt/image/PixelConverter$RgbaPre -sun/awt/image/PixelConverter$Ushort565Rgb -sun/awt/image/PixelConverter$Ushort555Rgb -sun/awt/image/PixelConverter$Ushort555Rgbx -sun/awt/image/PixelConverter$Ushort4444Argb -sun/awt/image/PixelConverter$ByteGray -sun/awt/image/PixelConverter$UshortGray -sun/awt/image/PixelConverter$Rgbx -sun/awt/image/PixelConverter$Bgrx -sun/awt/image/PixelConverter$ArgbBm -java/awt/image/ColorModel -java/awt/image/DirectColorModel -java/awt/image/PackedColorModel -java/awt/color/ColorSpace -java/awt/color/ICC_Profile -sun/awt/color/ProfileDeferralInfo -sun/awt/color/ProfileDeferralMgr -java/awt/color/ICC_ProfileRGB -java/awt/color/ICC_Profile$1 -sun/awt/color/ProfileActivator -java/awt/color/ICC_ColorSpace -sun/java2d/pipe/NullPipe -sun/java2d/pipe/PixelDrawPipe -sun/java2d/pipe/PixelFillPipe -sun/java2d/pipe/ShapeDrawPipe -sun/java2d/pipe/TextPipe -sun/java2d/pipe/DrawImagePipe -java/awt/image/IndexColorModel -sun/java2d/pipe/LoopPipe -sun/java2d/pipe/OutlineTextRenderer -sun/java2d/pipe/SolidTextRenderer -sun/java2d/pipe/GlyphListLoopPipe -sun/java2d/pipe/GlyphListPipe -sun/java2d/pipe/AATextRenderer -sun/java2d/pipe/LCDTextRenderer -sun/java2d/pipe/AlphaColorPipe -sun/java2d/pipe/CompositePipe -sun/java2d/pipe/PixelToShapeConverter -sun/java2d/pipe/TextRenderer -sun/java2d/pipe/SpanClipRenderer -sun/java2d/pipe/Region -sun/java2d/pipe/RegionIterator -sun/java2d/pipe/AlphaPaintPipe -sun/java2d/pipe/SpanShapeRenderer$Composite -sun/java2d/pipe/SpanShapeRenderer -sun/java2d/pipe/GeneralCompositePipe -sun/java2d/pipe/DrawImage -sun/java2d/loops/RenderCache -sun/java2d/loops/RenderCache$Entry -sun/awt/image/SunVolatileImage -sun/java2d/DestSurfaceProvider -java/awt/image/VolatileImage -java/awt/ImageCapabilities -java/awt/Image$1 -sun/awt/image/SurfaceManager$ImageAccessor -sun/awt/image/SurfaceManager -sun/awt/image/VolatileSurfaceManager -sun/awt/windows/WToolkit$1 -sun/java2d/windows/WindowsFlags -sun/java2d/windows/WindowsFlags$1 -sun/awt/SunDisplayChanger -sun/java2d/SunGraphicsEnvironment$2 -sun/font/FontManager -sun/font/FileFont -sun/font/PhysicalFont -sun/font/Font2D -sun/font/CompositeFont -java/util/HashMap$Values -java/util/HashMap$ValueIterator -java/util/HashMap$HashIterator -sun/font/FontManager$1 -sun/font/TrueTypeFont -java/awt/font/FontRenderContext -java/awt/RenderingHints -sun/awt/SunHints -sun/awt/SunHints$Key -java/awt/RenderingHints$Key -sun/awt/SunHints$Value -sun/awt/SunHints$LCDContrastKey -sun/font/Type1Font -java/awt/geom/Point2D$Float -sun/font/StrikeMetrics -java/awt/geom/Rectangle2D$Float -java/awt/geom/GeneralPath -java/awt/geom/Path2D$Float -java/awt/geom/Path2D -sun/font/CharToGlyphMapper -sun/font/PhysicalStrike -sun/font/FontStrike -sun/font/GlyphList -sun/font/StrikeCache -sun/java2d/Disposer -sun/java2d/Disposer$1 -sun/font/StrikeCache$1 -sun/font/FontManager$FontRegistrationInfo -sun/awt/windows/WFontConfiguration -sun/awt/FontConfiguration -sun/awt/FontDescriptor -java/io/DataInputStream -java/lang/Short$ShortCache -java/util/HashMap$KeyIterator -sun/font/CompositeFontDescriptor -sun/font/Font2DHandle -sun/font/FontFamily -java/awt/GraphicsDevice -sun/java2d/d3d/D3DGraphicsDevice -sun/awt/Win32GraphicsDevice -java/awt/Toolkit$2 -java/awt/Toolkit$DesktopPropertyChangeSupport -sun/awt/SunToolkit$ModalityListenerList -sun/awt/ModalityListener -sun/awt/SunToolkit$1 -java/util/MissingResourceException -java/awt/EventQueue -java/awt/Queue -sun/awt/PostEventQueue -sun/misc/PerformanceLogger -sun/misc/PerformanceLogger$TimeData -sun/awt/windows/WToolkit$ToolkitDisposer -sun/java2d/DisposerRecord -sun/awt/windows/WToolkit$2 -sun/awt/windows/WToolkit$3 -sun/java2d/d3d/D3DRenderQueue -sun/java2d/pipe/RenderQueue -sun/java2d/pipe/RenderBuffer -sun/java2d/d3d/D3DRenderQueue$1 -sun/java2d/d3d/D3DGraphicsDevice$1Result -sun/java2d/d3d/D3DGraphicsDevice$1 -sun/java2d/d3d/D3DContext$D3DContextCaps -sun/java2d/pipe/hw/ContextCapabilities -sun/java2d/d3d/D3DContext -sun/java2d/pipe/BufferedContext -sun/java2d/d3d/D3DGraphicsConfig -sun/java2d/pipe/hw/AccelGraphicsConfig -sun/java2d/pipe/hw/BufferedContextProvider -sun/awt/Win32GraphicsConfig -sun/java2d/d3d/D3DGraphicsConfig$D3DImageCaps -java/awt/BorderLayout -java/awt/LayoutManager2 -java/awt/Window$WindowDisposerRecord -java/awt/KeyboardFocusManager -java/awt/KeyEventDispatcher -java/awt/KeyEventPostProcessor -java/awt/event/NativeLibLoader -java/awt/AWTKeyStroke -java/awt/AWTKeyStroke$1 -java/util/LinkedList -java/util/Deque -java/util/Queue -java/util/AbstractSequentialList -java/util/LinkedList$Entry -java/awt/DefaultKeyboardFocusManager -java/awt/DefaultFocusTraversalPolicy -java/awt/ContainerOrderFocusTraversalPolicy -java/awt/FocusTraversalPolicy -java/awt/MutableBoolean -java/util/Collections$UnmodifiableSet -sun/awt/HeadlessToolkit -sun/awt/KeyboardFocusManagerPeerImpl -java/awt/peer/KeyboardFocusManagerPeer -sun/awt/windows/WFramePeer -java/awt/peer/FramePeer -sun/awt/RepaintArea -sun/awt/EmbeddedFrame -sun/awt/im/InputMethodWindow -sun/awt/windows/WComponentPeer$2 -sun/awt/PaintEventDispatcher -java/awt/event/InvocationEvent -java/awt/ActiveEvent -java/awt/MenuComponent -sun/awt/EventQueueItem -sun/awt/SunToolkit$3 -java/util/EmptyStackException -java/lang/reflect/InvocationTargetException -java/awt/event/PaintEvent -java/awt/EventDispatchThread -sun/awt/PeerEvent -java/awt/EventQueue$1 -sun/java2d/ScreenUpdateManager -java/awt/EventDispatchThread$1 -sun/java2d/d3d/D3DScreenUpdateManager$1 -sun/awt/EventQueueDelegate -java/awt/EventFilter$FilterAction -com/sun/awt/AWTUtilities -sun/java2d/d3d/D3DSurfaceData -sun/java2d/d3d/D3DDrawImage -sun/java2d/d3d/D3DTextRenderer -java/awt/event/ActionEvent -sun/java2d/d3d/D3DRenderer -sun/java2d/pipe/BufferedRenderPipe -sun/java2d/pipe/ParallelogramPipe -sun/java2d/pipe/BufferedRenderPipe$AAParallelogramPipe -sun/java2d/pipe/BufferedRenderPipe$BufferedDrawHandler -sun/java2d/loops/ProcessPath$DrawHandler -sun/java2d/loops/GraphicsPrimitive -sun/java2d/pipe/PixelToParallelogramConverter -sun/java2d/d3d/D3DBlitLoops -sun/java2d/d3d/D3DSwToSurfaceBlit -sun/java2d/loops/Blit -sun/java2d/loops/GraphicsPrimitiveMgr -sun/java2d/loops/CompositeType -sun/java2d/SunGraphics2D -sun/awt/ConstrainableGraphics -java/awt/Graphics2D -java/awt/Graphics -sun/java2d/loops/XORComposite -java/awt/Composite -java/awt/AlphaComposite -sun/java2d/loops/BlitBg -sun/java2d/loops/ScaledBlit -sun/java2d/loops/FillRect -sun/java2d/loops/FillSpans -sun/java2d/loops/DrawLine -sun/java2d/loops/DrawRect -sun/java2d/loops/DrawPolygons -sun/java2d/loops/DrawPath -sun/java2d/loops/FillPath -sun/java2d/loops/MaskBlit -sun/java2d/loops/MaskFill -sun/java2d/loops/DrawGlyphList -sun/java2d/loops/DrawGlyphListAA -sun/java2d/loops/DrawGlyphListLCD -sun/java2d/loops/TransformHelper -java/awt/BasicStroke -java/awt/Stroke -sun/java2d/pipe/ValidatePipe -sun/java2d/loops/CustomComponent -sun/java2d/loops/GraphicsPrimitiveProxy -sun/java2d/loops/GeneralRenderer -sun/java2d/loops/GraphicsPrimitiveMgr$1 -sun/java2d/loops/GraphicsPrimitiveMgr$2 -sun/java2d/d3d/D3DSwToTextureBlit -sun/java2d/d3d/D3DSurfaceToGDIWindowSurfaceBlit -sun/java2d/windows/GDIWindowSurfaceData -sun/java2d/windows/GDIBlitLoops -sun/java2d/windows/GDIRenderer -sun/java2d/d3d/D3DSurfaceToGDIWindowSurfaceScale -sun/java2d/d3d/D3DSurfaceToGDIWindowSurfaceTransform -sun/java2d/loops/TransformBlit -sun/java2d/d3d/D3DSurfaceToSurfaceBlit -sun/java2d/d3d/D3DSurfaceToSurfaceScale -sun/java2d/d3d/D3DSurfaceToSurfaceTransform -sun/java2d/d3d/D3DRTTSurfaceToSurfaceBlit -sun/java2d/d3d/D3DRTTSurfaceToSurfaceScale -sun/java2d/d3d/D3DRTTSurfaceToSurfaceTransform -sun/java2d/d3d/D3DSurfaceToSwBlit -sun/java2d/d3d/D3DGeneralBlit -sun/java2d/d3d/D3DSwToSurfaceScale -sun/java2d/d3d/D3DSwToSurfaceTransform -sun/java2d/d3d/D3DTextureToSurfaceBlit -sun/java2d/d3d/D3DTextureToSurfaceScale -sun/java2d/d3d/D3DTextureToSurfaceTransform -sun/java2d/d3d/D3DMaskFill -sun/java2d/pipe/BufferedMaskFill -sun/java2d/d3d/D3DMaskBlit -sun/java2d/pipe/BufferedMaskBlit -sun/java2d/d3d/D3DSurfaceData$D3DWindowSurfaceData -sun/java2d/pipe/hw/ExtendedBufferCapabilities$VSyncType -sun/java2d/DefaultDisposerRecord -sun/security/action/GetBooleanAction -sun/java2d/d3d/D3DScreenUpdateManager$2 -sun/awt/windows/WColor -sun/awt/windows/WFontPeer -sun/awt/PlatformFont -java/awt/peer/FontPeer -sun/awt/FontConfiguration$1 -sun/awt/windows/WingDings -sun/awt/windows/WingDings$Encoder -sun/awt/Symbol -sun/awt/Symbol$Encoder -sun/awt/im/InputMethodManager -sun/awt/im/ExecutableInputMethodManager -sun/awt/windows/WInputMethodDescriptor -java/awt/im/spi/InputMethodDescriptor -sun/awt/im/InputMethodLocator -sun/awt/im/ExecutableInputMethodManager$3 -sun/misc/Service -sun/misc/Service$LazyIterator -java/util/TreeSet -java/util/NavigableSet -java/util/SortedSet -java/util/TreeMap -java/util/NavigableMap -java/util/SortedMap -sun/misc/Launcher$1 -sun/misc/Launcher$2 -sun/misc/URLClassPath$2 -java/lang/ClassLoader$2 -sun/misc/URLClassPath$1 -java/net/URLClassLoader$3 -sun/misc/CompoundEnumeration -sun/misc/URLClassPath$JarLoader$1 -sun/misc/FileURLMapper -java/net/URLClassLoader$3$1 -sun/awt/SunToolkit$2 -sun/reflect/UnsafeObjectFieldAccessorImpl -java/awt/peer/LightweightPeer -sun/awt/windows/WLabelPeer -java/awt/peer/LabelPeer -sun/java2d/loops/RenderLoops -sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec -sun/awt/windows/WFileDialogPeer -java/awt/peer/FileDialogPeer -java/awt/peer/DialogPeer -sun/awt/windows/WPrintDialogPeer -sun/awt/dnd/SunDropTargetEvent -java/awt/PopupMenu -java/awt/event/FocusEvent -java/awt/Menu -java/awt/MenuItem -java/io/PrintWriter -sun/awt/CausedFocusEvent$Cause -java/awt/PointerInfo -java/awt/image/ImageProducer -javax/accessibility/AccessibleStateSet -java/awt/Component$BaselineResizeBehavior -java/awt/FontMetrics -java/awt/im/InputMethodRequests -java/awt/event/HierarchyEvent -java/awt/SequencedEvent -sun/awt/windows/WGlobalCursorManager -sun/awt/PlatformFont$PlatformFontCache -sun/nio/cs/Unicode -sun/nio/cs/UTF_16LE$Encoder -sun/nio/cs/UnicodeEncoder -sun/nio/cs/UTF_16LE$Decoder -sun/nio/cs/UnicodeDecoder -sun/awt/event/IgnorePaintEvent -java/awt/KeyboardFocusManager$HeavyweightFocusRequest -java/util/LinkedList$ListItr -java/util/ListIterator -java/awt/DefaultKeyboardFocusManager$TypeAheadMarker -java/awt/KeyboardFocusManager$LightweightFocusRequest -sun/reflect/MethodAccessorGenerator -sun/reflect/AccessorGenerator -sun/reflect/ClassFileConstants -sun/reflect/ByteVectorFactory -sun/reflect/ByteVectorImpl -sun/reflect/ByteVector -sun/reflect/ClassFileAssembler -sun/reflect/UTF8 -java/lang/Void -sun/reflect/Label -sun/reflect/Label$PatchInfo -sun/reflect/MethodAccessorGenerator$1 -sun/reflect/ClassDefiner -sun/reflect/ClassDefiner$1 -sun/java2d/pipe/hw/AccelDeviceEventNotifier -javax/swing/JFrame -javax/swing/WindowConstants -javax/swing/RootPaneContainer -javax/swing/TransferHandler$HasGetTransferHandler -javax/swing/JLabel -javax/swing/SwingConstants -javax/swing/JComponent -javax/swing/JComponent$1 -javax/swing/SwingUtilities -javax/swing/JRootPane -javax/swing/event/EventListenerList -javax/swing/JPanel -java/awt/FlowLayout -javax/swing/UIManager -javax/swing/UIManager$LookAndFeelInfo -sun/awt/shell/Win32ShellFolderManager2 -sun/awt/shell/ShellFolderManager -sun/awt/windows/WDesktopProperties -sun/awt/windows/ThemeReader -java/util/concurrent/locks/ReentrantReadWriteLock -java/util/concurrent/locks/ReadWriteLock -java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync -java/util/concurrent/locks/ReentrantReadWriteLock$Sync -java/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter -java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock -java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock -sun/awt/windows/WDesktopProperties$WinPlaySound -java/util/HashMap$EntrySet -java/util/HashMap$EntryIterator -java/awt/Toolkit$DesktopPropertyChangeSupport$1 -java/util/Collections$SynchronizedCollection -java/util/IdentityHashMap$Values -java/util/IdentityHashMap$ValueIterator -sun/swing/SwingUtilities2 -sun/swing/SwingUtilities2$LSBCacheEntry -javax/swing/UIManager$LAFState -javax/swing/UIDefaults -javax/swing/MultiUIDefaults -javax/swing/UIManager$1 -javax/swing/plaf/metal/MetalLookAndFeel -javax/swing/plaf/basic/BasicLookAndFeel -javax/swing/LookAndFeel -sun/swing/DefaultLookup -javax/swing/plaf/metal/OceanTheme -javax/swing/plaf/metal/DefaultMetalTheme -javax/swing/plaf/metal/MetalTheme -javax/swing/plaf/ColorUIResource -javax/swing/plaf/UIResource -sun/swing/PrintColorUIResource -javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate -javax/swing/plaf/FontUIResource -sun/swing/SwingLazyValue -javax/swing/UIDefaults$LazyValue -javax/swing/UIDefaults$ActiveValue -javax/swing/plaf/InsetsUIResource -sun/swing/SwingUtilities2$2 -javax/swing/plaf/basic/BasicLookAndFeel$2 -javax/swing/plaf/DimensionUIResource -javax/swing/UIDefaults$LazyInputMap -java/lang/Character$CharacterCache -javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue -javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue -sun/swing/SwingUtilities2$AATextInfo -javax/swing/plaf/metal/MetalLookAndFeel$AATextListener -java/beans/PropertyChangeListenerProxy -java/util/EventListenerProxy -sun/awt/EventListenerAggregate -javax/swing/UIDefaults$ProxyLazyValue -javax/swing/plaf/metal/OceanTheme$1 -javax/swing/plaf/metal/OceanTheme$2 -javax/swing/plaf/metal/OceanTheme$3 -javax/swing/plaf/metal/OceanTheme$4 -javax/swing/plaf/metal/OceanTheme$5 -javax/swing/plaf/metal/OceanTheme$6 -javax/swing/FocusManager -javax/swing/LayoutFocusTraversalPolicy -javax/swing/SortingFocusTraversalPolicy -javax/swing/InternalFrameFocusTraversalPolicy -javax/swing/SwingContainerOrderFocusTraversalPolicy -javax/swing/SwingDefaultFocusTraversalPolicy -javax/swing/LayoutComparator -javax/swing/RepaintManager -javax/swing/RepaintManager$DisplayChangedHandler -javax/swing/SwingPaintEventDispatcher -javax/swing/UIManager$2 -javax/swing/UIManager$3 -java/awt/event/InputMethodEvent -com/sun/swing/internal/plaf/metal/resources/metal -sun/util/ResourceBundleEnumeration -com/sun/swing/internal/plaf/basic/resources/basic -javax/swing/plaf/basic/BasicPanelUI -javax/swing/plaf/PanelUI -javax/swing/plaf/ComponentUI -sun/reflect/misc/MethodUtil -sun/reflect/misc/MethodUtil$1 -sun/awt/AppContext$PostShutdownEventRunnable -sun/awt/AWTAutoShutdown$1 -java/util/jar/JarFile -java/util/zip/ZipFile -java/util/zip/ZipConstants -java/util/jar/JavaUtilJarAccessImpl -sun/misc/JavaUtilJarAccess -sun/misc/JarIndex -java/util/zip/ZipEntry -java/util/jar/JarFile$JarFileEntry -java/util/jar/JarEntry -sun/misc/URLClassPath$JarLoader$2 -sun/net/www/protocol/jar/JarURLConnection -java/net/JarURLConnection -sun/net/www/protocol/jar/JarFileFactory -sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController -java/net/HttpURLConnection -sun/net/www/protocol/jar/URLJarFile -sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry -sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream -java/util/zip/ZipFile$ZipFileInputStream -java/security/AllPermissionCollection -java/lang/IllegalAccessException -com/sun/java/swing/SwingUtilities3 -javax/swing/JPasswordField -javax/swing/JTextField -javax/swing/text/JTextComponent -javax/swing/Scrollable -javax/swing/JLayeredPane -javax/swing/JRootPane$1 -javax/swing/ArrayTable -javax/swing/JInternalFrame -javax/swing/JRootPane$RootLayout -javax/swing/BufferStrategyPaintManager -javax/swing/RepaintManager$PaintManager -javax/swing/plaf/metal/MetalRootPaneUI -javax/swing/plaf/basic/BasicRootPaneUI -javax/swing/plaf/RootPaneUI -javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap -javax/swing/plaf/ComponentInputMapUIResource -javax/swing/ComponentInputMap -javax/swing/InputMap -javax/swing/plaf/InputMapUIResource -javax/swing/KeyStroke -java/awt/VKCollection -sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl -javax/swing/plaf/basic/LazyActionMap -javax/swing/plaf/ActionMapUIResource -javax/swing/ActionMap -javax/swing/plaf/metal/MetalLabelUI -javax/swing/plaf/basic/BasicLabelUI -javax/swing/plaf/LabelUI -javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1 -javax/swing/plaf/basic/BasicHTML -javax/swing/SystemEventQueueUtilities -javax/swing/SystemEventQueueUtilities$ComponentWorkRequest -java/awt/Conditional -sun/java2d/d3d/D3DScreenUpdateManager -sun/java2d/d3d/D3DScreenUpdateManager$1$1 -java/awt/EventDispatchThread$HierarchyEventFilter -sun/awt/windows/WEmbeddedFrame -sun/awt/dnd/SunDragSourceContextPeer -sun/java2d/pipe/hw/AccelSurface -sun/java2d/pipe/BufferedTextPipe -javax/swing/SystemEventQueueUtilities$SystemEventQueue -sun/awt/NullComponentPeer -sun/awt/GlobalCursorManager$NativeUpdater -java/awt/SentEvent -java/util/jar/Manifest -java/io/ByteArrayInputStream -java/util/jar/Attributes -java/util/jar/Manifest$FastInputStream -sun/nio/cs/UTF_8 -sun/nio/cs/UTF_8$Decoder -sun/nio/cs/Surrogate$Generator -java/util/jar/Attributes$Name -sun/misc/ASCIICaseInsensitiveComparator -java/util/jar/JarVerifier -java/io/ByteArrayOutputStream -sun/misc/ExtensionDependency -java/lang/Package -sun/security/util/ManifestEntryVerifier -sun/security/provider/Sun -java/security/Provider -java/security/Provider$ServiceKey -java/security/Provider$EngineDescription -sun/security/provider/Sun$1 -java/security/Security -java/security/Security$1 -sun/misc/FloatingDecimal -sun/misc/FloatingDecimal$1 -java/util/regex/Pattern -java/util/regex/Pattern$5 -java/util/regex/Pattern$Node -java/util/regex/Pattern$LastNode -java/util/regex/Pattern$GroupHead -java/util/regex/Pattern$GroupTail -java/util/regex/Pattern$BitClass -java/util/regex/Pattern$BmpCharProperty -java/util/regex/Pattern$CharProperty -java/util/regex/Pattern$Ques -java/util/regex/Pattern$BranchConn -java/util/regex/Pattern$Branch -java/util/regex/Pattern$Single -java/util/regex/Pattern$CharPropertyNames -java/util/regex/Pattern$CharPropertyNames$1 -java/util/regex/Pattern$CharPropertyNames$CharPropertyFactory -java/util/regex/Pattern$CharPropertyNames$2 -java/util/regex/Pattern$CharPropertyNames$5 -java/util/regex/Pattern$CharPropertyNames$3 -java/util/regex/Pattern$CharPropertyNames$6 -java/util/regex/Pattern$CharPropertyNames$CloneableProperty -java/util/regex/Pattern$CharPropertyNames$4 -java/util/regex/Pattern$CharPropertyNames$7 -java/util/regex/Pattern$CharPropertyNames$8 -java/util/regex/Pattern$CharPropertyNames$9 -java/util/regex/Pattern$CharPropertyNames$10 -java/util/regex/Pattern$CharPropertyNames$11 -java/util/regex/Pattern$CharPropertyNames$12 -java/util/regex/Pattern$CharPropertyNames$13 -java/util/regex/Pattern$CharPropertyNames$14 -java/util/regex/Pattern$CharPropertyNames$15 -java/util/regex/Pattern$CharPropertyNames$16 -java/util/regex/Pattern$CharPropertyNames$17 -java/util/regex/Pattern$CharPropertyNames$18 -java/util/regex/Pattern$CharPropertyNames$19 -java/util/regex/Pattern$CharPropertyNames$20 -java/util/regex/Pattern$CharPropertyNames$21 -java/util/regex/Pattern$Ctype -java/util/regex/Pattern$Curly -java/util/regex/Pattern$2 -java/util/regex/Pattern$Slice -java/util/regex/Pattern$SliceNode -java/util/regex/Pattern$Begin -java/util/regex/Pattern$First -java/util/regex/Pattern$Start -java/util/regex/Pattern$TreeInfo -java/lang/StrictMath -sun/security/provider/NativePRNG -sun/misc/BASE64Decoder -sun/misc/CharacterDecoder -sun/security/util/SignatureFileVerifier -java/awt/event/KeyAdapter -java/lang/NumberFormatException -java/lang/IllegalArgumentException -java/io/FileWriter -java/net/Authenticator -java/net/MalformedURLException -javax/swing/text/Element -javax/swing/text/Document -javax/swing/text/PlainDocument -javax/swing/text/AbstractDocument -javax/swing/text/GapContent -javax/swing/text/AbstractDocument$Content -javax/swing/text/GapVector -javax/swing/text/GapContent$MarkVector -javax/swing/text/GapContent$MarkData -javax/swing/text/StyleContext -javax/swing/text/AbstractDocument$AttributeContext -javax/swing/text/StyleConstants -javax/swing/text/StyleConstants$CharacterConstants -javax/swing/text/AttributeSet$CharacterAttribute -javax/swing/text/StyleConstants$FontConstants -javax/swing/text/AttributeSet$FontAttribute -javax/swing/text/StyleConstants$ColorConstants -javax/swing/text/AttributeSet$ColorAttribute -javax/swing/text/StyleConstants$ParagraphConstants -javax/swing/text/AttributeSet$ParagraphAttribute -javax/swing/text/StyleContext$FontKey -javax/swing/text/SimpleAttributeSet -javax/swing/text/MutableAttributeSet -javax/swing/text/AttributeSet -javax/swing/text/SimpleAttributeSet$EmptyAttributeSet -javax/swing/text/StyleContext$NamedStyle -javax/swing/text/Style -javax/swing/text/SimpleAttributeSet$1 -javax/swing/text/StyleContext$SmallAttributeSet -javax/swing/text/AbstractDocument$BidiRootElement -javax/swing/text/AbstractDocument$BranchElement -javax/swing/text/AbstractDocument$AbstractElement -javax/swing/tree/TreeNode -javax/swing/text/AbstractDocument$1 -javax/swing/text/AbstractDocument$BidiElement -javax/swing/text/AbstractDocument$LeafElement -javax/swing/text/GapContent$StickyPosition -javax/swing/text/Position -javax/swing/text/StyleContext$KeyEnumeration -javax/swing/text/GapContent$InsertUndo -javax/swing/undo/AbstractUndoableEdit -javax/swing/undo/UndoableEdit -javax/swing/text/AbstractDocument$DefaultDocumentEvent -javax/swing/event/DocumentEvent -javax/swing/undo/CompoundEdit -javax/swing/event/DocumentEvent$EventType -javax/swing/text/Segment -java/text/CharacterIterator -javax/swing/text/Utilities -javax/swing/text/SegmentCache -javax/swing/text/SegmentCache$CachedSegment -javax/swing/event/UndoableEditEvent -javax/swing/text/AbstractDocument$ElementEdit -javax/swing/event/DocumentEvent$ElementChange -sun/misc/Cleaner -javax/swing/JMenu -javax/swing/MenuElement -javax/swing/JMenuItem -javax/swing/AbstractButton -java/awt/ItemSelectable -javax/swing/event/MenuListener -javax/swing/JCheckBoxMenuItem -javax/swing/Icon -javax/swing/JButton -java/net/URLClassLoader$2 -javax/swing/ImageIcon -javax/swing/ImageIcon$1 -javax/swing/ImageIcon$2 -java/awt/MediaTracker -sun/misc/SoftCache$ValueCell -sun/awt/image/URLImageSource -sun/awt/image/InputStreamImageSource -sun/awt/image/ImageFetchable -sun/awt/image/ToolkitImage -sun/awt/image/NativeLibLoader -javax/swing/ImageIcon$3 -java/awt/ImageMediaEntry -java/awt/MediaEntry -sun/awt/image/ImageRepresentation -java/awt/image/ImageConsumer -sun/awt/image/ImageWatched -sun/awt/image/ImageWatched$Link -sun/awt/image/ImageWatched$WeakLink -sun/awt/image/ImageConsumerQueue -sun/awt/image/ImageFetcher -sun/awt/image/FetcherInfo -sun/awt/image/ImageFetcher$1 -sun/awt/image/GifImageDecoder -sun/awt/image/ImageDecoder -sun/awt/image/GifFrame -java/awt/image/Raster -java/awt/image/DataBufferByte -java/awt/image/DataBuffer -java/awt/image/PixelInterleavedSampleModel -java/awt/image/ComponentSampleModel -java/awt/image/SampleModel -sun/awt/image/ByteInterleavedRaster -sun/awt/image/ByteComponentRaster -sun/awt/image/SunWritableRaster -java/awt/image/WritableRaster -sun/awt/image/IntegerComponentRaster -sun/awt/image/BytePackedRaster -java/awt/Canvas -sun/font/FontDesignMetrics -sun/font/FontStrikeDesc -sun/font/CompositeStrike -sun/font/FontStrikeDisposer -sun/font/StrikeCache$SoftDisposerRef -sun/font/StrikeCache$DisposableStrike -sun/font/TrueTypeFont$TTDisposerRecord -sun/font/TrueTypeFont$1 -java/io/RandomAccessFile -sun/nio/ch/FileChannelImpl -java/nio/channels/FileChannel -java/nio/channels/ByteChannel -java/nio/channels/ReadableByteChannel -java/nio/channels/Channel -java/nio/channels/WritableByteChannel -java/nio/channels/GatheringByteChannel -java/nio/channels/ScatteringByteChannel -java/nio/channels/spi/AbstractInterruptibleChannel -java/nio/channels/InterruptibleChannel -sun/nio/ch/Util -sun/nio/ch/IOUtil -sun/nio/ch/FileDispatcher -sun/nio/ch/NativeDispatcher -sun/nio/ch/Reflect -java/nio/MappedByteBuffer -sun/nio/ch/Reflect$1 -sun/nio/ch/NativeThreadSet -java/nio/channels/spi/AbstractInterruptibleChannel$1 -sun/nio/ch/Interruptible -sun/nio/ch/NativeThread -sun/nio/ch/IOStatus -sun/nio/ch/DirectBuffer -java/nio/DirectByteBuffer -java/nio/DirectByteBuffer$Deallocator -java/nio/ByteBufferAsIntBufferB -java/nio/IntBuffer -sun/font/TrueTypeFont$DirectoryEntry -java/nio/ByteBufferAsShortBufferB -java/nio/ShortBuffer -sun/nio/cs/UTF_16 -sun/nio/cs/UTF_16$Decoder -sun/font/FileFontStrike -sun/font/FileFont$FileFontDisposer -sun/font/TrueTypeGlyphMapper -sun/font/CMap -sun/font/CMap$NullCMapClass -sun/font/CMap$CMapFormat4 -java/nio/ByteBufferAsCharBufferB -sun/font/FontDesignMetrics$KeyReference -sun/awt/image/PNGImageDecoder -sun/awt/image/PNGFilterInputStream -java/util/zip/InflaterInputStream -java/util/zip/Inflater -java/awt/dnd/peer/DragSourceContextPeer -javax/swing/Popup$HeavyWeightWindow -sun/awt/ModalExclude -javax/swing/JWindow -com/sun/java/swing/plaf/windows/WindowsPopupWindow -sun/awt/GlobalCursorManager -sun/java2d/d3d/D3DSurfaceData$1Status -sun/java2d/d3d/D3DSurfaceData$1 -sun/java2d/loops/SetDrawLineANY -sun/java2d/loops/SetFillRectANY -sun/java2d/loops/SetDrawRectANY -sun/java2d/loops/SetDrawPolygonsANY -sun/java2d/loops/SetDrawPathANY -sun/java2d/loops/SetFillPathANY -sun/java2d/loops/SetFillSpansANY -sun/java2d/loops/DrawGlyphList$General -sun/java2d/loops/DrawGlyphListAA$General -sun/java2d/pipe/BufferedPaints -sun/java2d/d3d/D3DScreenUpdateManager$3 -java/awt/image/DataBufferInt -java/awt/image/SinglePixelPackedSampleModel -sun/awt/image/IntegerInterleavedRaster -sun/awt/image/OffScreenImage -sun/java2d/SurfaceManagerFactory -sun/java2d/d3d/D3DCachingSurfaceManager -sun/awt/image/CachingSurfaceManager -sun/awt/image/RasterListener -sun/awt/image/BufImgSurfaceData -sun/font/CompositeGlyphMapper -sun/java2d/loops/FontInfo -java/util/Date -sun/util/calendar/CalendarSystem -sun/util/calendar/Gregorian -sun/util/calendar/BaseCalendar -sun/util/calendar/AbstractCalendar -java/util/TimeZone -java/lang/InheritableThreadLocal -sun/util/calendar/ZoneInfo -sun/util/calendar/ZoneInfoFile -sun/util/calendar/ZoneInfoFile$1 -java/util/TimeZone$1 -sun/util/calendar/Gregorian$Date -sun/util/calendar/BaseCalendar$Date -sun/util/calendar/CalendarDate -sun/util/calendar/CalendarUtils -java/util/TimeZone$DisplayNames -sun/util/TimeZoneNameUtility -sun/util/resources/LocaleData -sun/util/resources/LocaleData$1 -sun/util/resources/LocaleData$LocaleDataResourceBundleControl -sun/util/LocaleDataMetaInfo -sun/util/resources/TimeZoneNames -sun/util/resources/TimeZoneNamesBundle -sun/util/resources/OpenListResourceBundle -java/util/ResourceBundle$BundleReference -sun/util/resources/TimeZoneNames_en -java/util/spi/TimeZoneNameProvider -java/util/spi/LocaleServiceProvider -sun/util/LocaleServiceProviderPool -sun/util/LocaleServiceProviderPool$1 -java/util/ServiceLoader -java/util/ServiceLoader$LazyIterator -java/util/ServiceLoader$1 -java/util/LinkedHashMap$EntryIterator -java/net/ServerSocket -java/net/InetAddress -java/net/InetAddress$Cache -java/net/InetAddress$Cache$Type -java/net/InetAddressImplFactory -java/net/Inet4AddressImpl -java/net/InetAddressImpl -java/net/InetAddress$1 -sun/net/spi/nameservice/NameService -sun/net/util/IPAddressUtil -java/util/regex/Matcher -java/util/regex/MatchResult -java/util/RandomAccessSubList -java/util/SubList -java/util/SubList$1 -java/util/AbstractList$ListItr -java/net/Inet4Address -java/net/SocksSocketImpl -java/net/SocksConsts -java/net/PlainSocketImpl -java/net/SocketImpl -java/net/SocketOptions -java/net/InetSocketAddress -java/net/SocketAddress -java/util/Random -java/util/concurrent/atomic/AtomicLong -java/lang/InternalError -java/io/StringReader -java/io/FilterReader -java/lang/reflect/Proxy -java/lang/reflect/InvocationHandler -java/lang/NoSuchFieldException -java/lang/InstantiationException -java/lang/ArrayIndexOutOfBoundsException -java/lang/IndexOutOfBoundsException -javax/swing/JDialog -java/io/EOFException -java/util/Vector$1 -javax/swing/filechooser/FileSystemView -javax/swing/filechooser/FileSystemView$1 -javax/swing/event/SwingPropertyChangeSupport -javax/swing/filechooser/WindowsFileSystemView -java/util/zip/ZipFile$1 -java/util/zip/ZipFile$2 -java/util/jar/JarFile$1 -java/util/PropertyResourceBundle -java/util/ResourceBundle$Control$1 -java/util/Hashtable$EntrySet -java/util/Collections$SynchronizedSet -java/lang/IllegalAccessError -java/text/MessageFormat -java/text/Format -java/text/FieldPosition -java/text/MessageFormat$Field -java/text/Format$Field -java/lang/CloneNotSupportedException -sun/reflect/BootstrapConstructorAccessorImpl -java/awt/event/ActionListener -javax/swing/Timer -javax/swing/Timer$DoPostEvent -javax/swing/TimerQueue -javax/swing/TimerQueue$1 -javax/swing/ToolTipManager -java/awt/event/MouseAdapter -javax/swing/ToolTipManager$insideTimerAction -javax/swing/ToolTipManager$outsideTimerAction -javax/swing/ToolTipManager$stillInsideTimerAction -javax/swing/ToolTipManager$Actions -sun/swing/UIAction -javax/swing/Action -javax/swing/ToolTipManager$MoveBeforeEnterListener -java/awt/event/MouseMotionAdapter -java/util/Hashtable$ValueCollection -javax/swing/event/CaretListener -javax/swing/JToolBar -javax/swing/JSplitPane -javax/swing/border/Border -javax/swing/JToggleButton -javax/swing/border/EmptyBorder -javax/swing/border/AbstractBorder -javax/swing/DefaultButtonModel -javax/swing/ButtonModel -javax/swing/AbstractButton$Handler -javax/swing/event/ChangeListener -java/awt/event/ItemListener -javax/swing/plaf/metal/MetalButtonUI -javax/swing/plaf/basic/BasicButtonUI -javax/swing/plaf/ButtonUI -javax/swing/plaf/metal/MetalBorders -javax/swing/plaf/BorderUIResource$CompoundBorderUIResource -javax/swing/border/CompoundBorder -javax/swing/plaf/metal/MetalBorders$ButtonBorder -javax/swing/plaf/basic/BasicBorders$MarginBorder -javax/swing/plaf/basic/BasicButtonListener -java/awt/AWTEventMulticaster -java/awt/event/AdjustmentListener -java/awt/event/TextListener -javax/swing/event/AncestorListener -java/beans/VetoableChangeListener -javax/swing/ButtonGroup -javax/swing/JToggleButton$ToggleButtonModel -javax/swing/plaf/metal/MetalToggleButtonUI -javax/swing/plaf/basic/BasicToggleButtonUI -javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder -java/awt/CardLayout -javax/swing/Box -javax/swing/plaf/metal/MetalBorders$TextFieldBorder -javax/swing/plaf/metal/MetalBorders$Flush3DBorder -javax/swing/BoxLayout -javax/swing/JMenuBar -javax/swing/DefaultSingleSelectionModel -javax/swing/SingleSelectionModel -javax/swing/plaf/basic/BasicMenuBarUI -javax/swing/plaf/MenuBarUI -javax/swing/plaf/basic/DefaultMenuLayout -javax/swing/plaf/metal/MetalBorders$MenuBarBorder -javax/swing/plaf/basic/BasicMenuBarUI$Handler -javax/swing/KeyboardManager -javax/swing/event/MenuEvent -javax/swing/JMenu$MenuChangeListener -javax/swing/JMenuItem$MenuItemFocusListener -javax/swing/plaf/basic/BasicMenuUI -javax/swing/plaf/basic/BasicMenuItemUI -javax/swing/plaf/MenuItemUI -javax/swing/plaf/metal/MetalBorders$MenuItemBorder -javax/swing/plaf/metal/MetalIconFactory -javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon -javax/swing/plaf/basic/BasicMenuUI$Handler -javax/swing/event/MenuKeyListener -javax/swing/plaf/basic/BasicMenuItemUI$Handler -javax/swing/event/MenuDragMouseListener -javax/swing/event/MouseInputListener -javax/swing/event/ChangeEvent -java/awt/event/ContainerEvent -javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon -javax/swing/JPopupMenu -javax/swing/plaf/basic/BasicPopupMenuUI -javax/swing/plaf/PopupMenuUI -javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper -java/awt/event/AWTEventListenerProxy -java/awt/Toolkit$SelectiveAWTEventListener -java/awt/Toolkit$ToolkitEventMulticaster -javax/swing/plaf/basic/BasicLookAndFeel$1 -javax/swing/plaf/metal/MetalBorders$PopupMenuBorder -javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener -javax/swing/event/PopupMenuListener -javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener -javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber -javax/swing/MenuSelectionManager -javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper -javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1 -java/awt/event/FocusAdapter -javax/swing/JMenu$WinListener -java/awt/event/WindowAdapter -javax/swing/JPopupMenu$Separator -javax/swing/JSeparator -javax/swing/plaf/metal/MetalPopupMenuSeparatorUI -javax/swing/plaf/metal/MetalSeparatorUI -javax/swing/plaf/basic/BasicSeparatorUI -javax/swing/plaf/SeparatorUI -javax/swing/JComboBox -javax/swing/event/ListDataListener -javax/swing/event/CaretEvent -javax/swing/text/TabExpander -javax/swing/JScrollBar -java/awt/Adjustable -javax/swing/event/MouseInputAdapter -javax/swing/JScrollBar$ModelListener -javax/swing/DefaultBoundedRangeModel -javax/swing/BoundedRangeModel -javax/swing/plaf/metal/MetalScrollBarUI -javax/swing/plaf/basic/BasicScrollBarUI -javax/swing/plaf/ScrollBarUI -javax/swing/plaf/metal/MetalBumps -javax/swing/plaf/metal/MetalScrollButton -javax/swing/plaf/basic/BasicArrowButton -javax/swing/plaf/basic/BasicScrollBarUI$TrackListener -javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener -javax/swing/plaf/basic/BasicScrollBarUI$ModelListener -javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener -javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler -javax/swing/plaf/basic/BasicScrollBarUI$Handler -javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener -javax/swing/CellRendererPane -javax/swing/border/MatteBorder -sun/font/StandardGlyphVector -java/awt/font/GlyphVector -sun/font/StandardGlyphVector$GlyphStrike -sun/font/CoreMetrics -sun/font/FontLineMetrics -java/awt/font/LineMetrics -javax/swing/ComboBoxModel -javax/swing/ListModel -javax/swing/ListCellRenderer -javax/swing/DefaultComboBoxModel -javax/swing/MutableComboBoxModel -javax/swing/AbstractListModel -javax/swing/JComboBox$1 -javax/swing/AncestorNotifier -javax/swing/plaf/metal/MetalComboBoxUI -javax/swing/plaf/basic/BasicComboBoxUI -javax/swing/plaf/ComboBoxUI -javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager -javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager -javax/swing/plaf/basic/BasicComboPopup -javax/swing/plaf/basic/ComboPopup -javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass -javax/swing/border/LineBorder -javax/swing/plaf/basic/BasicComboPopup$1 -javax/swing/JList -javax/swing/DropMode -javax/swing/DefaultListSelectionModel -javax/swing/ListSelectionModel -javax/swing/plaf/basic/BasicListUI -javax/swing/plaf/ListUI -javax/swing/plaf/basic/BasicListUI$ListTransferHandler -javax/swing/TransferHandler -javax/swing/TransferHandler$TransferAction -javax/swing/DefaultListCellRenderer$UIResource -javax/swing/DefaultListCellRenderer -javax/swing/TransferHandler$SwingDropTarget -java/awt/dnd/DropTargetContext -java/awt/datatransfer/SystemFlavorMap -java/awt/datatransfer/FlavorMap -java/awt/datatransfer/FlavorTable -javax/swing/TransferHandler$DropHandler -javax/swing/TransferHandler$TransferSupport -javax/swing/plaf/basic/BasicListUI$Handler -javax/swing/event/ListSelectionListener -javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag -javax/swing/plaf/basic/BasicComboPopup$Handler -javax/swing/JScrollPane -javax/swing/ScrollPaneConstants -javax/swing/ScrollPaneLayout$UIResource -javax/swing/ScrollPaneLayout -javax/swing/JViewport -javax/swing/ViewportLayout -javax/swing/plaf/basic/BasicViewportUI -javax/swing/plaf/ViewportUI -javax/swing/JScrollPane$ScrollBar -javax/swing/JViewport$ViewListener -java/awt/event/ComponentAdapter -javax/swing/plaf/metal/MetalScrollPaneUI -javax/swing/plaf/basic/BasicScrollPaneUI -javax/swing/plaf/ScrollPaneUI -javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder -javax/swing/plaf/basic/BasicScrollPaneUI$Handler -javax/swing/plaf/metal/MetalScrollPaneUI$1 -javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource -javax/swing/plaf/basic/BasicComboBoxRenderer -javax/swing/plaf/metal/MetalComboBoxEditor$UIResource -javax/swing/plaf/metal/MetalComboBoxEditor -javax/swing/plaf/basic/BasicComboBoxEditor -javax/swing/ComboBoxEditor -javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField -javax/swing/JTextField$NotifyAction -javax/swing/text/TextAction -javax/swing/AbstractAction -javax/swing/text/JTextComponent$MutableCaretEvent -javax/swing/plaf/metal/MetalTextFieldUI -javax/swing/plaf/basic/BasicTextFieldUI -javax/swing/plaf/basic/BasicTextUI -javax/swing/text/ViewFactory -javax/swing/plaf/TextUI -javax/swing/plaf/basic/BasicTextUI$BasicCursor -javax/swing/text/DefaultEditorKit -javax/swing/text/EditorKit -javax/swing/text/DefaultEditorKit$InsertContentAction -javax/swing/text/DefaultEditorKit$DeletePrevCharAction -javax/swing/text/DefaultEditorKit$DeleteNextCharAction -javax/swing/text/DefaultEditorKit$ReadOnlyAction -javax/swing/text/DefaultEditorKit$DeleteWordAction -javax/swing/text/DefaultEditorKit$WritableAction -javax/swing/text/DefaultEditorKit$CutAction -javax/swing/text/DefaultEditorKit$CopyAction -javax/swing/text/DefaultEditorKit$PasteAction -javax/swing/text/DefaultEditorKit$VerticalPageAction -javax/swing/text/DefaultEditorKit$PageAction -javax/swing/text/DefaultEditorKit$InsertBreakAction -javax/swing/text/DefaultEditorKit$BeepAction -javax/swing/text/DefaultEditorKit$NextVisualPositionAction -javax/swing/text/DefaultEditorKit$BeginWordAction -javax/swing/text/DefaultEditorKit$EndWordAction -javax/swing/text/DefaultEditorKit$PreviousWordAction -javax/swing/text/DefaultEditorKit$NextWordAction -javax/swing/text/DefaultEditorKit$BeginLineAction -javax/swing/text/DefaultEditorKit$EndLineAction -javax/swing/text/DefaultEditorKit$BeginParagraphAction -javax/swing/text/DefaultEditorKit$EndParagraphAction -javax/swing/text/DefaultEditorKit$BeginAction -javax/swing/text/DefaultEditorKit$EndAction -javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction -javax/swing/text/DefaultEditorKit$InsertTabAction -javax/swing/text/DefaultEditorKit$SelectWordAction -javax/swing/text/DefaultEditorKit$SelectLineAction -javax/swing/text/DefaultEditorKit$SelectParagraphAction -javax/swing/text/DefaultEditorKit$SelectAllAction -javax/swing/text/DefaultEditorKit$UnselectAction -javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction -javax/swing/text/DefaultEditorKit$DumpModelAction -javax/swing/plaf/basic/BasicTextUI$TextTransferHandler -javax/swing/text/Position$Bias -javax/swing/plaf/basic/BasicTextUI$RootView -javax/swing/text/View -javax/swing/plaf/basic/BasicTextUI$UpdateHandler -javax/swing/event/DocumentListener -javax/swing/plaf/basic/BasicTextUI$DragListener -javax/swing/plaf/basic/BasicComboBoxEditor$UIResource -javax/swing/plaf/basic/BasicTextUI$BasicCaret -javax/swing/text/DefaultCaret -javax/swing/text/Caret -javax/swing/text/DefaultCaret$Handler -java/awt/datatransfer/ClipboardOwner -javax/swing/plaf/basic/BasicTextUI$BasicHighlighter -javax/swing/text/DefaultHighlighter -javax/swing/text/LayeredHighlighter -javax/swing/text/Highlighter -javax/swing/text/Highlighter$Highlight -javax/swing/text/DefaultHighlighter$DefaultHighlightPainter -javax/swing/text/LayeredHighlighter$LayerPainter -javax/swing/text/Highlighter$HighlightPainter -javax/swing/text/DefaultHighlighter$SafeDamager -sun/swing/plaf/synth/SynthUI -javax/swing/plaf/synth/SynthConstants -javax/swing/text/FieldView -javax/swing/text/PlainView -javax/swing/text/JTextComponent$DefaultKeymap -javax/swing/text/Keymap -javax/swing/text/JTextComponent$KeymapWrapper -javax/swing/text/JTextComponent$KeymapActionMap -javax/swing/plaf/basic/BasicTextUI$FocusAction -javax/swing/plaf/basic/BasicTextUI$TextActionWrapper -javax/swing/JTextArea -javax/swing/JEditorPane -javax/swing/JTextField$ScrollRepainter -javax/swing/plaf/metal/MetalComboBoxEditor$1 -javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder -javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener -javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler -javax/swing/plaf/basic/BasicComboBoxUI$Handler -javax/swing/plaf/metal/MetalComboBoxButton -javax/swing/plaf/metal/MetalComboBoxIcon -javax/swing/plaf/metal/MetalComboBoxButton$1 -javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager -javax/swing/JComboBox$KeySelectionManager -javax/swing/JToolBar$DefaultToolBarLayout -javax/swing/plaf/metal/MetalToolBarUI -javax/swing/plaf/basic/BasicToolBarUI -javax/swing/plaf/ToolBarUI -javax/swing/plaf/metal/MetalBorders$ToolBarBorder -javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1 -javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder -javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder -javax/swing/plaf/basic/BasicBorders$RadioButtonBorder -javax/swing/plaf/basic/BasicBorders$ButtonBorder -javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder -javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener -javax/swing/plaf/basic/BasicToolBarUI$DockingListener -javax/swing/plaf/basic/BasicToolBarUI$Handler -javax/swing/border/EtchedBorder -javax/swing/JToolBar$Separator -javax/swing/plaf/basic/BasicToolBarSeparatorUI -sun/font/FontDesignMetrics$MetricsKey -java/applet/Applet -java/awt/Panel -javax/swing/KeyboardManager$ComponentKeyStrokePair -sun/awt/im/InputMethodContext -java/awt/im/spi/InputMethodContext -sun/awt/im/InputContext -sun/awt/windows/WInputMethod -sun/awt/im/InputMethodAdapter -java/awt/im/spi/InputMethod -java/util/Collections$UnmodifiableMap -javax/swing/SizeRequirements -javax/swing/plaf/basic/BasicGraphicsUtils -java/awt/event/AdjustmentEvent -java/awt/MenuBar -java/awt/LightweightDispatcher$2 -java/io/StringWriter -java/io/UnsupportedEncodingException -java/lang/StringCoding$StringEncoder -java/net/UnknownHostException -java/net/Socket -java/nio/channels/SocketChannel -java/nio/channels/spi/AbstractSelectableChannel -java/nio/channels/SelectableChannel -java/net/SocketException -java/net/SocketImplFactory -java/net/Proxy -java/net/SocksSocketImpl$5 -java/net/ProxySelector -sun/net/spi/DefaultProxySelector -sun/net/spi/DefaultProxySelector$1 -sun/net/NetProperties -sun/net/NetProperties$1 -sun/net/spi/DefaultProxySelector$NonProxyInfo -java/util/regex/ASCII -java/util/regex/Pattern$GroupCurly -java/net/Inet6Address -java/net/URI -java/net/URI$Parser -java/net/Proxy$Type -java/net/SocketTimeoutException -java/io/InterruptedIOException -javax/swing/UnsupportedLookAndFeelException -java/lang/UnsatisfiedLinkError -javax/swing/Box$Filler -javax/swing/JComponent$2 -sun/net/ProgressMonitor -sun/net/DefaultProgressMeteringPolicy -sun/net/ProgressMeteringPolicy -sun/net/www/MimeTable -java/net/FileNameMap -sun/net/www/MimeTable$1 -sun/net/www/MimeTable$2 -sun/net/www/MimeEntry -java/net/URLConnection$1 -java/text/SimpleDateFormat -java/text/DateFormat -java/text/DateFormat$Field -java/util/Calendar -java/util/GregorianCalendar -sun/util/resources/CalendarData -sun/util/resources/LocaleNamesBundle -sun/util/resources/CalendarData_en -java/text/DateFormatSymbols -java/text/spi/DateFormatSymbolsProvider -sun/text/resources/FormatData -sun/text/resources/FormatData_en -sun/text/resources/FormatData_en_US -java/text/NumberFormat -java/text/spi/NumberFormatProvider -java/text/DecimalFormatSymbols -java/text/spi/DecimalFormatSymbolsProvider -java/util/Currency -java/util/Currency$1 -java/util/CurrencyData -java/util/spi/CurrencyNameProvider -sun/util/resources/CurrencyNames -sun/util/resources/CurrencyNames_en_US -java/text/DecimalFormat -java/text/DigitList -java/math/RoundingMode -java/text/DontCareFieldPosition -java/text/DontCareFieldPosition$1 -java/text/Format$FieldDelegate -javax/swing/plaf/BorderUIResource -javax/swing/BorderFactory -javax/swing/border/BevelBorder -javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon -javax/swing/plaf/metal/MetalIconFactory$FolderIcon16 -java/awt/TrayIcon -java/awt/EventDispatchThread$StopDispatchEvent -java/util/zip/ZipInputStream -java/io/PushbackInputStream -java/util/zip/CRC32 -java/util/zip/Checksum -java/lang/Thread$State -javax/swing/SwingUtilities$SharedOwnerFrame -javax/swing/JTable -javax/swing/event/TableModelListener -javax/swing/event/TableColumnModelListener -javax/swing/event/CellEditorListener -javax/swing/event/RowSorterListener -com/sun/awt/AWTUtilities$Translucency -com/sun/awt/AWTUtilities$1 -java/lang/ClassFormatError -java/awt/GraphicsCallback$PaintCallback -sun/awt/SunGraphicsCallback -java/awt/Component$ProxyCapabilities -sun/java2d/pipe/hw/ExtendedBufferCapabilities -java/awt/BufferCapabilities$FlipContents -java/awt/AttributeValue -sun/awt/SubRegionShowable -sun/print/PrinterGraphicsConfig -sun/java2d/opengl/WGLGraphicsConfig -sun/java2d/opengl/OGLGraphicsConfig -javax/swing/JTabbedPane -javax/swing/JTabbedPane$ModelListener -javax/swing/plaf/metal/MetalTabbedPaneUI -javax/swing/plaf/basic/BasicTabbedPaneUI -javax/swing/plaf/TabbedPaneUI -javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout -javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout -javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout -javax/swing/plaf/basic/BasicTabbedPaneUI$Handler -sun/swing/ImageIconUIResource -javax/swing/GrayFilter -java/awt/image/RGBImageFilter -java/awt/image/ImageFilter -java/awt/image/FilteredImageSource -org/w3c/dom/Node -org/xml/sax/SAXException -javax/xml/parsers/ParserConfigurationException -org/xml/sax/EntityResolver -java/security/NoSuchAlgorithmException -java/security/GeneralSecurityException -java/util/zip/GZIPInputStream -java/util/zip/DeflaterOutputStream -org/xml/sax/InputSource -javax/xml/parsers/DocumentBuilderFactory -javax/xml/parsers/FactoryFinder -javax/xml/parsers/SecuritySupport -javax/xml/parsers/SecuritySupport$2 -javax/xml/parsers/SecuritySupport$5 -javax/xml/parsers/SecuritySupport$1 -javax/xml/parsers/SecuritySupport$4 -javax/xml/parsers/DocumentBuilder -org/xml/sax/helpers/DefaultHandler -org/xml/sax/DTDHandler -org/xml/sax/ContentHandler -org/xml/sax/ErrorHandler -org/w3c/dom/Document -org/xml/sax/SAXNotSupportedException -org/xml/sax/Locator -org/xml/sax/SAXNotRecognizedException -org/xml/sax/SAXParseException -org/w3c/dom/NodeList -org/w3c/dom/events/EventTarget -org/w3c/dom/traversal/DocumentTraversal -org/w3c/dom/events/DocumentEvent -org/w3c/dom/ranges/DocumentRange -org/w3c/dom/Entity -org/w3c/dom/Element -org/w3c/dom/CharacterData -org/w3c/dom/CDATASection -org/w3c/dom/Text -org/xml/sax/AttributeList -org/w3c/dom/DOMException -org/w3c/dom/Notation -org/w3c/dom/DocumentType -org/w3c/dom/Attr -org/w3c/dom/EntityReference -org/w3c/dom/ProcessingInstruction -org/w3c/dom/DocumentFragment -org/w3c/dom/Comment -org/w3c/dom/events/Event -org/w3c/dom/events/MutationEvent -org/w3c/dom/traversal/TreeWalker -org/w3c/dom/ranges/Range -org/w3c/dom/traversal/NodeIterator -org/w3c/dom/events/EventException -org/w3c/dom/NamedNodeMap -java/lang/StringIndexOutOfBoundsException -java/awt/GridLayout -javax/swing/plaf/metal/MetalRadioButtonUI -javax/swing/plaf/basic/BasicRadioButtonUI -javax/swing/plaf/basic/BasicBorders -javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon -java/awt/event/ItemEvent -java/awt/CardLayout$Card -javax/swing/JCheckBox -javax/swing/event/ListSelectionEvent -javax/swing/plaf/metal/MetalCheckBoxUI -javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon -java/lang/ExceptionInInitializerError -com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI -javax/swing/JProgressBar -javax/swing/JProgressBar$ModelListener -javax/swing/plaf/metal/MetalProgressBarUI -javax/swing/plaf/basic/BasicProgressBarUI -javax/swing/plaf/ProgressBarUI -javax/swing/plaf/BorderUIResource$LineBorderUIResource -javax/swing/plaf/basic/BasicProgressBarUI$Handler -javax/swing/tree/TreeModel -javax/swing/table/TableCellRenderer -javax/swing/table/JTableHeader -javax/swing/event/TreeExpansionListener -javax/swing/table/AbstractTableModel -javax/swing/table/TableModel -javax/swing/table/DefaultTableCellRenderer -javax/swing/JTree -javax/swing/tree/TreeSelectionModel -javax/swing/tree/DefaultTreeCellRenderer -javax/swing/tree/TreeCellRenderer -javax/swing/table/TableCellEditor -javax/swing/CellEditor -javax/swing/JToolTip -javax/swing/table/TableColumn -javax/swing/table/DefaultTableColumnModel -javax/swing/table/TableColumnModel -javax/swing/table/DefaultTableModel -javax/swing/event/TableModelEvent -sun/swing/table/DefaultTableCellHeaderRenderer -sun/swing/table/DefaultTableCellHeaderRenderer$EmptyIcon -javax/swing/plaf/basic/BasicTableHeaderUI -javax/swing/plaf/TableHeaderUI -javax/swing/plaf/basic/BasicTableHeaderUI$1 -javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler -javax/swing/DefaultCellEditor -javax/swing/tree/TreeCellEditor -javax/swing/AbstractCellEditor -javax/swing/plaf/basic/BasicTableUI -javax/swing/plaf/TableUI -javax/swing/plaf/basic/BasicTableUI$TableTransferHandler -javax/swing/plaf/basic/BasicTableUI$Handler -javax/swing/tree/DefaultTreeSelectionModel -javax/swing/tree/TreePath -javax/swing/plaf/metal/MetalTreeUI -javax/swing/plaf/basic/BasicTreeUI -javax/swing/plaf/TreeUI -javax/swing/plaf/basic/BasicTreeUI$Actions -javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler -javax/swing/plaf/metal/MetalTreeUI$LineListener -javax/swing/plaf/basic/BasicTreeUI$Handler -javax/swing/event/TreeModelListener -javax/swing/event/TreeSelectionListener -javax/swing/tree/VariableHeightLayoutCache -javax/swing/tree/AbstractLayoutCache -javax/swing/tree/RowMapper -javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler -javax/swing/tree/AbstractLayoutCache$NodeDimensions -javax/swing/JTree$TreeModelHandler -javax/swing/tree/VariableHeightLayoutCache$TreeStateNode -javax/swing/tree/DefaultMutableTreeNode -javax/swing/tree/MutableTreeNode -javax/swing/tree/DefaultMutableTreeNode$1 -javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration -javax/swing/event/TableColumnModelEvent -java/text/ParseException -java/text/NumberFormat$Field -javax/swing/event/UndoableEditListener -javax/swing/filechooser/FileFilter -javax/swing/tree/DefaultTreeModel -javax/swing/tree/DefaultTreeCellEditor -javax/swing/tree/DefaultTreeCellEditor$1 -javax/swing/tree/DefaultTreeCellEditor$DefaultTextField -javax/swing/DefaultCellEditor$1 -javax/swing/DefaultCellEditor$EditorDelegate -javax/swing/tree/DefaultTreeCellEditor$EditorContainer -javax/swing/JTree$TreeSelectionRedirector -javax/swing/event/TreeModelEvent -javax/swing/plaf/metal/MetalSplitPaneUI -javax/swing/plaf/basic/BasicSplitPaneUI -javax/swing/plaf/SplitPaneUI -javax/swing/plaf/basic/BasicSplitPaneDivider -javax/swing/plaf/basic/BasicBorders$SplitPaneBorder -javax/swing/plaf/metal/MetalSplitPaneDivider -javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout -javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler -javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder -javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager -javax/swing/plaf/basic/BasicSplitPaneUI$1 -javax/swing/plaf/basic/BasicSplitPaneUI$Handler -javax/swing/plaf/metal/MetalSplitPaneDivider$1 -javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler -javax/swing/plaf/metal/MetalSplitPaneDivider$2 -javax/swing/border/TitledBorder -javax/swing/plaf/basic/BasicTextAreaUI -java/util/Collections$UnmodifiableCollection$1 -java/net/NoRouteToHostException -java/net/BindException -javax/swing/tree/PathPlaceHolder -javax/swing/event/TreeSelectionEvent -javax/swing/JList$3 -javax/swing/JList$ListSelectionHandler -javax/swing/JSlider -javax/swing/JSlider$ModelListener -javax/swing/plaf/metal/MetalSliderUI -javax/swing/plaf/basic/BasicSliderUI -javax/swing/plaf/SliderUI -javax/swing/plaf/basic/BasicSliderUI$Actions -javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon -javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon -javax/swing/plaf/basic/BasicSliderUI$TrackListener -javax/swing/plaf/basic/BasicSliderUI$Handler -javax/swing/plaf/basic/BasicSliderUI$ScrollListener -javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener -javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler -sun/java2d/HeadlessGraphicsEnvironment -java/util/Hashtable$KeySet -sun/font/FontManager$2 -sun/java2d/SunGraphicsEnvironment$3 -sun/java2d/SunGraphicsEnvironment$4 -javax/swing/DefaultListModel -javax/swing/event/ListDataEvent -javax/sound/sampled/DataLine -javax/sound/sampled/Line -javax/sound/sampled/Line$Info -javax/sound/sampled/DataLine$Info -javax/sound/sampled/Control$Type -javax/sound/sampled/FloatControl$Type -javax/sound/sampled/LineUnavailableException -javax/sound/sampled/UnsupportedAudioFileException -javax/swing/JRadioButtonMenuItem -javax/swing/JMenuItem$AccessibleJMenuItem -javax/swing/AbstractButton$AccessibleAbstractButton -javax/accessibility/AccessibleAction -javax/accessibility/AccessibleValue -javax/accessibility/AccessibleText -javax/accessibility/AccessibleExtendedComponent -javax/accessibility/AccessibleComponent -javax/swing/JComponent$AccessibleJComponent -java/awt/Container$AccessibleAWTContainer -java/awt/Component$AccessibleAWTComponent -javax/accessibility/AccessibleRelationSet -javax/accessibility/AccessibleState -javax/accessibility/AccessibleBundle -javax/swing/plaf/basic/BasicCheckBoxMenuItemUI -javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon -javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem -javax/swing/plaf/basic/BasicRadioButtonMenuItemUI -javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon -sun/awt/image/ImageDecoder$1 -javax/swing/JTabbedPane$Page -java/net/DatagramSocket -java/net/MulticastSocket -java/net/DatagramPacket -sun/net/InetAddressCachePolicy$1 -sun/security/action/GetIntegerAction -sun/net/InetAddressCachePolicy$2 -java/net/InetAddress$CacheEntry -java/net/PlainDatagramSocketImpl -java/text/Collator -java/text/spi/CollatorProvider -sun/text/resources/CollationData -sun/text/resources/CollationData_en -sun/util/EmptyListResourceBundle -java/text/RuleBasedCollator -java/text/CollationRules -java/text/RBCollationTables -java/text/RBTableBuilder -java/text/RBCollationTables$BuildAPI -sun/text/IntHashtable -sun/text/UCompactIntArray -sun/text/normalizer/NormalizerImpl -sun/text/normalizer/ICUData -sun/text/normalizer/NormalizerDataReader -sun/text/normalizer/ICUBinary$Authenticate -sun/text/normalizer/ICUBinary -sun/text/normalizer/NormalizerImpl$FCDTrieImpl -sun/text/normalizer/Trie$DataManipulate -sun/text/normalizer/NormalizerImpl$NormTrieImpl -sun/text/normalizer/NormalizerImpl$AuxTrieImpl -sun/text/normalizer/IntTrie -sun/text/normalizer/Trie -sun/text/normalizer/CharTrie -sun/text/normalizer/CharTrie$FriendAgent -sun/text/normalizer/UnicodeSet -sun/text/normalizer/UnicodeMatcher -sun/text/normalizer/NormalizerImpl$DecomposeArgs -java/text/MergeCollation -java/text/PatternEntry$Parser -java/text/PatternEntry -java/text/EntryPair -sun/text/ComposedCharIter -sun/text/normalizer/UTF16 -sun/net/www/protocol/http/Handler -java/security/SignatureException -java/security/InvalidKeyException -java/security/KeyException -java/security/Signature -java/io/ObjectInputStream$BlockDataInputStream -java/io/ObjectInputStream$HandleTable -java/io/ObjectInputStream$HandleTable$HandleList -java/io/ObjectInputStream$ValidationList -java/io/Bits -java/io/ObjectStreamClass$Caches -sun/security/provider/DSAPublicKey -java/io/ObjectStreamClass$WeakClassKey -java/security/interfaces/DSAKey -java/security/PublicKey -java/io/ObjectStreamClass$EntryFuture -java/security/Key -sun/reflect/SerializationConstructorAccessorImpl -java/io/ObjectStreamClass$FieldReflectorKey -java/io/ObjectStreamClass$FieldReflector -sun/security/util/DerEncoder -java/io/ObjectStreamClass$3 -java/io/ObjectStreamClass$4 -java/io/ObjectStreamClass$5 -java/security/MessageDigest -sun/security/jca/GetInstance -java/math/BigInteger -java/io/ObjectStreamClass$ClassDataSlot -sun/security/jca/ProviderConfig -sun/security/util/DerInputStream -sun/security/jca/ProviderList$3 -sun/security/util/DerInputBuffer -sun/security/jca/ProviderList$1 -java/security/AlgorithmParameters -java/security/AlgorithmParametersSpi -sun/security/jca/ProviderList$2 -sun/security/jca/ProviderConfig$1 -sun/security/jca/ProviderConfig$3 -java/security/Provider$Service -java/security/Provider$UString -sun/security/provider/DSAParameters -sun/security/jca/GetInstance$Instance -sun/security/util/ByteArrayLexOrder -sun/security/util/ByteArrayTagOrder -sun/security/provider/DigestBase -java/security/MessageDigest$Delegate -sun/security/util/DerIndefLenConverter -java/io/InvalidClassException -java/io/ObjectOutputStream$BlockDataOutputStream -java/io/ObjectInputStream$GetFieldImpl -java/io/ObjectOutputStream$ReplaceTable -sun/security/jca/ServiceId -sun/security/jca/ProviderList$ServiceList -sun/security/jca/ProviderList$ServiceList$1 -java/security/Signature$Delegate -java/security/interfaces/DSAPrivateKey -java/security/PrivateKey -sun/security/provider/DSA$SHA1withDSA -sun/security/provider/DSA -java/security/spec/DSAParameterSpec -java/security/spec/AlgorithmParameterSpec -java/math/MutableBigInteger -java/math/SignedMutableBigInteger -java/awt/Window$1DisposeAction -java/awt/EventQueue$1AWTInvocationLock -javax/swing/SystemEventQueueUtilities$RunnableCanvas -javax/swing/SystemEventQueueUtilities$RunnableCanvasGraphics -sun/awt/image/VSyncedBSManager -javax/swing/JTable$2 -javax/swing/JTable$Resizable3 -javax/swing/JTable$Resizable2 -javax/swing/JTable$5 -java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent -sun/nio/cs/UTF_16LE -com/sun/java/swing/plaf/windows/WindowsLookAndFeel -com/sun/java/swing/plaf/windows/XPStyle -com/sun/java/swing/plaf/windows/XPStyle$SkinPainter -sun/swing/CachedPainter -com/sun/java/swing/plaf/windows/WindowsRootPaneUI -com/sun/java/swing/plaf/windows/WindowsRootPaneUI$AltProcessor -java/awt/SystemColor -com/sun/java/swing/plaf/windows/WindowsTreeUI$ExpandedIcon -com/sun/java/swing/plaf/windows/WindowsTreeUI$CollapsedIcon -com/sun/java/swing/plaf/windows/DesktopProperty -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$XPColorValue -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$XPValue -com/sun/java/swing/plaf/windows/TMSchema$Part -com/sun/java/swing/plaf/windows/TMSchema$Control -com/sun/java/swing/plaf/windows/TMSchema$Prop -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$XPColorValue$XPColorValueKey -com/sun/java/swing/plaf/windows/XPStyle$Skin -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$WindowsFontProperty -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$FontDesktopProperty -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$TriggerDesktopProperty -com/sun/java/swing/plaf/windows/DesktopProperty$WeakPCL -com/sun/java/swing/plaf/windows/WindowsClassicLookAndFeel -com/sun/java/swing/plaf/windows/TMSchema$State -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$LazyWindowsIcon -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$XPBorderValue -com/sun/java/swing/plaf/windows/WindowsIconFactory -com/sun/java/swing/plaf/windows/WindowsIconFactory$FrameButtonIcon -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$XPDLUValue -com/sun/java/swing/plaf/windows/WindowsLookAndFeel$ActiveWindowsIcon -sun/swing/SwingUtilities2$2$1 -sun/awt/image/ByteArrayImageSource -com/sun/java/swing/plaf/windows/resources/windows -com/sun/java/swing/plaf/windows/WindowsLabelUI -sun/swing/ImageCache -com/sun/java/swing/plaf/windows/WindowsButtonUI -com/sun/java/swing/plaf/windows/WindowsToggleButtonUI -javax/swing/plaf/basic/BasicBorders$FieldBorder -com/sun/java/swing/plaf/windows/WindowsMenuBarUI -javax/swing/plaf/basic/BasicBorders$MenuBarBorder -com/sun/java/swing/plaf/windows/WindowsMenuBarUI$TakeFocus -javax/swing/plaf/basic/BasicMenuBarUI$Actions -com/sun/java/swing/plaf/windows/WindowsMenuUI -com/sun/java/swing/plaf/windows/WindowsMenuUI$1 -com/sun/java/swing/plaf/windows/WindowsMenuItemUIAccessor -com/sun/java/swing/plaf/windows/WindowsIconFactory$MenuArrowIcon -javax/swing/plaf/basic/BasicIconFactory -javax/swing/plaf/basic/BasicIconFactory$MenuItemCheckIcon -com/sun/java/swing/plaf/windows/WindowsMenuUI$WindowsMouseInputHandler -javax/swing/plaf/basic/BasicMenuUI$MouseInputHandler -com/sun/java/swing/plaf/windows/WindowsMenuItemUI -com/sun/java/swing/plaf/windows/WindowsMenuItemUI$1 -com/sun/java/swing/plaf/windows/WindowsIconFactory$MenuItemArrowIcon -com/sun/java/swing/plaf/windows/WindowsIconFactory$MenuItemCheckIcon -com/sun/java/swing/plaf/windows/WindowsPopupMenuUI -javax/swing/Popup -com/sun/java/swing/plaf/windows/WindowsPopupMenuUI$MnemonicListener -com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI -javax/swing/plaf/basic/BasicPopupMenuSeparatorUI -com/sun/java/swing/plaf/windows/WindowsScrollBarUI -com/sun/java/swing/plaf/windows/WindowsScrollBarUI$Grid -com/sun/java/swing/plaf/windows/WindowsScrollBarUI$WindowsArrowButton -com/sun/java/swing/plaf/windows/WindowsComboBoxUI -com/sun/java/swing/plaf/windows/WindowsComboBoxUI$1 -com/sun/java/swing/plaf/windows/WindowsComboBoxUI$2 -com/sun/java/swing/plaf/windows/WindowsComboBoxUI$WindowsComboBoxEditor -com/sun/java/swing/plaf/windows/WindowsTextFieldUI -com/sun/java/swing/plaf/windows/WindowsTextFieldUI$WindowsFieldCaret -com/sun/java/swing/plaf/windows/WindowsComboBoxUI$3 -com/sun/java/swing/plaf/windows/WindowsToolBarUI -com/sun/java/swing/plaf/windows/WindowsBorders -com/sun/java/swing/plaf/windows/WindowsBorders$ToolBarBorder -javax/swing/plaf/basic/BasicBorders$RolloverButtonBorder -com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI -javax/swing/JRadioButton -java/awt/GraphicsCallback -java/awt/Component$FlipSubRegionBufferStrategy -java/awt/Component$FlipBufferStrategy -sun/java2d/d3d/D3DVolatileSurfaceManager -java/awt/print/PrinterGraphics -java/awt/PrintGraphics -sun/net/InetAddressCachePolicy -java/net/DatagramSocketImpl -java/security/SignatureSpi -java/io/ObjectInputStream$PeekInputStream -java/security/interfaces/DSAPublicKey -java/io/Externalizable -java/io/ObjectStreamClass$1 -java/io/DataOutputStream -java/io/ObjectStreamClass$MemberSignature -java/security/interfaces/DSAParams -java/security/MessageDigestSpi -sun/security/jca/ProviderList -sun/security/util/ObjectIdentifier -java/io/ObjectStreamException -java/io/ObjectInputStream$GetField -java/io/ObjectOutputStream$HandleTable -javax/swing/event/AncestorEvent -sun/java2d/SurfaceManagerFactory$1 -java/awt/Component$BltSubRegionBufferStrategy -java/awt/Component$BltBufferStrategy -sun/awt/image/BufferedImageGraphicsConfig -sun/awt/image/BufImgVolatileSurfaceManager -java/io/ObjectStreamClass$2 -sun/security/x509/X509Key -sun/security/util/DerOutputStream -sun/security/util/DerValue -java/io/ObjectInputStream$CallbackContext -javax/swing/BufferStrategyPaintManager$BufferInfo -sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl -sun/security/jca/Providers -sun/security/provider/ByteArrayAccess -sun/applet/Main -sun/applet/AppletMessageHandler -sun/applet/resources/MsgAppletViewer -sun/applet/AppletSecurity -sun/awt/AWTSecurityManager -java/lang/SecurityManager -java/security/DomainCombiner -sun/applet/AppletSecurity$1 -java/lang/SecurityManager$1 -java/security/SecurityPermission -java/util/PropertyPermission -sun/applet/AppletViewer -java/applet/AppletContext -java/awt/print/Printable -java/util/logging/LogManager$6 -sun/applet/StdAppletViewerFactory -sun/applet/AppletViewerFactory -sun/security/util/SecurityConstants -java/awt/AWTPermission -java/net/NetPermission -java/net/SocketPermission -javax/security/auth/AuthPermission -sun/applet/AppletViewer$UserActionListener -sun/applet/AppletViewerPanel -sun/applet/AppletPanel -java/applet/AppletStub -sun/misc/MessageUtils -sun/applet/AppletPanel$10 -java/security/Policy$1 -java/util/concurrent/atomic/AtomicReference -sun/security/provider/PolicyFile$PolicyInfo -java/util/Collections$SynchronizedRandomAccessList -java/util/Collections$SynchronizedList -sun/security/provider/PolicyFile$4 -sun/security/provider/PolicyFile$PolicyEntry -sun/security/provider/PolicyParser -sun/security/provider/PolicyFile$1 -sun/security/provider/PolicyFile$3 -sun/security/util/PropertyExpander -sun/security/util/PolicyUtil -java/io/StreamTokenizer -sun/security/provider/PolicyParser$GrantEntry -sun/security/provider/PolicyParser$PermissionEntry -sun/security/provider/PolicyParser$ParsingException -sun/security/provider/PolicyFile$7 -sun/security/provider/PolicyFile$8 -sun/security/provider/PolicyFile$SelfPermission -java/net/SocketPermissionCollection -java/util/PropertyPermissionCollection -sun/applet/AppletPanel$9 -sun/applet/AppletClassLoader -sun/applet/AppletClassLoader$4 -sun/applet/AppletThreadGroup -sun/applet/AppContextCreator -java/lang/Thread$1 -sun/applet/AppletPanel$1 -sun/awt/AppContext$3 -sun/awt/MostRecentThreadAppContext -sun/awt/windows/WMenuBarPeer -java/awt/peer/MenuBarPeer -java/awt/peer/MenuComponentPeer -sun/awt/windows/WMenuPeer -java/awt/peer/MenuPeer -java/awt/peer/MenuItemPeer -sun/awt/windows/WMenuItemPeer -sun/awt/windows/WMenuItemPeer$2 -sun/awt/windows/awtLocalization -sun/awt/windows/WFontMetrics -sun/applet/AppletViewer$1 -sun/applet/AppletViewer$1AppletEventListener -sun/applet/AppletListener -sun/awt/CausedFocusEvent -sun/applet/AppletEvent -java/util/concurrent/locks/LockSupport -java/net/URLClassLoader$4 -sun/applet/AppletClassLoader$2 -javax/swing/JApplet -java/lang/ClassLoader$1 -sun/security/provider/PolicyFile$6 -java/security/PermissionsEnumerator -java/util/Collections$1 -sun/applet/AppletPanel$11 -javax/swing/SwingHeavyWeight -sun/applet/AppletPanel$8 -sun/applet/AppletPanel$2 -sun/applet/AppletPanel$3 -sun/applet/AppletPanel$6 -java/beans/PropertyVetoException -javax/swing/BufferStrategyPaintManager$1 -# 80a24a61fd56e59e diff --git a/ReplicatorG/build/windows/dist/java/lib/cmm/CIEXYZ.pf b/ReplicatorG/build/windows/dist/java/lib/cmm/CIEXYZ.pf deleted file mode 100644 index db3ba20..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/cmm/CIEXYZ.pf and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/cmm/GRAY.pf b/ReplicatorG/build/windows/dist/java/lib/cmm/GRAY.pf deleted file mode 100644 index e31a4a7..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/cmm/GRAY.pf and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/cmm/LINEAR_RGB.pf b/ReplicatorG/build/windows/dist/java/lib/cmm/LINEAR_RGB.pf deleted file mode 100644 index eadae04..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/cmm/LINEAR_RGB.pf and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/cmm/PYCC.pf b/ReplicatorG/build/windows/dist/java/lib/cmm/PYCC.pf deleted file mode 100644 index 1c49e0b..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/cmm/PYCC.pf and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/cmm/sRGB.pf b/ReplicatorG/build/windows/dist/java/lib/cmm/sRGB.pf deleted file mode 100644 index 7f9d18d..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/cmm/sRGB.pf and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/content-types.properties b/ReplicatorG/build/windows/dist/java/lib/content-types.properties deleted file mode 100644 index df17bd5..0000000 --- a/ReplicatorG/build/windows/dist/java/lib/content-types.properties +++ /dev/null @@ -1,272 +0,0 @@ -#sun.net.www MIME content-types table; version 1.6, 05/04/99 -# -# Property fields: -# -# ::= 'description' '=' -# ::= 'file_extensions' '=' -# ::= 'icon' '=' -# ::= 'browser' | 'application' | 'save' | 'unknown' -# ::= 'application' '=' -# - -# -# The "we don't know anything about this data" type(s). -# Used internally to mark unrecognized types. -# -content/unknown: description=Unknown Content -unknown/unknown: description=Unknown Data Type - -# -# The template we should use for temporary files when launching an application -# to view a document of given type. -# -temp.file.template: c:\\temp\\%s - -# -# The "real" types. -# -application/octet-stream: \ - description=Generic Binary Stream;\ - file_extensions=.saveme,.dump,.hqx,.arc,.obj,.lib,.bin,.exe,.zip,.gz - -application/oda: \ - description=ODA Document;\ - file_extensions=.oda - -application/pdf: \ - description=Adobe PDF Format;\ - file_extensions=.pdf - -application/postscript: \ - description=Postscript File;\ - file_extensions=.eps,.ai,.ps;\ - icon=ps - -application/rtf: \ - description=Wordpad Document;\ - file_extensions=.rtf;\ - action=application;\ - application=wordpad.exe %s - -application/x-dvi: \ - description=TeX DVI File;\ - file_extensions=.dvi - -application/x-hdf: \ - description=Hierarchical Data Format;\ - file_extensions=.hdf;\ - action=save - -application/x-latex: \ - description=LaTeX Source;\ - file_extensions=.latex - -application/x-netcdf: \ - description=Unidata netCDF Data Format;\ - file_extensions=.nc,.cdf;\ - action=save - -application/x-tex: \ - description=TeX Source;\ - file_extensions=.tex - -application/x-texinfo: \ - description=Gnu Texinfo;\ - file_extensions=.texinfo,.texi - -application/x-troff: \ - description=Troff Source;\ - file_extensions=.t,.tr,.roff - -application/x-troff-man: \ - description=Troff Manpage Source;\ - file_extensions=.man - -application/x-troff-me: \ - description=Troff ME Macros;\ - file_extensions=.me - -application/x-troff-ms: \ - description=Troff MS Macros;\ - file_extensions=.ms - -application/x-wais-source: \ - description=Wais Source;\ - file_extensions=.src,.wsrc - -application/zip: \ - description=Zip File;\ - file_extensions=.zip;\ - icon=zip;\ - action=save - -application/x-bcpio: \ - description=Old Binary CPIO Archive;\ - file_extensions=.bcpio;\ - action=save - -application/x-cpio: \ - description=Unix CPIO Archive;\ - file_extensions=.cpio;\ - action=save - -application/x-gtar: \ - description=Gnu Tar Archive;\ - file_extensions=.gtar;\ - icon=tar;\ - action=save - -application/x-shar: \ - description=Shell Archive;\ - file_extensions=.sh,.shar;\ - action=save - -application/x-sv4cpio: \ - description=SVR4 CPIO Archive;\ - file_extensions=.sv4cpio;\ - action=save - -application/x-sv4crc: \ - description=SVR4 CPIO with CRC;\ - file_extensions=.sv4crc;\ - action=save - -application/x-tar: \ - description=Tar Archive;\ - file_extensions=.tar;\ - icon=tar;\ - action=save - -application/x-ustar: \ - description=US Tar Archive;\ - file_extensions=.ustar;\ - action=save - -audio/basic: \ - description=Basic Audio;\ - file_extensions=.snd,.au;\ - icon=audio - -audio/x-aiff: \ - description=Audio Interchange Format File;\ - file_extensions=.aifc,.aif,.aiff;\ - icon=aiff - -audio/x-wav: \ - description=Wav Audio;\ - file_extensions=.wav;\ - icon=wav;\ - action=application;\ - application=mplayer.exe %s - -image/gif: \ - description=GIF Image;\ - file_extensions=.gif;\ - icon=gif;\ - action=browser - -image/ief: \ - description=Image Exchange Format;\ - file_extensions=.ief - -image/jpeg: \ - description=JPEG Image;\ - file_extensions=.jfif,.jfif-tbnl,.jpe,.jpg,.jpeg;\ - icon=jpeg;\ - action=browser - -image/tiff: \ - description=TIFF Image;\ - file_extensions=.tif,.tiff;\ - icon=tiff - -image/vnd.fpx: \ - description=FlashPix Image;\ - file_extensions=.fpx,.fpix - -image/x-cmu-rast: \ - description=CMU Raster Image;\ - file_extensions=.ras - -image/x-portable-anymap: \ - description=PBM Anymap Image;\ - file_extensions=.pnm - -image/x-portable-bitmap: \ - description=PBM Bitmap Image;\ - file_extensions=.pbm - -image/x-portable-graymap: \ - description=PBM Graymap Image;\ - file_extensions=.pgm - -image/x-portable-pixmap: \ - description=PBM Pixmap Image;\ - file_extensions=.ppm - -image/x-rgb: \ - description=RGB Image;\ - file_extensions=.rgb - -image/x-xbitmap: \ - description=X Bitmap Image;\ - file_extensions=.xbm,.xpm - -image/x-xwindowdump: \ - description=X Window Dump Image;\ - file_extensions=.xwd - -image/png: \ - description=PNG Image;\ - file_extensions=.png;\ - icon=png;\ - action=browser - -text/html: \ - description=HTML Document;\ - file_extensions=.htm,.html;\ - icon=html - -text/plain: \ - description=Plain Text;\ - file_extensions=.text,.c,.cc,.c++,.h,.pl,.txt,.java,.el;\ - icon=text;\ - action=browser - -text/tab-separated-values: \ - description=Tab Separated Values Text;\ - file_extensions=.tsv - -text/x-setext: \ - description=Structure Enhanced Text;\ - file_extensions=.etx - -video/mpeg: \ - description=MPEG Video Clip;\ - file_extensions=.mpg,.mpe,.mpeg;\ - icon=mpeg - -video/quicktime: \ - description=QuickTime Video Clip;\ - file_extensions=.mov,.qt - -application/x-troff-msvideo: \ - description=AVI Video;\ - file_extensions=.avi;\ - icon=avi;\ - action=application;\ - application=mplayer.exe %s - -video/x-sgi-movie: \ - description=SGI Movie;\ - file_extensions=.movie,.mv - -message/rfc822: \ - description=Internet Email Message;\ - file_extensions=.mime - -application/xml: \ - description=XML document;\ - file_extensions=.xml - - diff --git a/ReplicatorG/build/windows/dist/java/lib/deploy.jar b/ReplicatorG/build/windows/dist/java/lib/deploy.jar deleted file mode 100644 index 09b22f6..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/deploy.jar and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/deploy/ffjcext.zip b/ReplicatorG/build/windows/dist/java/lib/deploy/ffjcext.zip deleted file mode 100644 index e4384d7..0000000 Binary files a/ReplicatorG/build/windows/dist/java/lib/deploy/ffjcext.zip and /dev/null differ diff --git a/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome.manifest b/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome.manifest deleted file mode 100644 index 616531d..0000000 --- a/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome.manifest +++ /dev/null @@ -1,2 +0,0 @@ -content jqs chrome/content/ -overlay chrome://browser/content/browser.xul chrome://jqs/content/overlay.xul diff --git a/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome/content/overlay.js b/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome/content/overlay.js deleted file mode 100644 index 7c2e4cf..0000000 --- a/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome/content/overlay.js +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright 2007 Sun Microsystems, Inc. All rights reserved. -// SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. -// - -// get the JQS extension directory -const id = "jqs@sun.com"; -var ext = Components.classes["@mozilla.org/extensions/manager;1"] - .getService(Components.interfaces.nsIExtensionManager) - .getInstallLocation(id) - .getItemLocation(id); - -// create an nsILocalFile for the executable -var file = Components.classes["@mozilla.org/file/local;1"] - .createInstance(Components.interfaces.nsILocalFile); - -// construct command line -file.initWithPath(ext.path + "\\..\\..\\..\\..\\bin\\jqsnotify.exe"); - -// and launch it -file.launch(); - diff --git a/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome/content/overlay.xul b/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome/content/overlay.xul deleted file mode 100644 index cd62f88..0000000 --- a/ReplicatorG/build/windows/dist/java/lib/deploy/jqs/ff/chrome/content/overlay.xul +++ /dev/null @@ -1,5 +0,0 @@ - - - +*/ +scene = window.getScene(); + +shapeChoice = new BComboBox (new String [] { + "Round", "Hex (point down)", "Hex (flat down)" }); +slopeField = new ValueField (45, ValueField.POSITIVE); +sizeField = new ValueField (10, ValueField.POSITIVE); +lengthField = new ValueField (20, ValueField.POSITIVE); +errorField = new ValueField (0.05, ValueField.POSITIVE); + +dlg = new ComponentsDialog (window, "Drill Tool", + new Widget [] {shapeChoice, slopeField, sizeField, lengthField, errorField}, + new String [] {"Shape:", "Max slope:", "Size:", "Length:", "Max error:"}); +if (!dlg.clickedOk()) { return; } + +shape = shapeChoice.getSelectedIndex(); +double theta, size, length, maxError; +theta = slopeField.getValue() * Math.PI / 180.0; +size = sizeField.getValue(); +length = lengthField.getValue(); +maxError = errorField.getValue(); +name = ""; + +double phi, angle; +switch (shape) +{ + case 0: // round + { + radius = size / 2; + errorAngle = Math.acos((radius - maxError) / radius); + numberSides = Math.ceil((Math.PI + 2 * theta) / errorAngle); + phi = (Math.PI + 2 * theta) / (numberSides - 2); + angle = ((Math.PI / 2.0) - theta); + y0 = radius / Math.sin(theta); + + name = "Teardrop"; + break; + } + case 1: // hex, point down + { + if (theta > (Math.PI / 3.0)) { theta = Math.PI / 3.0; } + radius = size / Math.sqrt(3); + numberSides = 6; + phi = Math.PI / 3.0; + angle = Math.PI / 3.0; + y0 = (radius / 2.0) + (size / (2.0 * Math.tan(theta))); + smooth = Mesh.NO_SMOOTHING; + + name = "Hexdrop(pointy)"; + break; + } + case 2: // hex, flat down + { + radius = size / Math.sqrt(3); + phi = Math.PI / 3.0; + y0 = radius / Math.tan(theta); + if (theta <= (Math.PI / 6.0)) + { + numberSides = 5; + angle = Math.PI / 2.0; + } + else + { + numberSides = 7; + angle = Math.PI / 6.0; + y0 += size; + y0 /= 2; + } + smooth = Mesh.NO_SMOOTHING; + + name = "Hexdrop(flat)"; + break; + } +} +name += " size " + size; + +// number of faces: +// for each edge in our perimeter, two triangles to connect +// the front and back, so 2*numberSides +// for each end cap, we connect each vertex to the point. The +// first and last vertices are connected by a perimeter edge, +// leaving numberSides-2 edges to connect across the middle, +// creating a face, for numberSides-2 triangles per end cap, +// or (numberSides-2)*2 triangles for both end caps +// Thus: +// 2*numberSides + 2*(numberSides-2) +// 2*numberSides + 2*numberSides - 4 +// 4*numberSides - 4 +Vec3[] v = new Vec3[numberSides * 2]; +int[][] faces = new int[4*numberSides-4][3]; +v[0] = new Vec3(0, y0, 0); +v[1] = new Vec3(0, y0, -length); +for (i = 0; i < (numberSides - 1); i++) +{ + j = i * 2; + x = Math.sin(angle + phi * i); + y = Math.cos(angle + phi * i); + v[j+2] = new Vec3(x, y, 0); + v[j+2].scale (radius); + v[j+3] = new Vec3(x, y, -length/radius); + v[j+3].scale (radius); + + faces[j][0] = j; + faces[j][1] = j+2; + faces[j][2] = j+1; + faces[j+1][0] = j+1; + faces[j+1][1] = j+2; + faces[j+1][2] = j+3; +} +//j = (numberSides-1)*2; +j = i*2; +faces[j][0] = 0; +faces[j][1] = j+1; +faces[j][2] = j; +faces[j+1][0] = 0; +faces[j+1][1] = 1; +faces[j+1][2] = j+1; + +k = j; + +for (i = 1; i < (numberSides - 1); i++) +{ + j = i * 2; + faces[j+k][0] = 0; + faces[j+k][1] = j+2; + faces[j+k][2] = j; + faces[j+k+1][0] = 1; + faces[j+k+1][1] = j+1; + faces[j+k+1][2] = j+3; +} + +mesh = new TriangleMesh (v, faces); +mesh.setSmoothingMethod(Mesh.NO_SMOOTHING); + +/* +// At this point, we've finished constructing the mesh. Now we need +// to set its smoothing properly. +if (shape != 0) // hex +{ + mesh.setSmoothingMethod(Mesh.NO_SMOOTHING); +} +else // round +{ + mesh.setSmoothingMethod(Mesh.APPROXIMATING); + edge = mesh.getEdges(); + face = mesh.getFaces(); + vert = mesh.getVertices(); + cutoffAngle = (theta < (Math.PI/4.0))?(theta*2.0):(Math.PI/2.0); + cutoff = Math.cos (cutoffAngle); + for (int i = 0; i < edge.length; i++) + { + ed = edge[i]; + f1 = face[ed.f1]; + f2 = face[ed.f2]; + norm1 = vert[f1.v1].r.minus(vert[f1.v2].r).cross(vert[f1.v1].r.minus(vert[f1.v3].r)); + norm2 = vert[f2.v1].r.minus(vert[f2.v2].r).cross(vert[f2.v1].r.minus(vert[f2.v3].r)); + norm1.normalize(); + norm2.normalize(); + ed.smoothness = (norm1.dot(norm2) < cutoff)?0.0f:1.0f; + } +} +*/ +window.addObject (mesh, new CoordinateSystem(), name, null); +undo = new UndoRecord (window, false, UndoRecord.DELETE_OBJECT, new Object[] { new Integer(window.getScene().getNumObjects()-1) }); +window.setUndoRecord (undo); diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Export GNU Triangulated Surface.bsh b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Export GNU Triangulated Surface.bsh new file mode 100644 index 0000000..bf66f5a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Export GNU Triangulated Surface.bsh @@ -0,0 +1,499 @@ +/* + + + +*/ +//later once stable remove unused preferences, all the preferences will be kept in the unused Skeinforge, finish comments for this and import +/** +Get the info for all the selected curves and meshes. +*/ + +ObjectInfo[] getCurvesMeshesInfo() +{ + scene = window.getScene(); + selection = scene.getSelection(); + Vector objectInfoVector = new Vector(); + + for ( int objectIndex = 0; objectIndex < selection.length; objectIndex++ ) { + objectInfo = scene.getObject( selection[ objectIndex ] ); + + if ( objectInfo.object instanceof TriangleMesh ) { + objectInfoVector.add( objectInfo ); + } + } + + if ( objectInfoVector.size() > 0 ) { + return objectInfoVector.toArray( new ObjectInfo[ objectInfoVector.size() ] ); + } + + for ( int objectIndex = 0; objectIndex < scene.getNumObjects(); objectIndex++ ) { + objectInfo = scene.getObject( objectIndex ); + + if ( objectInfo.object instanceof TriangleMesh ) { + return new ObjectInfo[] { objectInfo }; + } + } + + return new ObjectInfo[ 0 ]; +} + +String getEdgeString( edges, edgeTriple, vertexIndexFirst, vertexIndexSecond ) +{ + for ( int edgeTripleIndex = 0; edgeTripleIndex < edgeTriple.length; edgeTripleIndex++ ) { + edgeIndex = edgeTriple[ edgeTripleIndex ]; + edge = edges[ edgeIndex ]; + + if ( edge.v1 == vertexIndexFirst && edge.v2 == vertexIndexSecond ) { + return getPlusOneToString( edgeIndex ); + } + + if ( edge.v1 == vertexIndexSecond && edge.v2 == vertexIndexFirst ) { + return getPlusOneToString( edgeIndex ); + } + } + + print( "Inconsistent triangle mesh." ); + print( edgeTriple ); + print( vertexIndexFirst ); + print( vertexIndexSecond ); +} + +String getPlusOneToString( int number ) +{ + return ( number + 1 ).toString() ; +} + +/** +Get Vec3 rotated around X axis from counterclockwise angle and vector. + +@param angle counterclockwise angle from 1, 0 +@param vector3 Vec3 whose rotation will be returned +@return vector3 rotated around X axis +*/ + +Vec3 getRoundXAxis( double angle, Vec3 vector3 ) +{ + x = Math.cos( angle ); + y = Math.sin( angle ); + + return new Vec3( vector3.x, vector3.y * x - vector3.z * y, vector3.y * y + vector3.z * x ); +} + +/** +Get Vec3 rotated around Y axis from counterclockwise angle and vector. + +@param angle counterclockwise angle from 1, 0 +@param vector3 Vec3 whose rotation will be returned +@return vector3 rotated around Y axis +*/ + +Vec3 getRoundYAxis( double angle, Vec3 vector3 ) +{ + x = Math.cos( angle ); + y = Math.sin( angle ); + + return new Vec3( vector3.x * x - vector3.z * y, vector3.y, vector3.x * y + vector3.z * x ); +} + +/** +Get Vec3 rotated around Z axis from counterclockwise angle and vector. + +@param angle counterclockwise angle from 1, 0 +@param vector3 Vec3 whose rotation will be returned +@return vector3 rotated around Z axis +*/ + +Vec3 getRoundZAxis( double angle, Vec3 vector3 ) +{ + x = Math.cos( angle ); + y = Math.sin( angle ); + + return new Vec3( vector3.x * x - vector3.y * y, vector3.x * y + vector3.y * x, vector3.z ); +} + +/** +Output the curves and/or meshes. +*/ + +void outputCurvesMeshes( ObjectInfo[] objectInfoArray ) +{ + if ( objectInfoArray.length < 1 ) { + return; + } + + for ( int objectIndex = 0; objectIndex < objectInfoArray.length; objectIndex++ ) { + objectInfo = objectInfoArray[ objectIndex ]; + + if ( objectInfoArray.length > 1 && exportSelectionCheckbox.getState() ) { + + if ( bufferedWriter != null ) { + //Close the output stream + bufferedWriter.close(); + bufferedWriter = null; + } + + file = null; + parentFile = new File( gnuSurfaceFilenameTextField.getText() ).getParentFile(); + + if ( parentFile != null ) { + file = new File( parentFile, objectInfo.name + ".gts" ); + } + + if ( file != null ) { + bufferedWriter = new BufferedWriter( new FileWriter( file ) ); + } + } + + if ( file != null && bufferedWriter != null ) { + print( objectInfo.name + " is being saved as the GNU Triangulated Surface file " + file.getAbsolutePath() ); + } + + outputCurveMesh( objectInfo ); + + if ( bufferedWriter != null ) { + //Close the output stream + bufferedWriter.close(); + bufferedWriter = null; + } + } +} + +/** +Output the curve and/or mesh. +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. + +Follows nv lines containing the x, y and z coordinates of the vertices. Follows ne lines containing the two indices (starting from one) of the vertices of each edge. Follows nf lines containing the three ordered indices (also starting from one) of the edges of each face. + +The format described above is the least common denominator to all GTS files. Consistent with an object-oriented approach, the GTS file format is extensible. Each of the lines of the file can be extended with user-specific attributes accessible through the read() and write() virtual methods of each of the objects written (surface, vertices, edges or faces). When read with different object classes, these extra attributes are just ignored." +*/ + +void outputCurveMesh( ObjectInfo objectInfo ) +{ + triangleMesh = objectInfo.object; + edges = triangleMesh.getEdges(); + faces = triangleMesh.getFaces(); + vertexPositions = triangleMesh.getVertexPositions(); + origin = objectInfo.coords.getOrigin(); + orientation = objectInfo.coords.getRotationAngles(); + orientationXRadians = orientation[ 0 ] * Math.PI / 180.0; + orientationYRadians = orientation[ 1 ] * Math.PI / 180.0; + orientationZRadians = orientation[ 2 ] * Math.PI / 180.0; + outputString( vertexPositions.length + " " + edges.length + " " + faces.length + " Number of Vertices, Number of Edges, Number of Faces" ); + + for ( int vertexIndex = 0; vertexIndex < vertexPositions.length; vertexIndex++ ) { + vertexPosition = vertexPositions[ vertexIndex ]; + vertexPosition = getRoundZAxis( - orientationZRadians, vertexPosition ); + vertexPosition = getRoundXAxis( - orientationXRadians, vertexPosition ); + vertexPosition = getRoundYAxis( orientationYRadians, vertexPosition ); + vertexPosition.add( origin ); + vertexLine = vertexPosition.x.toString() + " " + vertexPosition.y.toString() + " " + vertexPosition.z.toString(); + + if ( vertexIndex == 0 ) { + vertexLine += " Vertex Coordinates XYZ"; + } + + outputString( vertexLine ); + } + + for ( int edgeIndex = 0; edgeIndex < edges.length; edgeIndex++ ) { + edge = edges[ edgeIndex ]; + edgeLine = getPlusOneToString( edge.v1 ) + " " + getPlusOneToString( edge.v2 ); + + if ( edgeIndex == 0 ) { + edgeLine += " Edge Vertex Indices Starting from 1"; + } + + outputString( edgeLine ); + } + + for ( int faceIndex = 0; faceIndex < faces.length; faceIndex++ ) { + face = faces[ faceIndex ]; + int[] edgeTriple = { face.e1, face.e2, face.e3 }; + + faceLine = getEdgeString( edges, edgeTriple, face.v1, face.v2 ) + " " + getEdgeString( edges, edgeTriple, face.v2, face.v3 ) + " " + getEdgeString( edges, edgeTriple, face.v3, face.v1 ); + + if ( faceIndex == 0 ) { + faceLine += " Face Edge Indices Starting from 1"; + } + + outputString( faceLine ); + } +} + +/** +Output comma separated strings followed by a linefeed. +*/ + +void outputString( string ) +{ + if ( printSelectionCheckbox.getState() ) { + print( string ); + } + + if ( bufferedWriter != null ) { + bufferedWriter.write( string.replace( ", ", "," ) + "\n" ); + } +} + +/** +Add radio button groups to the preference widgets. + +@param radioButtonGroups radio button groups which will be added to the memorable widgets +@param widgetVector memorable widgets +*/ + +void preferencesAddRadioButtonGroups( RadioButtonGroup[] radioButtonGroups, Vector widgetVector ) +{ + for ( int radioIndex = 0; radioIndex < radioButtonGroups.length; radioIndex++ ) { + radioButtonGroup = radioButtonGroups[ radioIndex ]; + radioButtonGroupIterator = radioButtonGroup.getRadioButtons(); + + while ( radioButtonGroupIterator.hasNext() ) { + radioButton = radioButtonGroupIterator.next(); + preferencesAddWidgetWithString( radioButton, radioButton.getText(), widgetVector ); + } + } +} + +/** +Add widgets which have titles. + +@param widgets widgets which have titles +@param widgetStrings widget titles +@param widgetVector memorable widgets +*/ + +void preferencesAddWidgetsWithStrings( Widget[] widgets, String[] widgetStrings, Vector widgetVector ) +{ + for ( int widgetIndex = 0; widgetIndex < widgets.length; widgetIndex++ ) { + widget = widgets[ widgetIndex ]; + + if ( widget instanceof BCheckBox || widget instanceof BOutline || widget instanceof BTextField || widget instanceof ValueField ) { + preferencesAddWidgetWithString( widget, widgetStrings[ widgetIndex ], widgetVector ); + } + } +} + +/** +Give the widget a name and add it to the widget vector. + +@param widget widget which will be given a name +@param widgetStrings widget name +@param widgetVector memorable widgets +*/ + +void preferencesAddWidgetWithString( Widget widget, String widgetString, Vector widgetVector ) +{ + widget.setName( widgetString ); + widgetVector.add( widget ); +} + +/** +Read widget settings from preferences file. + +@param preferencesFilename preferences filename +@param widgetVector memorable widgets +*/ + +void preferencesRead( String preferencesFilename, Vector widgetVector ) +{ + preferencesFile = new File( preferencesFilename ); + + if ( !preferencesFile.canRead() ) { + return; + } + + BufferedReader preferencesReader = new BufferedReader( new FileReader( preferencesFile ) ); + + line = preferencesReader.readLine(); + + while ( line != null ) { + preferencesReadLine( line, widgetVector ); + line = preferencesReader.readLine(); + } +} + +/** +Read line of preferences and set widget to that line. + +@param line line of preferences +@param widgetVector memorable widgets +*/ + +void preferencesReadLine( String line, Vector widgetVector ) +{ + splitLine = line.split( "\t" ); + + if ( splitLine.length < 2 ) { + return; + } + + name = splitLine[ 0 ]; + + for ( int widgetIndex = 0; widgetIndex < widgetVector.size(); widgetIndex++ ) { + widget = widgetVector.elementAt( widgetIndex ); + + if ( widget.getName().equals( name ) ) { + preferencesReadWidget( splitLine[ 1 ], widget ); + + return; + } + } +} + +/** +Set widget to preferences value. + +@param value preferences value +@param widget widget to be set to value +*/ + +void preferencesReadWidget( String value, Widget widget ) +{ + if ( widget instanceof BCheckBox || widget instanceof BRadioButton ) { + widget.setState( Boolean.valueOf( value ) ); + + return; + } + + if ( widget instanceof BOutline ) { // it would be better to save the value instead of index because the list might change, but I'm lazy + bList = widget.getContent().getContent(); + selectedIndex = Integer.valueOf( value ); + bList.setSelected( selectedIndex, true ); + bList.scrollToItem( selectedIndex ); + + return; + } + + if ( widget instanceof BTextField ) { + widget.setText( value ); + + return; + } + + if ( widget instanceof ValueField ) { + widget.setValue( Double.valueOf( value ) ); + } +} + +/** +Write widget settings to preferences file. + +@param preferencesFilename preferences filename +@param widgetVector memorable widgets +*/ + +void preferencesWrite( String preferencesFilename, Vector widgetVector ) +{ + preferencesFile = new File( preferencesFilename ); + + if ( preferencesFile == null ) { + print( "Can not write preferences to " + preferencesFilename ); + + return; + } + + BufferedWriter preferencesWriter = new BufferedWriter( new FileWriter( preferencesFile ) ); + + for ( int widgetIndex = 0; widgetIndex < widgetVector.size(); widgetIndex++ ) { + widget = widgetVector.elementAt( widgetIndex ); + preferencesWriteWidget( preferencesWriter, widget ); + } + + //Close the output stream + preferencesWriter.close(); +} + +/** +Write widget settings to line of preferences. + +@param preferencesWriter buffered preferences file writer +@param widget widget to be written +*/ + +void preferencesWriteWidget( BufferedWriter preferencesWriter, Widget widget ) +{ + widgetString = widget.getName() + "\t"; + + if ( widget instanceof BCheckBox || widget instanceof BRadioButton ) { + preferencesWriter.write( widgetString + widget.getState().toString() + "\n" ); + + return; + } + + if ( widget instanceof BOutline ) { // it would be better to save the value because the list might change, but I'm lazy + BList bList = widget.getContent().getContent(); + bList = widget.getContent().getContent(); + preferencesWriter.write( widgetString + bList.getSelectedIndex().toString() + "\n" ); + + return; + } + + if ( widget instanceof BTextField ) { + preferencesWriter.write( widgetString + widget.getText() + "\n" ); + + return; + } + + if ( widget instanceof ValueField ) { + preferencesWriter.write( widgetString + widget.getValue().toString() + "\n" ); + } +} + +// Set default parameters. +bufferedWriter = null; +exportSelectionCheckbox = new BCheckBox( "", false ); +file = null; +gnuSurfaceFilenameTextField = new BTextField( "triangle_mesh.gts" ); +String preferencesFilename = "gnu_triangulated_surface_preferences.csv"; +printSelectionCheckbox = new BCheckBox( "", true ); + +Widget[] widgets = new Widget[] { exportSelectionCheckbox, + printSelectionCheckbox }; + +String[] widgetStrings = new String[] { "Export Selection:", + "Print Selection:" }; + +// change the user interface parameters from default to preferences +Vector widgetVector = new Vector(); +preferencesAddWidgetsWithStrings( widgets, widgetStrings, widgetVector ); +preferencesAddWidgetWithString( gnuSurfaceFilenameTextField, "GNU Triangulated Surface Filename:", widgetVector ); +preferencesRead( preferencesFilename, widgetVector ); + +curvesMeshesInfo = getCurvesMeshesInfo(); + +if ( curvesMeshesInfo.length < 1 ) { + print( "There is no triangle mesh in the scene, so nothing will be done." ); + print( "It may be that there is a solid shape which is not a triangle mesh, in which case convert that shape to a triangle mesh." ); + + return; +} + +dialog = new ComponentsDialog( window, "Export and/or Print Selection", widgets, widgetStrings ); + +if ( !dialog.clickedOk() ) return; + +if ( exportSelectionCheckbox.getState() ) { + fileDescriptor = new BFileChooser( BFileChooser.SAVE_FILE, "Select name for the GNU Triangulated Surface file."); + fileDescriptor.setSelectedFile( new File( gnuSurfaceFilenameTextField.getText() ) ); + fileDescriptor.showDialog( window ); + file = fileDescriptor.getSelectedFile(); + + if ( file != null ) { + gnuSurfaceFilenameTextField.setText( file.getAbsolutePath() ); + bufferedWriter = new BufferedWriter( new FileWriter( file ) ); + } +} + +preferencesWrite( preferencesFilename, widgetVector ); +outputCurvesMeshes( curvesMeshesInfo ); diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Export Topology.bsh b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Export Topology.bsh new file mode 100644 index 0000000..d2a2050 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Export Topology.bsh @@ -0,0 +1,170 @@ +/* + + + +*/ + +/** +Get the info for all the selected curves and meshes. +*/ + +ObjectInfo[] getCurvesMeshesInfo() +{ + scene = window.getScene(); + selection = scene.getSelection(); + Vector objectInfoVector = new Vector(); + + for ( int objectIndex = 0; objectIndex < selection.length; objectIndex++ ) { + objectInfo = scene.getObject( selection[ objectIndex ] ); + + if ( objectInfo.object instanceof Curve || objectInfo.object instanceof TriangleMesh ) { + objectInfoVector.add( objectInfo ); + } + } + + if ( objectInfoVector.size() > 0 ) { + return objectInfoVector.toArray( new ObjectInfo[ objectInfoVector.size() ] ); + } + + for ( int objectIndex = 0; objectIndex < scene.getNumObjects(); objectIndex++ ) { + objectInfo = scene.getObject( objectIndex ); + + if ( objectInfo.object instanceof Curve || objectInfo.object instanceof TriangleMesh ) { + return new ObjectInfo[] { objectInfo }; + } + } + + return new ObjectInfo[ 0 ]; +} + +/** +Output the curves and/or meshes. +*/ + +void outputCurvesMeshes( ObjectInfo[] objectInfoArray ) +{ + if ( objectInfoArray.length < 1 ) { + return; + } + + outputCurveMesh( objectInfoArray[ 0 ] ); + + for ( int objectIndex = 1; objectIndex < objectInfoArray.length; objectIndex++ ) { + outputString( "" ); + outputCurveMesh( objectInfoArray[ objectIndex ] ); + } + + if ( bufferedWriter != null ) { + //Close the output stream + bufferedWriter.close(); + } +} + +/** +Output the curve and/or mesh. +*/ + +void outputCurveMesh( ObjectInfo objectInfo ) +{ + className = objectInfo.object.getClass().getName(); + classNameEnd = className.substring( className.lastIndexOf( "." ) + 1 ); + outputString( "Class, " + classNameEnd ); + outputString( "Name, " + objectInfo.name ); + origin = objectInfo.coords.getOrigin(); + outputString( "Origin, Vector (xyz), " + origin.x + ", " + origin.y + ", " + origin.z ); + orientation = objectInfo.coords.getRotationAngles(); + outputString( "Orientation, Vector (xyz), " + orientation[ 0 ] + ", " + orientation[ 1 ] + ", " + orientation[ 2 ] ); + outputVertexPositions( objectInfo ); + + if ( objectInfo.object instanceof Curve ) { + return; + } + + outputString( "Faces, Face Index, Vertex 1, Vertex 2, Vertex 3" ); + faces = objectInfo.object.getFaces(); + + for ( int faceIndex = 0; faceIndex < faces.length; faceIndex++ ) { + face = faces[ faceIndex ]; + outputString( "Face, " + faceIndex.toString() + ", " + face.v1 + ", " + face.v2 + ", " + face.v3 ); + } + + outputString( "Edges, Edge Index, Face 1, Face 2, Smoothness, Vertex 1, Vertex 2" ); + edges = objectInfo.object.getEdges(); + + for ( int edgeIndex = 0; edgeIndex < edges.length; edgeIndex++ ) { + edge = edges[ edgeIndex ]; + outputString( "Edge, " + edgeIndex.toString() + ", " + edge.f1 + ", " + edge.f2 + ", " + edge.smoothness + ", " + edge.v1 + ", " + edge.v2 ); + } +} + +/** +Output comma separated strings followed by a linefeed. +*/ + +void outputString( string ) +{ + if ( printSelection.getState() || exportPrintSelection.getState() ) { + print( string ); + } + + if ( bufferedWriter != null ) { + bufferedWriter.write( string.replace( ", ", "," ) + "\n" ); + } +} + +/** +Output the vertex positions. +*/ + +void outputVertexPositions( ObjectInfo objectInfo ) +{ + outputString( "VertexPositions, Vertex Index, x, y, z" ); + vertexPositions = objectInfo.object.getVertexPositions(); + + for ( int vertexIndex = 0; vertexIndex < vertexPositions.length; vertexIndex++ ) { + vertexPosition = vertexPositions[ vertexIndex ]; + outputString( "Vertex Position, " + vertexIndex.toString() + ", " + vertexPosition.x + ", " + vertexPosition.y + ", " + vertexPosition.z ); + } +} + +// Get parameters. + +actionRadioButtonGroup = new RadioButtonGroup(); +exportSelection = new BRadioButton( "Export Selection", false, actionRadioButtonGroup ); +exportPrintSelection = new BRadioButton( "Export and Print Selection", true, actionRadioButtonGroup ); +printSelection = new BRadioButton( "Print Selection", false, actionRadioButtonGroup ); +actionGridContainer = new GridContainer( 1, 3 ); +actionGridContainer.setDefaultLayout( new LayoutInfo( LayoutInfo.WEST, LayoutInfo.NONE, new Insets( 2, 2, 2, 2 ), null ) ); +actionGridContainer.add( exportSelection, 0, 0 ); +actionGridContainer.add( exportPrintSelection, 0, 1 ); +actionGridContainer.add( printSelection, 0, 2 ); + +bufferedWriter = null; +dlg = new ComponentsDialog( window, "Export and/or Print Selection", +new Widget [] { actionGridContainer }, +new String [] { "Action:" } ); + +if ( !dlg.clickedOk() ) return; + +if ( exportSelection.getState() || exportPrintSelection.getState() ) { + fileDescriptor = new BFileChooser( BFileChooser.SAVE_FILE, "Select name for the topology file."); + fileDescriptor.setSelectedFile( new File( "polygon.csv" ) ); + fileDescriptor.showDialog( window ); + filename = fileDescriptor.getSelectedFile(); + + if ( filename != null ) { + bufferedWriter = new BufferedWriter( new FileWriter( filename ) ); + } +} + +curvesMeshesInfo = getCurvesMeshesInfo(); +outputCurvesMeshes( curvesMeshesInfo ); \ No newline at end of file diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Gearweaver.bsh b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Gearweaver.bsh new file mode 100644 index 0000000..93d1cb7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Gearweaver.bsh @@ -0,0 +1,1290 @@ +/* + + + +*/ + +/** +Add a side to the bottom of the truncated shaft. + +@param bisectionRadius outer radius of shaft +@param bottomShaftPolygon bottom shaft polygon +@param currentAngle angle around the polygon +@param nodeVector nodes of the trimesh +@param sideAngle angle subtended by one side +*/ + +void addBottomSide( bisectionRadius, bottomShaftPolygon, currentAngle, nodeVector, sideAngle ) +{ + bottom = - shaftRadius * ( 1.0 - shaftTruncationBottom ); + currentSide = getPolar( currentAngle, bisectionRadius ); + nextSide = getPolar( currentAngle + sideAngle, bisectionRadius ); + + if ( bottom > nextSide.y ) { + return; + } + + if ( currentSide.y > bottom ) { + node = new Vec3( currentSide.x, currentSide.y, 0 ); + bottomShaftPolygon.add( nodeVector.size() ); + nodeVector.add( node ); + + return; + } + + shaftMinusCurrent = bottom - currentSide.y; + shaftMinusCurrent /= nextSide.y - currentSide.y; + intersection = nextSide.minus( currentSide ); + intersection.scale( shaftMinusCurrent ); + intersection.add( currentSide ); + node = new Vec3( intersection.x, intersection.y, 0 ); + bottomShaftPolygon.add( nodeVector.size() ); + nodeVector.add( node ); +} + +/** +Adds a clockwise triangle to the face array. + +@param face three index array +@param beginIndex beginning index of the triangle +@param centerIndex center index of the triangle +@param endIndex end index of the triangle +*/ + +void addFace( int beginIndex, int centerIndex, int endIndex, Vector faces ) +{ + int[] face = new int[ 3 ]; + faces.add( face ); + face[ 0 ] = beginIndex; + face[ 1 ] = centerIndex; + face[ 2 ] = endIndex; +} + +/** +Add faces between two layers of a convex concentric clockwise polygon and a convex anticlockwise polygon, both of which go around the origin. + +@param bottomOuterPolygon bottom outer polygon +@param bottomInnerPolygon bottom inner polygon +@param faceVector faces of the trimesh +@param nodeVector nodes of the trimesh +@param topOuterPolygon top outer polygon +@param topInnerPolygon top inner polygon +*/ + +void addFacesBetweenConcentricPolygons( Vector bottomInnerPolygon, Vector bottomOuterPolygon, Vector faceVector, Vector nodeVector, Vector topInnerPolygon, Vector topOuterPolygon ) +{ + oldClosestIndex = getClosestInnerIndex( bottomInnerPolygon, nodeVector, bottomOuterPolygon.elementAt( bottomOuterPolygon.size() - 1 ), bottomOuterPolygon.elementAt( 0 ) ); + + for ( int pointIndex = 0; pointIndex < bottomOuterPolygon.size(); pointIndex++ ) { + rimPlusOneRemainder = ( pointIndex + 1 ) % bottomOuterPolygon.size(); + bottomRimFirst = bottomOuterPolygon.elementAt( pointIndex ); + bottomRimSecond = bottomOuterPolygon.elementAt( rimPlusOneRemainder ); + topRimFirst = topOuterPolygon.elementAt( pointIndex ); + closestInnerIndex = getClosestInnerIndex( bottomInnerPolygon, nodeVector, bottomRimFirst, bottomRimSecond ); + addFace( bottomInnerPolygon.elementAt( closestInnerIndex ), bottomRimFirst, bottomRimSecond, faceVector ); + addFace( topInnerPolygon.elementAt( closestInnerIndex ), topOuterPolygon.elementAt( rimPlusOneRemainder ), topRimFirst, faceVector ); + + if ( closestInnerIndex > oldClosestIndex ) { + closestInnerIndex -= bottomInnerPolygon.size(); + } + + for ( int sideIndex = closestInnerIndex; sideIndex < oldClosestIndex; sideIndex++ ) { + sideRemainder = ( sideIndex + bottomInnerPolygon.size() ) % bottomInnerPolygon.size(); + sidePlusOneRemainder = ( sideIndex + bottomInnerPolygon.size() + 1 ) % bottomInnerPolygon.size(); + addFace( bottomInnerPolygon.elementAt( sidePlusOneRemainder ), bottomRimFirst, bottomInnerPolygon.elementAt( sideRemainder ), faceVector ); + addFace( topInnerPolygon.elementAt( sidePlusOneRemainder ), topInnerPolygon.elementAt( sideRemainder ), topRimFirst, faceVector ); + } + + oldClosestIndex = closestInnerIndex; + } + + return faceIndex; +} + +/** +Add faces between a bottom and top polygon. + +@param bottomPolygon bottom polygon +@param faceVector faces of the trimesh +@param topPolygon top polygon +*/ + +void addFacesBetweenPolygons( Vector bottomPolygon, Vector faceVector, Vector topPolygon ) +{ + for ( int beginIndex = 0; beginIndex < bottomPolygon.size(); beginIndex++ ) { + beginBottomIndex = bottomPolygon.elementAt( beginIndex ); + beginTopIndex = topPolygon.elementAt( beginIndex ); + endBottomIndex = bottomPolygon.elementAt( ( beginIndex + 1 ) % bottomPolygon.size() ); + endTopIndex = topPolygon.elementAt( ( beginIndex + 1 ) % bottomPolygon.size() ); + addFace( beginBottomIndex, beginTopIndex, endTopIndex, faceVector ); + addFace( beginBottomIndex, endTopIndex, endBottomIndex, faceVector ); + } +} + +/** +Add gear outline to scene. + +@param coordinateSystem coordinate system of the gear +@param name name of the gear +@param numberOfTeeth number of teeth in the gear +@param toothProfile profile of one of the teeth of the gear +*/ + +void addGear( CoordinateSystem coordinateSystem, String name, double numberOfTeeth, Vec2[] toothProfile ) +{ + int numberOfCircumferencePoints = toothProfile.length * numberOfTeeth; + Vec3[] gearVertexPositions = new Vec3[ numberOfCircumferencePoints ]; + float[] smoothness = new float[ numberOfCircumferencePoints ]; + int index = 0; + double toothAngleRadian = 2.0 * Math.PI / numberOfTeeth; + + for ( int tooth = 0; tooth < numberOfTeeth; tooth++ ) { + double totalToothAngle = - toothAngleRadian * tooth; + + for ( int toothSurface = 0; toothSurface < toothProfile.length; toothSurface++ ) { + rotatedVector = getRotatedVector( totalToothAngle, toothProfile[ toothSurface ] ); + gearVertexPositions[ index ] = new Vec3( rotatedVector.x, rotatedVector.y, 0 ); + smoothness[ index ] = 0; + index++; + } + } + + curve = new Curve( gearVertexPositions, smoothness, Mesh.APPROXIMATING, true ); + window.addObject( curve, coordinateSystem, name, null ); +} + +/** +Add the top side of the truncated shaft. + +@param bisectionRadius outer radius of the shaft +@param bottomShaftPolygon bottom shaft polygon +@param currentAngle current angle of the polygon point +@param nodeVector nodes of the trimesh +@param sideAngle angle subtended by a side of the polygon +*/ + +void addTopSide( bisectionRadius, bottomShaftPolygon, currentAngle, nodeVector, sideAngle ) +{ + top = shaftRadius; + + if ( shaftSides % 2 == 1 ) { + top = bisectionRadius; + } + + top *= ( 1.0 - shaftTruncationTop ); + currentSide = getPolar( currentAngle, bisectionRadius ); + lastSide = getPolar( currentAngle - sideAngle, bisectionRadius ); + + if ( lastSide.y > top ) { + return; + } + + if ( currentSide.y < top ) { + gearNode = new Vec3( currentSide.x, currentSide.y, 0 ); + bottomShaftPolygon.add( nodeVector.size() ); + nodeVector.add( gearNode ); + return; + } + + shaftMinusLast = top - lastSide.y; + shaftMinusLast /= currentSide.y - lastSide.y; + intersection = currentSide.minus( lastSide ); + intersection.scale( shaftMinusLast ); + intersection.add( lastSide ); + node = new Vec3( intersection.x, intersection.y, 0 ); + bottomShaftPolygon.add( nodeVector.size() ); + nodeVector.add( node ); +} + +/** +Add triangle pairs in two layers of a convex polygon. + +@param bottomPolygon bottom polygon +@param faceVector faces of the trimesh +@param topPolygon top polygon +*/ + +void addTrianglePairsInPolygon( Vector bottomPolygon, Vector faceVector, Vector topPolygon ) +{ + for ( int begin = 0; begin < ( bottomPolygon.size() - 1 ) / 2; begin++ ) { + end = bottomPolygon.size() - begin - 1; + centerIndex = bottomPolygon.elementAt( end - 1 ); + quadrilateralBegin = bottomPolygon.elementAt( begin ); + addFace( quadrilateralBegin, centerIndex, bottomPolygon.elementAt( end ), faceVector ); + centerIndex = topPolygon.elementAt( end - 1 ); + quadrilateralBegin = topPolygon.elementAt( begin ); + addFace( quadrilateralBegin, topPolygon.elementAt( end ), centerIndex, faceVector ); + } + + for ( int begin = 0; begin < bottomPolygon.size() / 2 - 1; begin++ ) { + end = bottomPolygon.size() - begin - 1; + centerIndex = bottomPolygon.elementAt( end - 1 ); + quadrilateralBegin = bottomPolygon.elementAt( begin ); + addFace( quadrilateralBegin, bottomPolygon.elementAt( begin + 1 ), centerIndex, faceVector ); + centerIndex = topPolygon.elementAt( end - 1 ); + quadrilateralBegin = topPolygon.elementAt( begin ); + addFace( quadrilateralBegin, centerIndex, topPolygon.elementAt( begin + 1 ), faceVector ); + } +} + +/** +Convert gear profile to thick gear. + +@param coordinateSystem coordinate system of the gear +@param numberOfTeeth number of teeth in the gear +@param pitchRadius pitch radius of the gear +@param shovelDirection direction that the teeth curve +@param thickName name of the solid gear, the name of the gear profile is the name of the solid gear plus " Profile" +*/ + +void convertToSolid( CoordinateSystem coordinateSystem, int numberOfTeeth, double pitchRadius, double shovelDirection, String thickName ) +{ + scene = window.getScene(); + + gearProfile = scene.getObject( thickName + " Profile" ); + gearVertexPositions = gearProfile.object.getVertexPositions(); + innerRadius = getInnerRadius( numberOfTeeth, pitchRadius ); + layers = 1 + shovelSegments; + topVertexPositionOffsets = gearVertexPositions.length * shovelSegments; + + Vector gearFaceVector = new Vector(); + Vector gearNodeVector = new Vector(); + + for ( int vertexIndex = 0; vertexIndex < gearVertexPositions.length; vertexIndex++ ) { + gearNode = new Vec3( gearVertexPositions[ vertexIndex ] ); + gearNodeVector.add( gearNode ); + } + + for ( int segmentIndex = 1; segmentIndex < layers; segmentIndex++ ) { + polarShovel = getPolar( shovelAngle, 1.0 ); + shovelWidth = 2.0 * polarShovel.y; + upRatio = ( double )segmentIndex / ( double )shovelSegments; + digY = polarShovel.y - upRatio * shovelWidth; + digRatio = Math.sqrt( 1.0 - digY * digY ) - polarShovel.x; + digRotation = shovelDirection * digRatio * thickness / pitchRadius; + up = upRatio * thickness; + + for ( int vertexIndex = 0; vertexIndex < gearVertexPositions.length; vertexIndex++ ) { + gearNode = gearNodeVector.elementAt( vertexIndex ); + rotatedGearNode = getRotatedVector( digRotation, new Vec2( gearNode.x, gearNode.y ) ); + layerNode = new Vec3( rotatedGearNode.x, rotatedGearNode.y, up ); + gearNodeVector.add( layerNode ); + } + } + + Vector bottomShaftVector = new Vector(); + Vector topShaftVector = new Vector(); + bisectionRadius = shaftRadius; + + if ( bisectionRadius > innerRadius ) { + bisectionRadius = 0.0; + shaftRadius = 0.0; + print( "The requested shaft is larger than the gear, so the shaft will not be removed." ); + } + + if ( shaftRadius > 0.0 ) { + halfSideAngle = Math.PI / shaftSides; + shaftStart = 1.5 * Math.PI + halfSideAngle; + sideAngle = 2.0 * halfSideAngle; + bisectionRadius /= Math.cos( halfSideAngle ); + int sideIndex = 0; + + for ( ; shaftStart + sideIndex * sideAngle < 2 * Math.PI; sideIndex++ ) { + currentAngle = shaftStart + sideIndex * sideAngle; + addBottomSide( bisectionRadius, bottomShaftVector, currentAngle, gearNodeVector, sideAngle ); + } + + for ( ; shaftStart + sideIndex * sideAngle < 2.5 * Math.PI + halfSideAngle / 2; sideIndex++ ) { + currentAngle = shaftStart + sideIndex * sideAngle; + addTopSide( bisectionRadius, bottomShaftVector, currentAngle, gearNodeVector, sideAngle ); + } + + originalHalfShaftLength = bottomShaftVector.size(); + mirrorStart = originalHalfShaftLength; + + if ( Math.abs( gearNodeVector.elementAt( bottomShaftVector.elementAt( originalHalfShaftLength - 1 ) ).x ) < 0.00001 ) { + mirrorStart++; + } + + for ( int sideIndex = mirrorStart; sideIndex < 2 * originalHalfShaftLength; sideIndex++ ) { + gearShaftNode = gearNodeVector.elementAt( bottomShaftVector.elementAt( 2 * originalHalfShaftLength - sideIndex - 1 ) ); + bottomShaftVector.add( gearNodeVector.size() ); + gearNodeVector.add( new Vec3( - gearShaftNode.x, gearShaftNode.y, gearShaftNode.z ) ); + } + + copyHigh( bottomShaftVector, gearNodeVector, thickness, topShaftVector ); + } + + pointsPerTooth = ( int )Math.round( gearVertexPositions.length / numberOfTeeth ); + + // Add faces around the perimeter. + + for ( int segmentIndex = 0; segmentIndex < shovelSegments; segmentIndex++ ) { + vertexPositionOffset = segmentIndex * gearVertexPositions.length; + Vector bottomPerimeter = new Vector(); + Vector topPerimeter = new Vector(); + + for ( int beginIndex = vertexPositionOffset; beginIndex < vertexPositionOffset + gearVertexPositions.length; beginIndex++ ) { + bottomPerimeter.add( beginIndex ); + topPerimeter.add( beginIndex + gearVertexPositions.length ); + } + + addFacesBetweenPolygons( bottomPerimeter, gearFaceVector, topPerimeter ); + } + + // Add faces to the top and bottom. + + Vector bottomRim = new Vector(); + Vector topRim = new Vector(); + + for ( int tooth = 0; tooth < numberOfTeeth; tooth++ ) { + toothStart = tooth * pointsPerTooth; + bottomRim.add( toothStart ); + topRim.add( toothStart + topVertexPositionOffsets ); + + Vector bottomTooth = new Vector(); + Vector topTooth = new Vector(); + + for ( int beginIndex = 0; beginIndex <= pointsPerTooth; beginIndex++ ) { + toothStartBegin = ( toothStart + beginIndex ) % gearVertexPositions.length; + bottomTooth.add( toothStartBegin ); + topTooth.add( toothStartBegin + topVertexPositionOffsets ); + } + + addTrianglePairsInPolygon( bottomTooth, gearFaceVector, topTooth ); + } + + // Add faces around cutout circles. + + rimThickness = minimumRimThickness * innerRadius; + centerThickness = bisectionRadius + rimThickness; + remainingCutout = ( 1.0 - 2 * minimumRimThickness ); + holeRadius = ( innerRadius - rimThickness - centerThickness ) / 2; + + if ( holeRadius > minimumRimCutoutRadius ) { + int cutoutCircles = 5; + int cutoutSides = 9; + double cutoutCircleAngle = 2.0 * Math.PI / ( double )cutoutCircles; + int sideBetweenStart = ( int )Math.round( ( double )cutoutSides / 7.0 ); + int sideBetweenStartMirror = cutoutSides - sideBetweenStart; + int sideBetweenEnd = ( int )Math.round( 3.0 * ( double )cutoutSides / 8.0 ); + int sideBetweenEndMirror = cutoutSides - sideBetweenEnd; + double cutoutSideAngle = 2.0 * Math.PI / ( double )cutoutSides; + double holeY = innerRadius - rimThickness - holeRadius; + double sinHalfCutoutCircleAngle = Math.sin( cutoutCircleAngle / 2 ); + double overlap = holeRadius + rimThickness / 2 - holeY * sinHalfCutoutCircleAngle; + Vector[] bottomCutoutVector = new Vector[ cutoutCircles ]; + Vector[] topCutoutVector = new Vector[ cutoutCircles ]; + + if ( overlap > 0.0 ) { + holeRadius -= overlap / ( 1.0 + sinHalfCutoutCircleAngle ); + holeY = innerRadius - rimThickness - holeRadius; + } + + for ( int circle = 0; circle < cutoutCircles; circle++ ) { + bottomCutoutVector[ circle ] = new Vector(); + topCutoutVector[ circle ] = new Vector(); + + for ( int side = 0; side < cutoutSides; side++ ) { + cutoutPlanePoint = getPolar( Math.PI * 1.5 + cutoutSideAngle * side, holeRadius ); + cutoutPlanePoint.y += holeY; + cutoutPlanePoint = getRotatedVector( - cutoutCircleAngle * circle, cutoutPlanePoint ); + gearNode = new Vec3( cutoutPlanePoint.x, cutoutPlanePoint.y, 0.0 ); + bottomCutoutVector[ circle ].add( gearNodeVector.size() ); + gearNodeVector.add( gearNode ); + } + + copyHigh( bottomCutoutVector[ circle ], gearNodeVector, thickness, topCutoutVector[ circle ] ); + + addFacesBetweenPolygons( bottomCutoutVector[ circle ], gearFaceVector, topCutoutVector[ circle ] ); + } + + Vector bottomOuterVector = new Vector(); + Vector topOuterVector = new Vector(); + + for ( int circle = cutoutCircles - 1; circle >= 0; circle-- ) { + + for ( int side = sideBetweenEnd; side <= sideBetweenEndMirror; side++ ) { + bottomOuterVector.add( bottomCutoutVector[ circle ].elementAt( side ) ); + topOuterVector.add( topCutoutVector[ circle ].elementAt( side ) ); + } + } + + addFacesBetweenConcentricPolygons( bottomOuterVector, bottomRim, gearFaceVector, gearNodeVector, topOuterVector, topRim ); + + // Add outside of cutout circles. + + bottomRim = new Vector(); + topRim = new Vector(); + + for ( int side = 0; side <= sideBetweenStart; side++ ) { + bottomRim.add( bottomCutoutVector[ 0 ].elementAt( side ) ); + topRim.add( topCutoutVector[ 0 ].elementAt( side ) ); + } + + for ( int circle = 1; circle < cutoutCircles; circle++ ) { + + for ( int side = sideBetweenStartMirror; side <= sideBetweenStart + cutoutSides; side++ ) { + sideRemainder = side % cutoutSides; + bottomRim.add( bottomCutoutVector[ circle ].elementAt( sideRemainder ) ); + topRim.add( topCutoutVector[ circle ].elementAt( sideRemainder ) ); + } + } + + for ( int side = sideBetweenStartMirror; side < cutoutSides; side++ ) { + bottomRim.add( bottomCutoutVector[ 0 ].elementAt( side ) ); + topRim.add( topCutoutVector[ 0 ].elementAt( side ) ); + } + + for ( int circle = 0; circle < cutoutCircles; circle++ ) { + Vector bottomSides = new Vector(); + Vector topSides = new Vector(); + + for ( int side = sideBetweenStart; side <= sideBetweenEnd; side++ ) { + bottomSides.add( bottomCutoutVector[ circle ].elementAt( side ) ); + topSides.add( topCutoutVector[ circle ].elementAt( side ) ); + } + + for ( int side = sideBetweenEndMirror; side <= sideBetweenStartMirror; side++ ) { + nextCircle = ( circle + 1 ) % cutoutCircles; + bottomSides.add( bottomCutoutVector[ nextCircle ].elementAt( side ) ); + topSides.add( topCutoutVector[ nextCircle ].elementAt( side ) ); + } + + addTrianglePairsInPolygon( bottomSides, gearFaceVector, topSides ); + } + } + + if ( shaftRadius == 0.0 ) { + addTrianglePairsInPolygon( bottomRim, gearFaceVector, topRim ); + } + else { + addFacesBetweenConcentricPolygons( bottomShaftVector, bottomRim, gearFaceVector, gearNodeVector, topShaftVector, topRim ); + addFacesBetweenPolygons( bottomShaftVector, gearFaceVector, topShaftVector ); + } + + int[][] gearFaceArray = gearFaceVector.toArray( new int[ gearFaceVector.size() ][ 3 ] ); + Vec3[] gearNodeArray = gearNodeVector.toArray( new Vec3[ gearNodeVector.size() ] ); + mesh = new TriangleMesh ( gearNodeArray, gearFaceArray ); + mesh.setSmoothingMethod( Mesh.NO_SMOOTHING ); + window.addObject( mesh, coordinateSystem, thickName, null ); + window.removeObject( scene.indexOf( gearProfile ), null ); +} + +/** +Copy the bottom polygon into a top polygon which is thickness high. + +@param bottomPolygon bottom polygon +@param nodeVector nodes of the trimesh +@param thickness height of the top polygon +@param topPolygon top polygon +*/ + +void copyHigh( Vector bottomPolygon, Vector nodeVector, double thickness, Vector topPolygon ) +{ + for ( int pointIndex = 0; pointIndex < bottomPolygon.size(); pointIndex++ ) { + node = nodeVector.elementAt( bottomPolygon.elementAt( pointIndex ) ); + topPolygon.add( nodeVector.size() ); + nodeVector.add( new Vec3( node.x, node.y, thickness ) ); + } +} + +/** +End the turning gear profile simulation and create the finished gear. +*/ + +void endTurnGear() +{ + scene = window.getScene(); + timer.cancel(); + firstGearCoordinateSystem.copyCoords( firstGearCoordinateSystemOld ); + secondGearCoordinateSystem.copyCoords( secondGearCoordinateSystemOld ); + + if ( sceneCameraInfo != null ) { + sceneCameraInfo.coords.copyCoords( sceneCameraCoordsOld ); + + for ( propertyIndex = 0; propertyIndex < sceneCameraPropertiesOld.length; propertyIndex++ ) { + sceneCameraInfo.object.setPropertyValue( propertyIndex, sceneCameraPropertiesOld[ propertyIndex ] ); + } + + scene.objectModified( sceneCameraInfo.object ); + } + + window.updateImage(); + + if ( thickness > 0.0 ) { + convertToSolid( firstGearCoordinateSystemOld, ( int )numberOfTeethFirstGear, pitchRadiusFirstGear, 1.0, "First Gear" ); + convertToSolid( secondGearCoordinateSystemOld, ( int )numberOfTeethSecondGear, pitchRadiusSecondGear, - 1.0, "Second Gear" ); + } + + undoAdd = new UndoRecord ( window, false, UndoRecord.DELETE_OBJECT, new Object[] { new Integer( scene.getNumObjects() - 2 ) } ); + window.setUndoRecord( undoAdd ); + undoAdd = new UndoRecord ( window, false, UndoRecord.DELETE_OBJECT, new Object[] { new Integer( scene.getNumObjects() - 1 ) } ); + window.setUndoRecord( undoAdd ); + window.updateImage(); + +// number of faces: +// for each edge in our perimeter, two triangles to connect +// the front and back, so 2*numberSides +// for each end cap, we connect each vertex to the point. The +// first and last vertices are connected by a perimeter edge, +// leaving numberSides-2 edges to connect across the middle, +// creating a face, for numberSides-2 triangles per end cap, +// or (numberSides-2)*2 triangles for both end caps +// Thus: +// 2*numberSides + 2*(numberSides-2) +// 2*numberSides + 2*numberSides - 4 +// 4*numberSides - 4 +//Vec3[] v = new Vec3[numberSides * 2]; +//int[][] faces = new int[4*numberSides-4][3]; +//v[0] = new Vec3(0, y0, 0); +//v[1] = new Vec3(0, y0, -length); +} + +/** +Get the Camera Info from the first camera in the scene. +*/ + +ObjectInfo getCameraInfo() +{ + scene = window.getScene(); + for ( int objectIndex = 0; objectIndex < scene.getNumObjects(); objectIndex++ ) { + objectInfo = scene.getObject( objectIndex ); + if ( objectInfo.object instanceof SceneCamera ) { + return objectInfo; + } + } + + return null; +} + +/** +Get the index of the point on the inner polygon which is closest to the average angle of the first and second points on the outer polygon. + +@param innerPolygon inner polygon index array +@param nodes Vector of nodes +@param outerPolygonFirstIndex index of first point on outer polygon +@param outerPolygonSecondIndex index of second point on outer polygon +@return closest index on the inner polygon to the average angle of the first and second points on the outer polygon +*/ + +int getClosestInnerIndex( Vector innerPolygon, Vector nodes, int outerPolygonFirstIndex, int outerPolygonSecondIndex ) +{ + closestIndex = 0; + largestDot = - 9999999.0; + rimFirstPlane = nodes.elementAt( outerPolygonFirstIndex ).dropAxis( 2 ); + rimSecondPlane = nodes.elementAt( outerPolygonSecondIndex ).dropAxis( 2 ); + rimFirstPlane.normalize(); + rimSecondPlane.normalize(); + rimFirstPlane.add( rimSecondPlane ); + rimFirstPlane.normalize(); + + for ( int innerIndex = 0; innerIndex < innerPolygon.size(); innerIndex++ ) { + innerPlane = nodes.elementAt( innerPolygon.elementAt( innerIndex ) ).dropAxis( 2 ); + innerPlane.normalize(); + innerDot = innerPlane.dot( rimFirstPlane ); + + if ( innerDot > largestDot ) { + largestDot = innerDot; + closestIndex = innerIndex; + } + } + + return closestIndex; +} + +/** +Get number of teeth from the field value if it is not zero bounded to a minimum of 3, otherwise get number from the prime list. + +@param primeList scroll list of prime numbers +@param numberOfTeethValueField number of gear teeth value field +@return number of gear teeth +*/ + +double getNumberOfTeeth( BList primeList, ValueField numberOfTeethValueField ) +{ + if ( numberOfTeethValueField.getValue() < 1.0 ) { + return Double.valueOf( primeList.getSelectedValue() ); + } + + return Math.max( 2, Math.round( numberOfTeethValueField.getValue() ) ); +} + +/** +Get gear inner radius. + +@param numberOfTeeth number of gear teeth +@param pitchRadius pitch radius of the gear +@return gear inner radius +*/ + +double getInnerRadius( double numberOfTeeth, double pitchRadius ) +{ + return pitchRadius * ( 1 - Math.PI / numberOfTeeth ); +} + +/** +Get ratio outside of the pitch. + +@param numberOfTeeth number of gear teeth +@param pitchRadius pitch radius of the gear +@return ratio outside of the pitch +*/ + +double getOutsidePitch( double numberOfTeeth ) +{ + return 2.0 / numberOfTeeth; +} + +/** +Get ratio of second gear according to the number of teeth. + +@param numberOfTeethFirstGear number of gear teeth on the first gear +@param numberOfTeethSecondGear number of gear teeth on the second gear +@param pitchRadiusFirstGear pitch radius of the first gear +@return ratio of second gear +*/ + +double getPitchRadiusSecondGear( double numberOfTeethFirstGear, double numberOfTeethSecondGear, double pitchRadiusFirstGear ) +{ + return pitchRadiusFirstGear * numberOfTeethSecondGear / numberOfTeethFirstGear;; +} + +/** +Get polar Vec2 from counterclockwise angle from 1, 0 and radius. + +@param angle counterclockwise angle from 1, 0 +@param radius radius of vector +@return polar vector +*/ + +Vec2 getPolar( double angle, double radius ) +{ + return new Vec2( radius * Math.cos( angle ), radius * Math.sin( angle ) ); +} + +/** +Get scroll list of prime numbers, with visible selection. + +@param selectedIndex selected index of the scroll list +@return scroll list of prime numbers +*/ + +BList getPrimeList( int selectedIndex ) +{ + String[] primeNumberStrings = new String[ primeNumbers.length ]; + + for ( int primeIndex = 0; primeIndex < primeNumbers.length; primeIndex++ ) { + primeNumberStrings[ primeIndex ] = primeNumbers[ primeIndex ].toString(); + } + + primeList = new BList( primeNumberStrings ); + primeList.setPreferredVisibleRows( ( int )Math.max( 4.0, selectedIndex + 1 ) ); + primeList.setMultipleSelectionEnabled( false ); + primeList.setSelected( selectedIndex, true ); + primeList.scrollToItem( selectedIndex ); + + return primeList; +} + +/** +Get rotated Vec2 from counterclockwise angle and vector. + +@param angle counterclockwise angle from 1, 0 +@param vector2 plane vector +@return rotated vector +*/ + +Vec2 getRotatedVector( double angle, Vec2 vector2 ) +{ + x = Math.cos( angle ); + y = Math.sin( angle ); + + return new Vec2( vector2.x * x - vector2.y * y, vector2.x * y + vector2.y * x ); +} + +/** +Get profile for one tooth. + +@param numberOfTeeth number of gear teeth +@param pitchRadius pitch radius of the gear +@param pressureAngle pressure angle of the gear tooth +@param profileDefinitionSurfaces profile definition surfaces, which should be at least six +@return profile for one tooth +*/ + +Vec2[] getToothProfile( double numberOfTeeth, double pitchRadius, double pressureAngle, int profileDefinitionSurfaces ) +{ + double toothAngleRadian = 2.0 * Math.PI / numberOfTeeth; + double innerRadius = getInnerRadius( numberOfTeeth, pitchRadius ); + double outerRadius = pitchRadius * ( 1 + getOutsidePitch( numberOfTeeth ) ); + double bevelRadius = pitchRadius * Math.cos( pressureAngle ); + double angleBeginRadian = Math.PI / 2 - toothAngleRadian / 4 + pressureAngle - pitchRadius * Math.sin( pressureAngle ) / bevelRadius; + double angleEndRadian = Math.sqrt( outerRadius * outerRadius - bevelRadius * bevelRadius ) / bevelRadius + angleBeginRadian; + double angleDifferenceRadian = ( angleEndRadian - angleBeginRadian ) / ( profileDefinitionSurfaces - 1 ); + Vector toothProfileVector = new Vector(); + + toothProfileVector.add( getPolar( Math.PI - angleBeginRadian, innerRadius ) ); + + angleRadian = angleBeginRadian; + abovePoint = null; + pointMoved = false; + + for ( int profileIndex = 0; profileIndex < profileDefinitionSurfaces; profileIndex++ ) { + length = bevelRadius * ( angleRadian - angleBeginRadian ); + toothPoint = new Vec2( - bevelRadius, length ); + toothPoint = getRotatedVector( angleRadian, toothPoint ); + toothPoint.y = - toothPoint.y; + toothProfileVector.add( toothPoint ); + angleRadian = angleRadian + angleDifferenceRadian; + + if ( toothPoint.length() > innerRadius ) { + + if ( abovePoint == null ) { + abovePoint = toothPoint; + } + } + } + + // Move out, remove or replace the points which are inside the inner radius. + + for ( int profileIndex = profileDefinitionSurfaces-1; profileIndex >= 1; profileIndex-- ) { + toothProfileLength = toothProfileVector.elementAt( profileIndex ).length(); + + if ( toothProfileLength < innerRadius ) { + + if ( pointMoved ) { + toothProfileVector.removeElementAt( profileIndex ); + } + else { + lengthBelow = innerRadius - toothProfileLength; + toothPoint = toothProfileVector.elementAt( profileIndex ); + lastMinusShort = abovePoint.minus( toothPoint ); + lastMinusShort.scale( lengthBelow / lastMinusShort.length() ); + toothPoint.add( lastMinusShort ); + pointMoved = true; + } + } + } + + if ( pointMoved ) { + toothProfileVector.removeElementAt( 0 ); + } + + // Mirror the tooth profile. + + int toothProfileLimit = toothProfileVector.size() - 1; + + for ( int profileIndex = toothProfileLimit; profileIndex >= 0; profileIndex-- ) { + toothPoint = toothProfileVector.elementAt( profileIndex ); + toothProfileVector.add( new Vec2( - toothPoint.x, toothPoint.y ) ); + } + + return toothProfileVector.toArray( new Vec2[ toothProfileVector.size() ] ); +} + +/** +Add radio button groups to the preference widgets. + +@param radioButtonGroups radio button groups which will be added to the memorable widgets +@param widgetVector memorable widgets +*/ + +void preferencesAddRadioButtonGroups( RadioButtonGroup[] radioButtonGroups, Vector widgetVector ) +{ + for ( int radioIndex = 0; radioIndex < radioButtonGroups.length; radioIndex++ ) { + radioButtonGroup = radioButtonGroups[ radioIndex ]; + radioButtonGroupIterator = radioButtonGroup.getRadioButtons(); + + while ( radioButtonGroupIterator.hasNext() ) { + radioButton = radioButtonGroupIterator.next(); + preferencesAddWidgetWithString( radioButton, radioButton.getText(), widgetVector ); + } + } +} + +/** +Add widgets which have titles. + +@param widgets widgets which have titles +@param widgetStrings widget titles +@param widgetVector memorable widgets +*/ + +void preferencesAddWidgetsWithStrings( Widget[] widgets, String[] widgetStrings, Vector widgetVector ) +{ + for ( int widgetIndex = 0; widgetIndex < widgets.length; widgetIndex++ ) { + widget = widgets[ widgetIndex ]; + + if ( widget instanceof BCheckBox || widget instanceof BOutline || widget instanceof BTextField || widget instanceof ValueField ) { + preferencesAddWidgetWithString( widget, widgetStrings[ widgetIndex ], widgetVector ); + } + } +} + +/** +Give the widget a name and add it to the widget vector. + +@param widget widget which will be given a name +@param widgetStrings widget name +@param widgetVector memorable widgets +*/ + +void preferencesAddWidgetWithString( Widget widget, String widgetString, Vector widgetVector ) +{ + widget.setName( widgetString ); + widgetVector.add( widget ); +} + +/** +Read widget settings from preferences file. + +@param preferencesFilename preferences filename +@param widgetVector memorable widgets +*/ + +void preferencesRead( String preferencesFilename, Vector widgetVector ) +{ + preferencesFile = new File( preferencesFilename ); + + if ( !preferencesFile.canRead() ) { + return; + } + + BufferedReader preferencesReader = new BufferedReader( new FileReader( preferencesFile ) ); + + line = preferencesReader.readLine(); + + while ( line != null ) { + preferencesReadLine( line, widgetVector ); + line = preferencesReader.readLine(); + } +} + +/** +Read line of preferences and set widget to that line. + +@param line line of preferences +@param widgetVector memorable widgets +*/ + +void preferencesReadLine( String line, Vector widgetVector ) +{ + splitLine = line.split( "\t" ); + + if ( splitLine.length < 2 ) { + return; + } + + name = splitLine[ 0 ]; + + for ( int widgetIndex = 0; widgetIndex < widgetVector.size(); widgetIndex++ ) { + widget = widgetVector.elementAt( widgetIndex ); + + if ( widget.getName().equals( name ) ) { + preferencesReadWidget( splitLine[ 1 ], widget ); + + return; + } + } +} + +/** +Set widget to preferences value. + +@param value preferences value +@param widget widget to be set to value +*/ + +void preferencesReadWidget( String value, Widget widget ) +{ + if ( widget instanceof BCheckBox || widget instanceof BRadioButton ) { + widget.setState( Boolean.valueOf( value ) ); + + return; + } + + if ( widget instanceof BOutline ) { // it would be better to save the value instead of index because the list might change, but I'm lazy + bList = widget.getContent().getContent(); + selectedIndex = Integer.valueOf( value ); + bList.setSelected( selectedIndex, true ); + bList.scrollToItem( selectedIndex ); + + return; + } + + if ( widget instanceof BTextField ) { + widget.setText( value ); + + return; + } + + if ( widget instanceof ValueField ) { + widget.setValue( Double.valueOf( value ) ); + } +} + +/** +Write widget settings to preferences file. + +@param preferencesFilename preferences filename +@param widgetVector memorable widgets +*/ + +void preferencesWrite( String preferencesFilename, Vector widgetVector ) +{ + preferencesFile = new File( preferencesFilename ); + + if ( preferencesFile == null ) { + print( "Can not write preferences to " + preferencesFilename ); + + return; + } + + BufferedWriter preferencesWriter = new BufferedWriter( new FileWriter( preferencesFile ) ); + + for ( int widgetIndex = 0; widgetIndex < widgetVector.size(); widgetIndex++ ) { + widget = widgetVector.elementAt( widgetIndex ); + preferencesWriteWidget( preferencesWriter, widget ); + } + + //Close the output stream + preferencesWriter.close(); +} + +/** +Write widget settings to line of preferences. + +@param preferencesWriter buffered preferences file writer +@param widget widget to be written +*/ + +void preferencesWriteWidget( BufferedWriter preferencesWriter, Widget widget ) +{ + widgetString = widget.getName() + "\t"; + + if ( widget instanceof BCheckBox || widget instanceof BRadioButton ) { + preferencesWriter.write( widgetString + widget.getState().toString() + "\n" ); + + return; + } + + if ( widget instanceof BOutline ) { // it would be better to save the value because the list might change, but I'm lazy + BList bList = widget.getContent().getContent(); + bList = widget.getContent().getContent(); + preferencesWriter.write( widgetString + bList.getSelectedIndex().toString() + "\n" ); + + return; + } + + if ( widget instanceof BTextField ) { + preferencesWriter.write( widgetString + widget.getText() + "\n" ); + + return; + } + + if ( widget instanceof ValueField ) { + preferencesWriter.write( widgetString + widget.getValue().toString() + "\n" ); + } +} + +/** +Set the coordinate system to a rotation around the z axis in degrees. + +@param coordinateSystem coordinate system with rotations defined around the x, y, z axes in degrees +@param rotationDegree axis rotation angle in degrees +*/ + +void setCoordinateSystemToRotationDegree( CoordinateSystem coordinateSystem, double rotationDegree ) +{ + coordinateSystem.setOrientation( 0.0, 0.0, rotationDegree ); +} + +// Trim outer tooth of the first gear which collides with the second gear. + +void trimCollision( double numberOfTeethFirstGear, double numberOfTeethSecondGear, double pitchRadiusFirstGear, Vec2[] toothProfileFirstGear, Vec2[] toothProfileSecondGear ) +{ + maximumAngle = Math.PI / 8; + + if ( numberOfTeethFirstGear > numberOfTeethSecondGear ) { + maximumAngle *= numberOfTeethSecondGear / numberOfTeethFirstGear; + } + + for ( double angle = 0.0; angle < maximumAngle; angle += 0.01 ) { + trimCollisionAtAngle( angle, numberOfTeethFirstGear, numberOfTeethSecondGear, pitchRadiusFirstGear, toothProfileFirstGear, toothProfileSecondGear ); + } +} + +// Trim outer tooth of the first gear which collides with the second gear at an angle. + +void trimCollisionAtAngle( double angle, double numberOfTeethFirstGear, double numberOfTeethSecondGear, double pitchRadiusFirstGear, Vec2[] toothProfileFirstGear, Vec2[] toothProfileSecondGear ) +{ + double pitchRadiusSecondGear = getPitchRadiusSecondGear( numberOfTeethFirstGear, numberOfTeethSecondGear, pitchRadiusFirstGear ); + + toothProfileSecondGearRotated = new Vec2[ toothProfileSecondGear.length ]; + rotationSecondGear = Math.PI - Math.PI / numberOfTeethSecondGear - angle * numberOfTeethFirstGear / numberOfTeethSecondGear; + + for ( int profilePointIndex = 0; profilePointIndex < toothProfileSecondGear.length; profilePointIndex++ ) { + rotated = getRotatedVector( rotationSecondGear, toothProfileSecondGear[ profilePointIndex ] ); + rotated.y += pitchRadiusFirstGear + pitchRadiusSecondGear; + toothProfileSecondGearRotated[ profilePointIndex ] = getRotatedVector( - angle, rotated ); + } + + for ( int profilePointIndex = 0; profilePointIndex < toothProfileFirstGear.length; profilePointIndex++ ) { + trimCollisionProfilePoint( profilePointIndex, toothProfileFirstGear, toothProfileSecondGearRotated ); + } +} + +// Trim point from first gear which collides with the second gear. + +void trimCollisionProfilePoint( int profilePointIndex, Vec2[] toothProfileFirstGear, Vec2[] toothProfileSecondGearRotated ) +{ + firstGearProfilePoint = toothProfileFirstGear[ profilePointIndex ]; + + if ( firstGearProfilePoint.length() < pitchRadiusFirstGear ) { + return; + } + + if ( firstGearProfilePoint.x > 0.0 ) { + return; + } + + for ( int secondGearPointIndex = 0; secondGearPointIndex < toothProfileSecondGearRotated.length - 1; secondGearPointIndex++ ) { + firstPointSecondGear = toothProfileSecondGearRotated[ secondGearPointIndex ]; + secondPointSecondGear = toothProfileSecondGearRotated[ secondGearPointIndex + 1 ]; + firstPointAbove = firstPointSecondGear.y - firstGearProfilePoint.y; + secondPointAbove = secondPointSecondGear.y - firstGearProfilePoint.y; + + if ( firstPointAbove * secondPointAbove <= 0.0 ) { + verticalSeparation = firstPointSecondGear.y - secondPointSecondGear.y; + horizontalToothAxisIntersection = firstPointSecondGear.minus( secondPointSecondGear ); + horizontalToothAxisIntersection.scale( - secondPointAbove / verticalSeparation ); + horizontalToothAxisIntersection.add( secondPointSecondGear ); + collision = horizontalToothAxisIntersection.x - firstGearProfilePoint.x; + + if ( collision > 0.0 ) { + firstGearProfilePoint.x += collision; + mirrorPointIndex = toothProfileFirstGear.length - 1 - profilePointIndex; + toothProfileFirstGear[ mirrorPointIndex ].x -= collision; + } + } + } +} + +// Trim outer tooth by tolerance. + +void trimTolerance( double numberOfTeeth, double pitchRadius, double tolerance, Vec2[] toothProfile ) +{ + if ( tolerance == 0.0 ) { + return; + } + + double otherGearStart = pitchRadius * ( 1 - getOutsidePitch( numberOfTeeth ) ) - tolerance; + double innerRadius = getInnerRadius( numberOfTeeth, pitchRadius ); + + for ( int profilePointIndex = 0; profilePointIndex < toothProfile.length; profilePointIndex++ ) { + toothProfilePoint = toothProfile[ profilePointIndex ]; + toothProfilePointLength = toothProfilePoint.length(); + shortenRatio = 1.0; + + if ( toothProfilePointLength < otherGearStart ) { + shortenRatio = ( toothProfilePointLength - innerRadius ) / ( otherGearStart - innerRadius ); + shortenRatio = Math.max( 0.0, shortenRatio ); + } + + xAbsolute = Math.abs( toothProfilePoint.x ); + xAbsoluteTrimmed = xAbsolute - tolerance * shortenRatio; + xAbsoluteTrimmed = Math.max( 0.0, xAbsoluteTrimmed ); + + if ( xAbsolute > 0.0 ) { + toothProfilePoint.x *= xAbsoluteTrimmed / xAbsolute; + } + } +} + +// Get parameters. + +int[] primeNumbers = { 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149 }; +firstGearPrimeList = getPrimeList( 6 ); +numberOfTeethFirstGearValueField = new ValueField( 0, ValueField.NONNEGATIVE ); +pitchRadiusFirstGearValueField = new ValueField( 75, ValueField.NONNEGATIVE ); +secondGearPrimeList = getPrimeList( 1 ); +numberOfTeethSecondGearValueField = new ValueField( 0, ValueField.NONNEGATIVE ); +minimumRimCutoutRadiusValueField = new ValueField( 2.0, ValueField.NONNEGATIVE ); +minimumRimThicknessValueField = new ValueField( 0.2, ValueField.NONNEGATIVE ); +String preferencesFilename = "gearweaver_preferences.csv"; +pressureAngleDegreeValueField = new ValueField( 20, ValueField.NONNEGATIVE ); +profileDefinitionValueField = new ValueField( 9, ValueField.NONNEGATIVE ); +shaftRadiusValueField = new ValueField( 5.0, ValueField.NONNEGATIVE); +shaftSidesValueField = new ValueField( 4.0, ValueField.NONNEGATIVE); +shaftTruncationBottomValueField = new ValueField( 0.0, ValueField.NONNEGATIVE); +shaftTruncationTopValueField = new ValueField( 0.0, ValueField.NONNEGATIVE); +shovelAngleValueField = new ValueField( 20.0, ValueField.NONNEGATIVE); +shovelSegmentsValueField = new ValueField( 3, ValueField.NONNEGATIVE); +//simulationDurationValueField = new ValueField( 10, ValueField.NONNEGATIVE); +simulationDurationValueField = new ValueField( 0, ValueField.NONNEGATIVE); +simulationRotationRateValueField = new ValueField( 0.1, ValueField.NONNEGATIVE ); +thicknessValueField = new ValueField( 30.0, ValueField.NONNEGATIVE ); +//thicknessValueField = new ValueField( 0.0, ValueField.NONNEGATIVE ); +toleranceValueField = new ValueField( 0.0, ValueField.NONNEGATIVE ); + +Widget[] widgets = new Widget [] { UIUtilities.createScrollingList( firstGearPrimeList ), + numberOfTeethFirstGearValueField, + pitchRadiusFirstGearValueField, + UIUtilities.createScrollingList( secondGearPrimeList ), + numberOfTeethSecondGearValueField, + minimumRimCutoutRadiusValueField, + minimumRimThicknessValueField, + pressureAngleDegreeValueField, + profileDefinitionValueField, + shaftRadiusValueField, + shaftSidesValueField, + shaftTruncationBottomValueField, + shaftTruncationTopValueField, + shovelAngleValueField, + shovelSegmentsValueField, + simulationDurationValueField, + simulationRotationRateValueField, + thicknessValueField, + toleranceValueField }; + +String[] widgetStrings = new String [] { "Number of Teeth for First Gear (prime):", + "or Number of Teeth for First Gear (integer):", + "Pitch Radius First Gear (mm):", + "Number of Teeth for Second Gear (prime):", + "or Number of Teeth for Second Gear (integer):", + "Minimum Rim Cutout Radius (mm):", + "Minimum Rim Thickness (ratio):", + "Pressure Angle (degrees):", + "Profile Definition (surfaces):", + "Shaft Radius (mm):", + "Shaft Sides (surfaces):", + "Shaft Truncation Bottom (ratio):", + "Shaft Truncation Top (ratio):", + "Shovel Angle (degrees):", + "Shovel Segments (surfaces):", + "Simulation Duration (seconds):", + "Simulation Rotation Rate (teeth / second):", + "Thickness (mm):", + "Tolerance (mm):" }; + +// change the user interface parameters from default to preferences +Vector widgetVector = new Vector(); +preferencesAddWidgetsWithStrings( widgets, widgetStrings, widgetVector ); +preferencesRead( preferencesFilename, widgetVector ); + +dialog = new ComponentsDialog( window, "Gearweaver Generator", widgets, widgetStrings ); + +if ( !dialog.clickedOk() ) return; + +preferencesWrite( preferencesFilename, widgetVector ); + +double numberOfTeethFirstGear = getNumberOfTeeth( firstGearPrimeList, numberOfTeethFirstGearValueField ); +double numberOfTeethSecondGear = getNumberOfTeeth( secondGearPrimeList, numberOfTeethSecondGearValueField ); +double pitchRadiusFirstGear = pitchRadiusFirstGearValueField.getValue(); +double pitchRadiusSecondGear = getPitchRadiusSecondGear( numberOfTeethFirstGear, numberOfTeethSecondGear, pitchRadiusFirstGear ); +double minimumRimCutoutRadius = minimumRimCutoutRadiusValueField.getValue(); +double minimumRimThickness = minimumRimThicknessValueField.getValue(); +int profileDefinitionSurfaces = ( int )Math.max( 1.0, Math.min( 30.0, profileDefinitionValueField.getValue() ) ); +double pressureAngle = pressureAngleDegreeValueField.getValue() * Math.PI / 180.0; +double shaftRadius = shaftRadiusValueField.getValue(); +int shaftSides = ( int )Math.max( 3.0, shaftSidesValueField.getValue() ); +double shaftTruncationBottom = shaftTruncationBottomValueField.getValue(); +double shaftTruncationTop = shaftTruncationTopValueField.getValue(); +double shovelAngle = shovelAngleValueField.getValue() * Math.PI / 180.0; +int shovelSegments = ( int )Math.max( 1.0, shovelSegmentsValueField.getValue() ); +double simulationDuration = simulationDurationValueField.getValue(); +double simulationRotationRate = simulationRotationRateValueField.getValue(); +double thickness = thicknessValueField.getValue(); +double tolerance = toleranceValueField.getValue(); + +// Create gear pair. + +toothProfileFirstGear = getToothProfile( numberOfTeethFirstGear, pitchRadiusFirstGear, pressureAngle, profileDefinitionSurfaces ); +toothProfileSecondGear = getToothProfile( numberOfTeethSecondGear, pitchRadiusSecondGear, pressureAngle, profileDefinitionSurfaces ); + +trimCollision( numberOfTeethFirstGear, numberOfTeethSecondGear, pitchRadiusFirstGear, toothProfileFirstGear, toothProfileSecondGear ); +trimCollision( numberOfTeethSecondGear, numberOfTeethFirstGear, pitchRadiusSecondGear, toothProfileSecondGear, toothProfileFirstGear ); + +firstGearCoordinateSystem = new CoordinateSystem(); +firstGearCoordinateSystemOld = firstGearCoordinateSystem.duplicate(); +trimTolerance( numberOfTeethFirstGear, pitchRadiusFirstGear, tolerance, toothProfileFirstGear ); +addGear( firstGearCoordinateSystem, "First Gear Profile", numberOfTeethFirstGear, toothProfileFirstGear ); + +secondGearCoordinateSystem = new CoordinateSystem(); +secondGearCoordinateSystem.setOrigin( new Vec3( 0.0, pitchRadiusFirstGear + pitchRadiusSecondGear, 0.0 ) ); +secondGearCoordinateOffsetDegree = 180.0 * ( numberOfTeethSecondGear % 2 + 1 ) / numberOfTeethSecondGear; +setCoordinateSystemToRotationDegree( secondGearCoordinateSystem, secondGearCoordinateOffsetDegree ); +secondGearCoordinateSystemOld = secondGearCoordinateSystem.duplicate(); +trimTolerance( numberOfTeethSecondGear, pitchRadiusSecondGear, tolerance, toothProfileSecondGear ); +addGear( secondGearCoordinateSystem, "Second Gear Profile", numberOfTeethSecondGear, toothProfileSecondGear ); + +import java.util.Timer; +import java.util.TimerTask; + +Timer timer = new Timer(); + +startTime = System.currentTimeMillis(); +sceneCameraInfo = getCameraInfo(); +sceneCameraCoordsOld = null; +sceneCameraPropertiesOld = null; + +if ( sceneCameraInfo != null ) { + sceneCameraCoordsOld = sceneCameraInfo.coords.duplicate(); + sceneCamera = sceneCameraInfo.object; + properties = sceneCamera.getProperties(); + propertiesLength = properties.length; + sceneCameraPropertiesOld = new double[ propertiesLength ]; + + for ( propertyIndex = 0; propertyIndex < propertiesLength; propertyIndex++ ) { + sceneCameraPropertiesOld[ propertyIndex ] = sceneCamera.getPropertyValue( propertyIndex ); + propertyName = properties[ propertyIndex ].getName(); + + if ( propertyName.equals( "Depth of Field" ) ) { + sceneCamera.setPropertyValue( propertyIndex, 10.0 ); + } + + if ( propertyName.equals( "Field of View" ) ) { + sceneCamera.setPropertyValue( propertyIndex, 30.0 ); + } + + if ( propertyName.equals( "Focal Distance" ) ) { + sceneCamera.setPropertyValue( propertyIndex, 20.0 ); + } + } + sceneCameraInfo.coords.setOrigin( new Vec3( 0.0, pitchRadiusFirstGear, 15.0 * pitchRadiusFirstGear / numberOfTeethFirstGear ) ); + sceneCameraInfo.coords.setOrientation( 0.0, 180.0, 0.0 ); + sceneCameraInfo.coords.setOrientation( 0.0, 180.0, 0.0 ); +} + +public final class TurnGear extends TimerTask { + /** + * Implements TimerTask's abstract run method. + */ + public void run() { + elapsed = ( System.currentTimeMillis() - startTime ) / 1000.0; + elapsedRotation = 360.0 * elapsed * simulationRotationRate; + setCoordinateSystemToRotationDegree( firstGearCoordinateSystem, - elapsedRotation / numberOfTeethFirstGear ); + setCoordinateSystemToRotationDegree( secondGearCoordinateSystem, elapsedRotation / numberOfTeethSecondGear + secondGearCoordinateOffsetDegree ); + scene = window.getScene(); + scene.objectModified( scene.getObject( "First Gear Profile" ).object ); + scene.objectModified( scene.getObject( "Second Gear Profile" ).object ); + window.updateImage(); + + if ( elapsed > simulationDuration ) { + endTurnGear(); + } + } +} + +TimerTask turnGear = new TurnGear(); +timer.scheduleAtFixedRate( turnGear, 0, 13 ); \ No newline at end of file diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Import GNU Triangulated Surface.bsh b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Import GNU Triangulated Surface.bsh new file mode 100644 index 0000000..09c7633 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Import GNU Triangulated Surface.bsh @@ -0,0 +1,399 @@ +/* + + + +*/ + +/** +Add a delete the last object of the scene undo record, to the scene. +*/ + +void addUndoRecord() { + scene = window.getScene(); + undoAdd = new UndoRecord ( window, false, UndoRecord.DELETE_OBJECT, new Object[] { new Integer( scene.getNumObjects() - 1 ) } ); + window.setUndoRecord( undoAdd ); +} + +int getSameVertexIndex( edgeFirst, edgeSecond ) +{ + for ( int endpointIndex = 0; endpointIndex < 2; endpointIndex++ ) { + endpoint = edgeFirst[ endpointIndex ]; + + if ( endpoint == edgeSecond[ 0 ] ) { + return endpoint; + } + + if ( endpoint == edgeSecond[ 1 ] ) { + return endpoint; + } + } + + print( "Inconsistent GNU Triangulated Surface" ); + print( edgeFirst ); + print( edgeSecond ); + return 0; +} + +/** +Import GNU Triangulated Surface from a file. +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. + +Follows nv lines containing the x, y and z coordinates of the vertices. Follows ne lines containing the two indices (starting from one) of the vertices of each edge. Follows nf lines containing the three ordered indices (also starting from one) of the edges of each face. + +The format described above is the least common denominator to all GTS files. Consistent with an object-oriented approach, the GTS file format is extensible. Each of the lines of the file can be extended with user-specific attributes accessible through the read() and write() virtual methods of each of the objects written (surface, vertices, edges or faces). When read with different object classes, these extra attributes are just ignored." +*/ + +void importFile( gnuFile ) +{ + bufferedReader = new BufferedReader( new FileReader( gnuFile ) ); + Vector lineVector = new Vector(); + line = bufferedReader.readLine(); + name = gnuFile.getName(); + int lastIndexOfDot = name.lastIndexOf( '.' ); + + if ( lastIndexOfDot > 0 ) { + name = name.substring( 0, lastIndexOfDot ); + } + + while ( line != null ) { + + if ( line.length() > 0 ) { + firstCharacter = line.charAt( 0 ); + + if ( firstCharacter != '#' && firstCharacter != '!' ) { + lineVector.add( line ); + } + } + + line = bufferedReader.readLine(); + } + + splitLine = lineVector.get( 0 ).split( " " ); + int numberOfVertices = Integer.valueOf( splitLine[ 0 ] ); + int numberOfEdges = Integer.valueOf( splitLine[ 1 ] ); + int numberOfFaces = Integer.valueOf( splitLine[ 2 ] ); + edges = new int[ numberOfEdges ][ 2 ]; + faces = new int[ numberOfFaces ][ 3 ]; + vertices = new Vec3[ numberOfVertices ]; + + for ( int vertexIndex = 0; vertexIndex < numberOfVertices; vertexIndex++ ) { + line = lineVector.get( vertexIndex + 1 ); + splitLine = line.split( " " ); + vertex = new Vec3( Double.valueOf( splitLine[ 0 ] ), Double.valueOf( splitLine[ 1 ] ), Double.valueOf( splitLine[ 2 ] ) ); + vertices[ vertexIndex ] = vertex; + } + + int edgeStart = numberOfVertices + 1; + + for ( int edgeIndex = 0; edgeIndex < numberOfEdges; edgeIndex++ ) { + line = lineVector.get( edgeIndex + edgeStart ); + splitLine = line.split( " " ); + int[] edge = { Integer.valueOf( splitLine[ 0 ] ) - 1, Integer.valueOf( splitLine[ 1 ] ) - 1 }; + edges[ edgeIndex ] = edge; + } + + int faceStart = edgeStart + numberOfEdges; + + for ( int faceIndex = 0; faceIndex < numberOfFaces; faceIndex++ ) { + line = lineVector.get( faceIndex + faceStart ); + splitLine = line.split( " " ); + edgeFirst = edges[ Integer.valueOf( splitLine[ 0 ] ) - 1 ]; + edgeSecond = edges[ Integer.valueOf( splitLine[ 1 ] ) - 1 ]; + edgeThird = edges[ Integer.valueOf( splitLine[ 2 ] ) - 1 ]; + int[] vertexIndices = { getSameVertexIndex( edgeFirst, edgeSecond ), getSameVertexIndex( edgeSecond, edgeThird ), getSameVertexIndex( edgeThird, edgeFirst ) }; + faces[ faceIndex ] = vertexIndices; + } + + CoordinateSystem coordinateSystem = new CoordinateSystem(); + + while ( window.getScene().getObject( name ) != null ) { + name += "2"; + } + + mesh = new TriangleMesh ( vertices, faces ); + mesh.setSmoothingMethod( Mesh.NO_SMOOTHING ); + window.addObject( mesh, coordinateSystem, name, null ); + addUndoRecord(); +} + +/** +Import GNU Triangulated Surface from a file or from files in a directory. +*/ + +void importFiles() +{ + if ( openFileButton.getState() ) { + importFile( file ); + return; + } + + filesInDirectory = file.getParentFile().listFiles(); + + for ( int fileIndex = 0; fileIndex < filesInDirectory.length; fileIndex++ ) { + directoryFile = filesInDirectory[ fileIndex ]; + String directoryFileName = directoryFile.getName(); + + if ( directoryFileName.endsWith( ".gts" ) ) { + importFile( directoryFile ); + } + } +} + +/** +Add radio button groups to the preference widgets. + +@param radioButtonGroups radio button groups which will be added to the memorable widgets +@param widgetVector memorable widgets +*/ + +void preferencesAddRadioButtonGroups( RadioButtonGroup[] radioButtonGroups, Vector widgetVector ) +{ + for ( int radioIndex = 0; radioIndex < radioButtonGroups.length; radioIndex++ ) { + radioButtonGroup = radioButtonGroups[ radioIndex ]; + radioButtonGroupIterator = radioButtonGroup.getRadioButtons(); + + while ( radioButtonGroupIterator.hasNext() ) { + radioButton = radioButtonGroupIterator.next(); + preferencesAddWidgetWithString( radioButton, radioButton.getText(), widgetVector ); + } + } +} + +/** +Add widgets which have titles. + +@param widgets widgets which have titles +@param widgetStrings widget titles +@param widgetVector memorable widgets +*/ + +void preferencesAddWidgetsWithStrings( Widget[] widgets, String[] widgetStrings, Vector widgetVector ) +{ + for ( int widgetIndex = 0; widgetIndex < widgets.length; widgetIndex++ ) { + widget = widgets[ widgetIndex ]; + + if ( widget instanceof BCheckBox || widget instanceof BOutline || widget instanceof BTextField || widget instanceof ValueField ) { + preferencesAddWidgetWithString( widget, widgetStrings[ widgetIndex ], widgetVector ); + } + } +} + +/** +Give the widget a name and add it to the widget vector. + +@param widget widget which will be given a name +@param widgetStrings widget name +@param widgetVector memorable widgets +*/ + +void preferencesAddWidgetWithString( Widget widget, String widgetString, Vector widgetVector ) +{ + widget.setName( widgetString ); + widgetVector.add( widget ); +} + +/** +Read widget settings from preferences file. + +@param preferencesFilename preferences filename +@param widgetVector memorable widgets +*/ + +void preferencesRead( String preferencesFilename, Vector widgetVector ) +{ + preferencesFile = new File( preferencesFilename ); + + if ( !preferencesFile.canRead() ) { + return; + } + + BufferedReader preferencesReader = new BufferedReader( new FileReader( preferencesFile ) ); + + line = preferencesReader.readLine(); + + while ( line != null ) { + preferencesReadLine( line, widgetVector ); + line = preferencesReader.readLine(); + } +} + +/** +Read line of preferences and set widget to that line. + +@param line line of preferences +@param widgetVector memorable widgets +*/ + +void preferencesReadLine( String line, Vector widgetVector ) +{ + splitLine = line.split( "\t" ); + + if ( splitLine.length < 2 ) { + return; + } + + name = splitLine[ 0 ]; + + for ( int widgetIndex = 0; widgetIndex < widgetVector.size(); widgetIndex++ ) { + widget = widgetVector.elementAt( widgetIndex ); + + if ( widget.getName().equals( name ) ) { + preferencesReadWidget( splitLine[ 1 ], widget ); + + return; + } + } +} + +/** +Set widget to preferences value. + +@param value preferences value +@param widget widget to be set to value +*/ + +void preferencesReadWidget( String value, Widget widget ) +{ + if ( widget instanceof BCheckBox || widget instanceof BRadioButton ) { + widget.setState( Boolean.valueOf( value ) ); + + return; + } + + if ( widget instanceof BOutline ) { // it would be better to save the value instead of index because the list might change, but I'm lazy + bList = widget.getContent().getContent(); + selectedIndex = Integer.valueOf( value ); + bList.setSelected( selectedIndex, true ); + bList.scrollToItem( selectedIndex ); + + return; + } + + if ( widget instanceof BTextField ) { + widget.setText( value ); + + return; + } + + if ( widget instanceof ValueField ) { + widget.setValue( Double.valueOf( value ) ); + } +} + +/** +Write widget settings to preferences file. + +@param preferencesFilename preferences filename +@param widgetVector memorable widgets +*/ + +void preferencesWrite( String preferencesFilename, Vector widgetVector ) +{ + preferencesFile = new File( preferencesFilename ); + + if ( preferencesFile == null ) { + print( "Can not write preferences to " + preferencesFilename ); + + return; + } + + BufferedWriter preferencesWriter = new BufferedWriter( new FileWriter( preferencesFile ) ); + + for ( int widgetIndex = 0; widgetIndex < widgetVector.size(); widgetIndex++ ) { + widget = widgetVector.elementAt( widgetIndex ); + preferencesWriteWidget( preferencesWriter, widget ); + } + + //Close the output stream + preferencesWriter.close(); +} + +/** +Write widget settings to line of preferences. + +@param preferencesWriter buffered preferences file writer +@param widget widget to be written +*/ + +void preferencesWriteWidget( BufferedWriter preferencesWriter, Widget widget ) +{ + widgetString = widget.getName() + "\t"; + + if ( widget instanceof BCheckBox || widget instanceof BRadioButton ) { + preferencesWriter.write( widgetString + widget.getState().toString() + "\n" ); + + return; + } + + if ( widget instanceof BOutline ) { // it would be better to save the value because the list might change, but I'm lazy + BList bList = widget.getContent().getContent(); + bList = widget.getContent().getContent(); + preferencesWriter.write( widgetString + bList.getSelectedIndex().toString() + "\n" ); + + return; + } + + if ( widget instanceof BTextField ) { + preferencesWriter.write( widgetString + widget.getText() + "\n" ); + + return; + } + + if ( widget instanceof ValueField ) { + preferencesWriter.write( widgetString + widget.getValue().toString() + "\n" ); + } +} + +// Set default parameters. +directoryRadioButtonGroup = new RadioButtonGroup(); +openDirectoryButton = new BRadioButton( "Import All GNU Triangulated Surface Files in a Directory", false, directoryRadioButtonGroup ); +openFileButton = new BRadioButton( "Import File", true, directoryRadioButtonGroup ); +directoryGridContainer = new GridContainer( 1, 2 ); +directoryGridContainer.setDefaultLayout( new LayoutInfo( LayoutInfo.WEST, LayoutInfo.NONE, new Insets( 2, 2, 2, 2 ), null ) ); +directoryGridContainer.add( openDirectoryButton, 0, 0 ); +directoryGridContainer.add( openFileButton, 0, 1 ); +gnuSurfaceFilenameTextField = new BTextField( "" ); +String preferencesFilename = "import_gnu_triangulated_surface_preferences.csv"; + +Widget[] widgets = new Widget[] { directoryGridContainer }; +String[] widgetStrings = new String[] { "Open File or Directory:" }; + +// change the user interface parameters from default to preferences +Vector widgetVector = new Vector(); +RadioButtonGroup[] radioButtonGroups = new RadioButtonGroup[] { directoryRadioButtonGroup }; +preferencesAddRadioButtonGroups( radioButtonGroups, widgetVector ); +preferencesAddWidgetsWithStrings( widgets, widgetStrings, widgetVector ); +preferencesAddWidgetWithString( gnuSurfaceFilenameTextField, "GCode Filename:", widgetVector ); +preferencesRead( preferencesFilename, widgetVector ); + +dialog = new ComponentsDialog( window, "Import GNU Triangulated Surface File or Directory", widgets, widgetStrings ); + +if ( !dialog.clickedOk() ) return; + +fileChooser = new BFileChooser( BFileChooser.OPEN_FILE, "Import GNU Triangulated Surface File"); +gnuSurfaceFile = new File( gnuSurfaceFilenameTextField.getText() ); + +if ( gnuSurfaceFile.canRead() ) { + fileChooser.setSelectedFile( gnuSurfaceFile ); +} + +fileChooser.showDialog( window ); +file = fileChooser.getSelectedFile(); + +if ( file == null ) { + return; +} + +gnuSurfaceFilenameTextField.setText( file.getAbsolutePath() ); +preferencesWrite( preferencesFilename, widgetVector ); +importFiles(); diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Import Topology.bsh b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Import Topology.bsh new file mode 100644 index 0000000..203229b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Import Topology.bsh @@ -0,0 +1,225 @@ +/* + + + +*/ + +String addShape( BufferedReader bufferedReader, String line ) +{ + importShape = ImportShape(); + importShape.setBufferedReaderLine( bufferedReader, line ); + + while ( importShape.splitLine.length > 1 ) { + importShape.shouldRead = true; + + switch( importShape.firstLower ) { + + case "class": + importShape.setClass(); + break; + + case "faces": + importShape.setFaces(); + break; + + case "name": + importShape.setName(); + break; + + case "orientation": + importShape.setOrientation(); + break; + + case "origin": + importShape.setOrigin(); + break; + + case "vertexpositions": + importShape.setVertexPositions(); + break; + } + + if ( importShape.shouldRead ) { + importShape.readLine(); + } + } + + importShape.addShapeIfParametersSet(); + + return importShape.bufferedReader.readLine(); +} + +/** +Add curves and/or meshes from the file through the buffered reader. +*/ + +void addShapes( BufferedReader bufferedReader ) +{ + line = bufferedReader.readLine(); + + while ( line != null ) { + line = addShape( bufferedReader, line ); + } +} + +/** +Get a Vec3 from a string array. +*/ + +Vec3 getFromStringArray( String[] stringArray ) +{ + return new Vec3( Double.valueOf( stringArray[ 2 ] ), Double.valueOf( stringArray[ 3 ] ), Double.valueOf( stringArray[ 4 ] ) ); +} + +/** +Import the topology of a shape from the file through the buffered reader. +*/ + +ImportShape() { + BufferedReader bufferedReader = null; + String className = null; + Vector facesVector = null; + String firstLower = null; + String line = null; + String name = null; + Vec3 orientation = null; + Vec3 origin = null; + boolean shouldRead = true; + String[] splitLine = null; + Vector vertexPositionsVector = null; + +/** +Add the topology of a shape from the file through the buffered reader if all the parameters have been set. +*/ + + addShapeIfParametersSet() { + if ( className == null || name == null || orientation == null || origin == null || vertexPositionsVector == null ) { + print( "Shape has a null parameter and was not imported." ); + print( className ); + print( name ); + print( orientation ); + print( origin ); + print( vertexPositionsVector ); + return; + } + + vertexPositionsArray = vertexPositionsVector.toArray( new Vec3[ vertexPositionsVector.size() ] ); + CoordinateSystem coordinateSystem = new CoordinateSystem(); + coordinateSystem.setOrientation( orientation.x, orientation.y, orientation.z ); + coordinateSystem.setOrigin( origin ); + + while ( window.getScene().getObject( name ) != null ) { + name += "a"; + } + + if ( className.equals( "curve" ) ) { + float[] smoothness = new float[ vertexPositionsArray.length ]; + curve = new Curve( vertexPositionsArray, smoothness, Mesh.APPROXIMATING, true ); + window.addObject( curve, coordinateSystem, name, null ); + addUndoRecord(); + return; + } + + if ( facesVector == null ) { + return; + } + + if ( className.equals( "trianglemesh" ) ) { + facesArray = facesVector.toArray( new int[ facesVector.size() ][ 3 ] ); + mesh = new TriangleMesh ( vertexPositionsArray, facesArray ); + mesh.setSmoothingMethod( Mesh.NO_SMOOTHING ); + window.addObject( mesh, coordinateSystem, name, null ); + addUndoRecord(); + } + } + + addUndoRecord() { + scene = window.getScene(); + undoAdd = new UndoRecord ( window, false, UndoRecord.DELETE_OBJECT, new Object[] { new Integer( scene.getNumObjects() - 1 ) } ); + window.setUndoRecord( undoAdd ); + } + + readLine() { + line = bufferedReader.readLine(); + setSplitLine(); + } + + setBufferedReaderLine( BufferedReader argumentBufferedReader, String argumentLine ) { + bufferedReader = argumentBufferedReader; + line = argumentLine; + setSplitLine(); + } + + setClass() { + className = splitLine[ 1 ].toLowerCase(); + } + + setFaces() { + readLine(); + shouldRead = false; + facesVector = new Vector(); + + while ( splitLine[ 0 ].toLowerCase().equals( "face" ) ) { + int[] face = { Integer.valueOf( splitLine[ 2 ] ), Integer.valueOf( splitLine[ 3 ] ), Integer.valueOf( splitLine[ 4 ] ) }; + facesVector.add( face ); + readLine(); + } + } + + setName() { + name = splitLine[ 1 ]; + } + + setOrientation() { + orientation = getFromStringArray( splitLine ); + } + + setOrigin() { + origin = getFromStringArray( splitLine ); + } + + setSplitLine() { + if ( line == null ) { + splitLine = new String[] { "" }; + return; + } + + splitLine = line.split( "," ); + firstLower = splitLine[ 0 ].toLowerCase(); + } + + setVertexPositions() { + readLine(); + shouldRead = false; + vertexPositionsVector = new Vector(); + + while ( splitLine[ 0 ].toLowerCase().equals( "vertex position" ) ) { + vertexPositionsVector.add( getFromStringArray( splitLine ) ); + readLine(); + } + } + + return this; +} + +// Get parameters. + +fileChooser = new BFileChooser( BFileChooser.OPEN_FILE, "Import Comma Separated Values Topology"); +fileChooser.showDialog( window ); +filename = fileChooser.getSelectedFile(); + +if ( filename == null ) { + return; +} + +bufferedReader = new BufferedReader( new FileReader( filename ) ); +addShapes( bufferedReader ); \ No newline at end of file diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Platonic Solid.bsh b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Platonic Solid.bsh new file mode 100644 index 0000000..6913a27 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Platonic Solid.bsh @@ -0,0 +1,391 @@ +/* + + + +*/ + +/* Copyright (C) 2004 by Fran�ois Guillet + + This program is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + PARTICULAR PURPOSE. See the GNU General Public License for more details. */ + +//Script localization test + +HashMap translations = new HashMap(); +if (Translate.getLocale().equals(Locale.FRENCH)) +{ + translations.put("Hexahedron", "Hexah\u00E8dre (6)"); + translations.put("Tetrahedron", "Tetrah\u00E8dre (4)"); + translations.put("Octahedron", "Octah\u00E8dre (8)"); + translations.put("Dodecahedron", "Dodecah\u00E8dre (12)"); + translations.put("Icosahedron", "Icosah\u00E8dre (20)"); + translations.put("centeredFaces", "sommets aux centres des faces"); + translations.put("selectPolyhedron", "S\u00E9lectionnez un polyh\u00E8dre :"); + translations.put("noSmoothing", "Pas de lissage" ); + translations.put("smoothShading", "Ombrage doux" ); + translations.put("interpolating", "Interpolation" ); + translations.put("approximating", "Approximation" ); + translations.put("polyhedron", "Polyh\u00E8dre:" ); + translations.put("faceCenteredMesh", "Maillage face centr\u00E9e" ); + translations.put("radius", "Rayon :" ); + translations.put("smoothingMethod", "M\u00E9thode de lissage:"); + translations.put("verticesSmoothness", "Lissage des sommets :"); + translations.put("edgesSmoothness", "Lissages des ar\u00EAtes :"); + translations.put("texture", "Texture :"); + translations.put("material", "Mat\u00E9riau :"); + translations.put("hexahedron", "Hexah\u00E8dre"); + translations.put("tetrahedron", "Tetrah\u00E8dre"); + translations.put("octahedron", "Octah\u00E8dre"); + translations.put("dodecahedron", "Dodecah\u00E8dre"); + translations.put("icosahedron", "Icosah\u00E8dre"); +} +else +{ + translations.put("Hexahedron", "Hexahedron (6)"); + translations.put("Tetrahedron", "Tetrahedron (4)"); + translations.put("Octahedron", "Octahedron (8)"); + translations.put("Dodecahedron", "Dodecahedron (12)"); + translations.put("Icosahedron", "Icosahedron (20)"); + translations.put("centeredFaces", "vertices at faces centers"); + translations.put("selectPolyhedron", "Select a polyhedron:"); + translations.put("noSmoothing", "No Smoothing" ); + translations.put("smoothShading", "Smooth Shading" ); + translations.put("interpolating", "Interpolating" ); + translations.put("approximating", "Approximating" ); + translations.put("polyhedron", "Polyhedron:" ); + translations.put("faceCenteredMesh", "Face centered mesh" ); + translations.put("radius", "Radius:" ); + translations.put("smoothingMethod", "Smoothing Method:"); + translations.put("verticesSmoothness", "Vertices Smoothness:"); + translations.put("edgesSmoothness", "Edges smoothness:"); + translations.put("texture", "Texture:"); + translations.put("material", "Material:"); + translations.put("hexahedron", "Hexahedron"); + translations.put("tetrahedron", "Tetrahedron"); + translations.put("octahedron", "Octahedron"); + translations.put("dodecahedron", "Dodecahedron"); + translations.put("icosahedron", "Icosahedron"); +} +//end of script localization test + + +//given a set of faces, this function computes the centers of the faces and adds them to the list of vertices +Vec3[] completeVertices(Vec3[] vert, int[][] polyFaces, int vertNum) +{ vertices = new Vec3[vert.length + polyFaces.length]; + + for (i = 0 ; i < vert.length ; ++i) + vertices[i] = vert[i]; + + for (i = vertNum; i < vertNum + polyFaces.length; ++i) + { v = new Vec3(); + for (j = 0 ; j < polyFaces[i - vertNum].length; ++j) + v.add(vertices[polyFaces[i - vertNum][j]]); + v.scale(1.0/polyFaces[i - vertNum].length); + vertices[i] = v; + } + + return vertices; +} + +//given a set of faces and a set of vertices, +//this function computes centered faces to form a triangular mesh +//presumably equivalent to subdivide face command in the mesh editor +TriangleMesh triangulateFaces(Vec3[] vertices, int[][] polyFaces, int vertNum) +{ vertices = completeVertices(vertices, polyFaces, vertNum); + + faces = new int[polyFaces.length * polyFaces[0].length][3]; + + f = 0; + for (i = 0 ; i < polyFaces.length ; ++i) + { for (j = 0; j < polyFaces[i].length ; ++j) + { if (j < polyFaces[i].length-1) + { faces[f][0] = polyFaces[i][j]; + faces[f][1] = polyFaces[i][j+1]; + faces[f][2] = vertNum + i; + } + else + { faces[f][0] = polyFaces[i][j]; + faces[f][1] = polyFaces[i][0]; + faces[f][2] = vertNum + i; + } + ++f; + } + } + mesh = new TriangleMesh(vertices, faces); + return mesh; +} + + +scene = window.getScene(); + +//setup the list of polyhedra +polyList = new BList(new String [] { + translations.get("Tetrahedron"), + translations.get("Hexahedron"), + translations.get("Octahedron"), + translations.get("Dodecahedron"), + translations.get("Icosahedron") +}); +polyList.setPreferredVisibleRows(5); +polyList.setSelected(0, true); + +//face centered checkbox +centeredCheckbox = new BCheckBox(translations.get("centeredFaces"), false); + +//radius value field +radiusValueField = new ValueField(1.0, ValueField.NONNEGATIVE); + +//smoothing method +smoothList = new BList(new String [] { + translations.get("noSmoothing"), + translations.get("smoothShading"), + translations.get("interpolating"), + translations.get("approximating") +}); +smoothList.setPreferredVisibleRows(4); +smoothList.setSelected(0, true); + +//vertices smoothness value field +vertSmoothnessValueField = new ValueField(1.0, ValueField.NONNEGATIVE); + +//edges smoothness value field +edgesSmoothnessValueField = new ValueField(1.0, ValueField.NONNEGATIVE); + +// get list of scene textures +numTex=scene.getNumTextures(); +textureList=new BList(); +textureList.setPreferredVisibleRows(3 < numTex ? 3 : numTex); +for (i = 0 ; i < numTex ; i++) +{ + iTex=scene.getTexture(i); + name=iTex.getName(); + textureList.add(name); +} +textureList.setSelected(0, true); + +// get list of materials +numMat=scene.getNumMaterials(); +materialList=new BList(); +materialList.setPreferredVisibleRows(3 < numMat + 1 ? 3 : numMat + 1); +materialList.add("none"); +for (i = 0 ; i < numMat ; i++) +{ + iMat=scene.getMaterial(i); + name=iMat.getName(); + materialList.add(name); +} +materialList.setSelected(0, true); + + +dlg = new ComponentsDialog(window, translations.get("selectPolyhedron"), +new Widget [] { UIUtilities.createScrollingList(polyList), centeredCheckbox, radiusValueField, UIUtilities.createScrollingList(smoothList), vertSmoothnessValueField, edgesSmoothnessValueField, UIUtilities.createScrollingList(textureList), UIUtilities.createScrollingList(materialList)}, +new String [] { translations.get("polyhedron"), translations.get("faceCenteredMesh"), translations.get("radius"), translations.get("smoothingMethod"), translations.get("verticesSmoothness"), translations.get("edgesSmoothness"), translations.get("texture"), translations.get("material") } ); + +if (!dlg.clickedOk()) return; + +centered = centeredCheckbox.getState(); + +switch (polyList.getSelectedIndex()) +{ case 0 : //tetrahedra + vertices = new Vec3[4]; // 4 vertices + 4 faces + vertices[0] = new Vec3(0, 0, 1); + vertices[1] = new Vec3(2*Math.sqrt(2)/3, 0, -1.0/3.0); + vertices[2] = new Vec3(-Math.sqrt(2)/3, Math.sqrt(6)/3, -1.0/3.0); + vertices[3] = new Vec3(-Math.sqrt(2)/3, -Math.sqrt(6)/3, -1.0/3.0); + int[][] faces = {{ 0, 1, 2 }, { 0, 2, 3 }, { 0, 3, 1 }, { 1, 3, 2 }}; + if (centered) + mesh = triangulateFaces(vertices, faces, 4); + else + mesh = new TriangleMesh(vertices, faces); + name = translations.get("tetrahedron") + (centered ? " FC" : ""); + break; + + case 1 : //hexahedron + vertices = new Vec3[8]; // 8 vertices + 6 faces + vertices[0] = new Vec3(-1, -1, -1); + vertices[1] = new Vec3(1, -1, -1); + vertices[2] = new Vec3(1, 1, -1); + vertices[3] = new Vec3(-1, 1, -1); + vertices[4] = new Vec3(-1, -1, 1); + vertices[5] = new Vec3(1, -1, 1); + vertices[6] = new Vec3(1, 1, 1); + vertices[7] = new Vec3(-1, 1, 1); + for (i = 0 ; i < 8 ; ++i) + vertices[i].scale(1.0/Math.sqrt(3)); + + //polygon faces when different from triangular faces + int[][] hexaFaces = {{ 0, 3, 2, 1 }, { 0, 1, 5, 4 }, { 0, 4, 7, 3 }, + { 6, 5, 1, 2 }, { 6, 2, 3, 7 }, { 6, 7, 4, 5 } }; + + //triangular faces + int[][] faces = {{ 0, 3, 2}, { 0, 2, 1}, { 0, 1, 5}, { 0, 5, 4}, { 0, 4, 7}, {0, 7, 3}, + { 6, 5, 1}, { 6, 1, 2}, { 6, 2, 3}, { 6, 3, 7}, { 6, 7, 4}, {6, 4, 5}}; + if (centered) + mesh = triangulateFaces(vertices, hexaFaces, 8); + else + mesh = new TriangleMesh(vertices, faces); + name = translations.get("hexahedron") + (centered ? " FC" : ""); + break; + + case 2 : //octahedron + vertices = new Vec3[6]; // 6 vertices + 8 faces + vertices[0] = new Vec3(1, 0, 0); + vertices[1] = new Vec3(-1, 0, 0); + vertices[2] = new Vec3(0, 1, 0); + vertices[3] = new Vec3(0, -1, 0); + vertices[4] = new Vec3(0, 0, 1); + vertices[5] = new Vec3(0, 0, -1); + + int[][] faces = { + { 4, 0, 2 }, { 4, 2, 1 }, { 4, 1, 3 }, { 4, 3, 0 }, + { 5, 2, 0 }, { 5, 1, 2 }, { 5, 3, 1 }, { 5, 0, 3 } + }; + + if (centered) + mesh = triangulateFaces(vertices, faces, 6); + else + mesh = new TriangleMesh(vertices, faces); + + name = translations.get("octahedron") + (centered ? " FC" : ""); + break; + + case 3 : //dodecahedron + vertices = new Vec3[20]; // 20 vertices + 12 faces + a = 1/Math.sqrt(3); + b = Math.sqrt( (3.0 - Math.sqrt(5)) /6.0); + c = Math.sqrt( (3.0 + Math.sqrt(5)) /6.0); + vertices[0] = new Vec3(a, a, a); + vertices[1] = new Vec3(a, a, -a); + vertices[2] = new Vec3(a, -a, a); + vertices[3] = new Vec3(a, -a, -a); + vertices[4] = new Vec3(-a, a, a); + vertices[5] = new Vec3(-a, a, -a); + vertices[6] = new Vec3(-a, -a, a); + vertices[7] = new Vec3(-a, -a, -a); + vertices[8] = new Vec3(b, c, 0); + vertices[9] = new Vec3(-b, c, 0); + vertices[10] = new Vec3(b, -c, 0); + vertices[11] = new Vec3(-b, -c, 0); + vertices[12] = new Vec3(c, 0, b); + vertices[13] = new Vec3(c, 0, -b); + vertices[14] = new Vec3(-c, 0, b); + vertices[15] = new Vec3(-c, 0, -b); + vertices[16] = new Vec3(0, b, c); + vertices[17] = new Vec3(0, -b, c); + vertices[18] = new Vec3(0, b, -c); + vertices[19] = new Vec3(0, -b, -c); + + int[][] faces = { //*quite* dull + { 0, 8, 9 }, { 0, 12, 13 }, { 0, 16, 17 }, { 8, 1, 18 }, + { 12, 2, 10 }, { 16, 4, 14 }, { 9, 5, 15 }, { 6, 11, 10 }, + { 3, 19, 18 }, { 7, 15, 5 }, { 7, 11, 6 }, { 7, 19, 3 }, + { 0, 9, 4 }, { 0, 13, 1 }, { 0, 17, 2 }, { 8, 18, 5 }, + { 12, 10, 3 }, { 16, 14, 6 }, { 9, 15, 14 }, { 6, 10, 2 }, + { 3, 18, 1 }, { 7, 5, 18 }, { 7, 6, 14 }, { 7, 3, 10 }, + { 0, 4, 16 }, { 0, 1, 8 }, { 0, 2, 12 }, { 8, 5, 9 }, + { 12, 3, 13 }, { 16, 6, 17 }, { 9, 14, 4 }, { 6, 2, 17 }, + { 3, 1, 13 }, { 7, 18, 19 }, { 7, 14, 15 }, { 7, 10, 11 } + }; + + int[][] dodeFaces = { + { 0, 8, 9, 4, 16}, { 0, 16, 17, 2, 12}, { 12, 2, 10, 3, 13}, + { 9, 5, 15, 14, 4}, { 3, 19, 18, 1, 13}, { 7, 11, 6, 14, 15}, + { 0, 12, 13, 1, 8}, { 8, 1, 18, 5, 9}, { 16, 4, 14, 6, 17}, + { 6, 11, 10, 2, 17}, { 7, 15, 5, 18, 19}, { 7, 19, 3, 10, 11} + }; + + if (centered) + mesh = triangulateFaces(vertices, dodeFaces, 20); + else + mesh = new TriangleMesh(vertices, faces); + + name = translations.get("dodecahedron") + (centered ? " FC" : ""); + break; + + case 4 : //icosahedron + vertices = new Vec3[12]; // 12 vertices + 20 faces + t = ( 1.0 + Math.sqrt(5) )/2.0; + vertices[0] = new Vec3(t, 1, 0); + vertices[1] = new Vec3(-t, 1, -0); + vertices[2] = new Vec3(t, -1, 0); + vertices[3] = new Vec3(-t, -1, 0); + vertices[4] = new Vec3(1, 0, t); + vertices[5] = new Vec3(1, 0, -t); + vertices[6] = new Vec3(-1, 0, t); + vertices[7] = new Vec3(-1, 0, -t); + vertices[8] = new Vec3(0, t, 1); + vertices[9] = new Vec3(0, -t, 1); + vertices[10] = new Vec3(0, t, -1); + vertices[11] = new Vec3(0, -t, -1); + for (i = 0 ; i < 12 ; ++i) + vertices[i].scale( 1.0 / Math.sqrt( 1.0 + t*t) ); + + int[][] faces = { + { 0, 8, 4 }, { 0, 5, 10 }, { 2, 4, 9 }, { 2, 11, 5 }, + { 1, 6, 8 }, { 1, 10, 7 }, { 3, 9, 6 }, { 3, 7, 11 }, + { 0, 10, 8 }, { 1, 8, 10 }, { 2, 9, 11 }, { 3, 11, 9 }, + { 4, 2, 0 }, { 5, 0, 2 }, { 6, 1, 3 }, { 7, 3, 1 }, + { 8, 6, 4 }, { 9, 4, 6 }, { 10, 5, 7 }, { 11, 7, 5 } + }; + + + if (centered) + mesh = triangulateFaces(vertices, faces, 12); + else + mesh = new TriangleMesh(vertices, faces); + + name = translations.get("icosahedron") + (centered ? " FC" : ""); + break; + default : + return; +} + +//set vertices smoothness and scale mesh in the process +meshVertices = mesh.getVertices(); +radius = radiusValueField.getValue(); +for ( i = 0 ; i < meshVertices.length ; ++i) +{ meshVertices[i].smoothness = (float) vertSmoothnessValueField.getValue(); + meshVertices[i].r.scale(radius); +} + +//set edges smoothness +meshEdges = mesh.getEdges(); +for ( i = 0 ; i < meshEdges.length ; ++i) + meshEdges[i].smoothness = (float) edgesSmoothnessValueField.getValue(); + +//set mesh smoothing method +mesh.setSmoothingMethod(smoothList.getSelectedIndex()); + +//set texture +//tex = scene.getTexture(textureList.getSelectedIndex()); +//mesh.setTexture(tex, tex.getDefaultMapping()); + +//set material +matIndex = materialList.getSelectedIndex(); +if ( matIndex > 0 ) +{ mat = scene.getMaterial(matIndex-1); + mesh.setMaterial(mat, mat.getDefaultMapping()); +} + +//we're done +window.addObject(mesh, new CoordinateSystem(), name, null); + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Truncated Teardrop Shaper.bsh b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Truncated Teardrop Shaper.bsh new file mode 100644 index 0000000..766c3ac --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/Art of Illusion Scripts/Truncated Teardrop Shaper.bsh @@ -0,0 +1,119 @@ +/* + + +*/ + +do +{ + scene = window.getScene(); + + directionType = new RadioButtonGroup(); + up = new BRadioButton("Up", false, directionType); + down = new BRadioButton("Down", false, directionType); + left = new BRadioButton("Left", false, directionType); + right = new BRadioButton("Right", false, directionType); + + directional = new GridContainer(2, 2); + directional.setDefaultLayout(new LayoutInfo(LayoutInfo.WEST, LayoutInfo.NONE, new Insets(2, 2, 2, 2), null)); + directional.add(up, 0, 0); + directional.add(down, 0, 1); + directional.add(left, 1, 0); + directional.add(right, 1, 1); + + vertexValueField = new ValueField(45, ValueField.NONNEGATIVE); + radiusValueField = new ValueField(1.0, ValueField.NONNEGATIVE); + maxErrorValueField = new ValueField(0.05, ValueField.NONNEGATIVE); + directionValueField = new ValueField(0.0, ValueField.NONNEGATIVE); + truncationValueField = new ValueField(0.0, ValueField.NONNEGATIVE); + + dlg = new ComponentsDialog(window, "TearDrop Tool" , + new Widget [] { directional, directionValueField, vertexValueField, truncationValueField, radiusValueField, maxErrorValueField }, + new String [] { "Orientation about z-axis: ", "or specific rotation about z-axis (degrees): ", "Vertex angle (degrees): ", "Truncation: ", "Radius: ", "Max error: " } ); + + if (!dlg.clickedOk()) return; + + theta = vertexValueField.getValue() / 180 * Math.PI; + radius = radiusValueField.getValue(); + maxError = maxErrorValueField.getValue(); + directionAngle = directionValueField.getValue() / 180 * Math.PI; + + errorAngle = Math.acos((radius - maxError) / radius); // inverse cosine + +// numberSides = Math.ceil(((2 * Math.PI) - 2 * (Math.PI / 2 - theta)) / errorAngle); // rounded up + numberSides = Math.ceil(((2 * Math.PI) - 2 * (Math.PI / 2 - theta)) / errorAngle) + 1; // rounded up + + if (numberSides <= 10) + new MessageDialog(window, "Please decrease the value of the maximum error"); +} +while (numberSides < 10); + + +// Setting the orientation of the teardrop shape depending on the outcome of Radio Buttons +if (up.getState()) + directionAngle = Math.PI / 2; + +if (down.getState()) + directionAngle = (3 * Math.PI) / 2; + +if (left.getState()) + directionAngle = Math.PI; + +if (right.getState()) + directionAngle = 0; + + +Vec3[] v = new Vec3[numberSides]; +float[] smoothness = new float[numberSides]; + +//double phi = ((2.0 * Math.PI) - (2.0 * ((Math.PI / 2) - theta))) / (numberSides - 2); +double phi = ((2.0 * Math.PI) - (2.0 * ((Math.PI / 2) - theta))) / (numberSides - 3); + +double angle = ((Math.PI / 2.0) - theta); + +//for (int i = 0 ; i < (numberSides - 1) ; i++) +for (int i = 0 ; i < (numberSides - 2) ; i++) +{ + x1 = Math.cos(angle + phi * i); + y1 = Math.sin(angle + phi * i); + x2 = x1 * Math.cos(directionAngle) - y1 * Math.sin(directionAngle); // rotational vectors - x + y2 = y1 * Math.cos(directionAngle) + x1 * Math.sin(directionAngle); // rotational vectors - y + v[i] = new Vec3(x2, y2, 0); + v[i].scale(radius); + smoothness[i] = 0; +} + +// final vertex point at the sharp tip +//x3 = Math.cos(directionAngle) * (radius / Math.sin(theta)); +//y3 = Math.sin(directionAngle) * (radius / Math.sin(theta)); +//v[numberSides - 2.0] = new Vec3(x3, y3, 0); +truncationToVertex = truncationValueField.getValue() * (2 - Math.sqrt(2)); +xTip = Math.cos(directionAngle) * (radius / Math.sin(theta)); +yTip = Math.sin(directionAngle) * (radius / Math.sin(theta)); +vTip = new Vec3(xTip, yTip, 0); +vLast = v[numberSides - 3.0]; +vFromTipToLast = vLast.minus( vTip ); +vFromTipToLast.scale( truncationToVertex ); +v[numberSides - 2.0] = vTip.plus( vFromTipToLast ); +vStart = v[0]; +vFromTipToStart = vStart.minus( vTip ); +vFromTipToStart.scale( truncationToVertex ); +x4 = xTip + 0.2; +y4 = yTip + 0.3; +v[numberSides - 1.0] = vTip.plus( vFromTipToStart ); + +name = "Truncated Teardrop (" + numberSides + " sides)"; + +tolerance = 0.02; //surface accuracy + +curve = new Curve(v, smoothness, Mesh.APPROXIMATING, true); +window.addObject(curve, new CoordinateSystem(), name, null); + +// Finished \ No newline at end of file diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/RepRapArduinoSerialSender.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/RepRapArduinoSerialSender.py new file mode 100644 index 0000000..d5ce0ba --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/RepRapArduinoSerialSender.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +Extrude requires pySerial installed for this module to work. If you are using Fedora it is available on yum +(run "sudo yum install pyserial"). To actually control the reprap requires write access to the serial device, +running as root is one way to get that access. + +Created by Brendan Erwin on 2008-05-21. +Copyright (c) 2008 Brendan Erwin. All rights reserved. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +""" + +try: + import serial # Import the pySerial modules. +except: + print('You do not have pySerial installed, which is needed to control the serial port.') + print('Information on pySerial is at:\nhttp://pyserial.wiki.sourceforge.net/pySerial') + +import os +import sys +import time + + +class RepRapArduinoSerialSender: + """ + A utility class for communication with the Arduino from python. + Intended for g-code only. Raises ValueException if the arduino + returns an unexpected response. Usually caused by sending invalid + g-code. + """ + + _verbose = False + block = "empty" + + def __init__(self, port, baud, verbose=False): + """ + Opens the serial port and prepares for writing. + port MUST be set, and values are operating system dependant. + """ + self._verbose = verbose + + if self._verbose: + print >> sys.stdout, "Opening serial port: " + port + + #Timeout value 10" max travel, 1RPM, 20 threads/in = 200 seconds + self.ser = serial.Serial(port, baud, timeout=200) + + if self._verbose: + print >> sys.stdout, "Serial Open?: " + str(self.ser.isOpen()) + print >> sys.stdout, "Baud Rate: " + str(self.ser.baudrate) + + def reset(self): + """ + Resets the arduino by droping DTR for 1 second + This will then wait for a response ("ready") and return. + """ + #Reboot the arduino, and wait for it's response + if self._verbose: + print "Resetting arduino..." + + self.ser.setDTR(0) + # There is presumably some latency required. + time.sleep(1) + self.ser.setDTR(1) + self.read("Start") + + def write(self, block): + """ + Writes one block of g-code out to arduino and waits for an "ok". + This version will wait for an "ok" before returning and prints any intermediate output received. + No error will be raised if non-ok response is received. Loop in read() is infinite if "ok" + does not come back! + This routine also removes all whitespace before sending it to the arduino, + which is handy for gcode, but will screw up if you try to do binary communications. + """ + if self._verbose: + print "> " + block + + # The arduino GCode interperter firmware doesn't like whitespace + # and if there's anything other than space and tab, we have other problems. + block=block.strip() + block=block.replace(' ','') + block=block.replace("\t",'') + #Skip blank blocks. + if len(block) == 0: + return + + self.ser.write(block + "\n") + self.read("OK") + + def read(self, expect=None): + """ + This routine should never be called directly. It's used by write() and reset() + to read a one-line response from the Arduino. + This version will wait for an "ok" before returning and prints any intermediate output received. + No error will be raised if non-ok response is received. Loop is infinite if "ok" + does not come back! + """ + #The g-code firmware returns exactly ONE line per block of gcode sent. + #Unless it is M104, M105 or other code that returns info!! + #It WILL return "ok" once the command has finished sending and completed. + while True: + response = self.ser.readline().strip() + if expect is None: + return + + if expect.lower() in response.lower(): + if self._verbose: + print "< " + response + return + else: + #Just print the response since it is useful data or an error message + print "< " + response + + + def close(): + """ + Closes the serial port, terminating communications with the arduino. + """ + if self._verbose: + print >> sys.stdout, "Closing serial port." + self.ser.close() + + if self._verbose: + print >> sys.stdout, "Serial Open?: " + str(self.ser.isOpen()) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/__init__.py new file mode 100644 index 0000000..036c122 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/__init__.py @@ -0,0 +1,11 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. + +import os +import sys + +numberOfLevelsDeepInPackageHierarchy = 2 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/demo.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/demo.py new file mode 100644 index 0000000..c5cb182 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/demo.py @@ -0,0 +1,24 @@ +try: + import serial +except: + print('You do not have pySerial installed, which is needed to control the serial port.') + print('Information on pySerial is at:\nhttp://pyserial.wiki.sourceforge.net/pySerial') +import reprap, time # Import the reprap and pySerial modules. + +reprap.serial = serial.Serial(0, 19200, timeout = reprap.snap.messageTimeout) # Initialise serial port, here the first port (0) is used. +reprap.cartesian.x.active = True # These devices are present in network, will automatically scan in the future. +reprap.cartesian.y.active = True +reprap.cartesian.z.active = True +reprap.extruder.active = True +# The module is now ready to recieve commands # +moveSpeed = 220 +reprap.cartesian.homeReset( moveSpeed, True ) # Send all axies to home position. Wait until arrival. +reprap.cartesian.seek( (1000, 1000, 0), moveSpeed, True ) # Seek to (1000, 1000, 0). Wait until arrival. +time.sleep(2) # Pause. +reprap.cartesian.seek( (500, 1000, 0), moveSpeed, True ) # Seek to (500, 1000, 0). Wait until arrival. +time.sleep(2) +reprap.cartesian.seek( (1000, 500, 0), moveSpeed, True ) # Seek to (1000, 500, 0). Wait until arrival. +time.sleep(2) +reprap.cartesian.seek( (100, 100, 0), moveSpeed, True ) # Seek to (100, 100, 0). Wait until arrival. +reprap.cartesian.homeReset( moveSpeed, True ) # Send all axies to home position. Wait until arrival. +reprap.cartesian.free() # Shut off power to all motors. diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/example.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/example.py new file mode 100644 index 0000000..640bf8d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/example.py @@ -0,0 +1,144 @@ +#!/usr/bin/python +try: + import serial +except: + print('You do not have pySerial installed, which is needed to control the serial port.') + print('Information on pySerial is at:\nhttp://pyserial.wiki.sourceforge.net/pySerial') + +import reprap, time, sys + +#reprap.snap.printOutgoingPackets = True +#reprap.snap.printIncomingPackets = True +#reprap.snap.printFailedPackets = True +#reprap.printDebug = True + +#work surface approx x 2523, y 2743 + +#reprap.serial = serial.Serial(0, 19200, timeout = reprap.snap.messageTimeout) +reprap.serial = serial.Serial(0, 19200, timeout = 60) + +reprap.cartesian.x.active = True # these devices are present in network +reprap.cartesian.y.active = True +reprap.cartesian.z.active = True +reprap.extruder.active = True + +reprap.cartesian.x.setNotify() +reprap.cartesian.y.setNotify() +reprap.cartesian.z.setNotify() +reprap.cartesian.x.limit = 2523 +#reprap.cartesian.y.limit = 2743 +reprap.cartesian.y.limit = 2000 + +def printPos(): + x, y, z = reprap.cartesian.getPos() + print "Location [" + str(x) + ", " + str(y) + ", " + str(z) + "]" + + +print "================================================================" + + +########### control of cartesian frame as a whole ######### + +#stop all steppers +if sys.argv[1] == "stop": + reprap.cartesian.stop() + +#goto 0,0 +if sys.argv[1] == "reset": + reprap.cartesian.homeReset( 200, True ) + #time.sleep(2) + printPos() + +#print current positon +if sys.argv[1] == "pos": + printPos() + +#goto a specific location +if sys.argv[1] == "goto": + reprap.cartesian.seek( ( int(sys.argv[2]), int(sys.argv[3]), 0 ), 200, False) + printPos() + +#goto a specific location (use sync) +if sys.argv[1] == "gotos": + reprap.cartesian.syncSeek( ( int(sys.argv[2]), int(sys.argv[3]), 0 ), 200, False) + printPos() + +if sys.argv[1] == "power": + reprap.cartesian.setPower( int( sys.argv[2] ) ) # This is a value from 0 to 63 (6 bits) + + +#test routine +if sys.argv[1] == "go": #stepper test + reprap.cartesian.seek( (1000, 1000, 0), 200, True ) + time.sleep(2) + reprap.cartesian.seek( (500, 1000, 0), 200, True ) + time.sleep(2) + reprap.cartesian.seek( (500, 500, 0), 200, True ) + time.sleep(2) + reprap.cartesian.seek( (10, 10, 0), 200, True ) + +#free motors (switch off all coils) +if sys.argv[1] == "free": + reprap.axies.free(reprap.axisX) + reprap.axies.free(reprap.axisY) + +############## control of individual steppers ############# + +#spin stepper +if sys.argv[1] == "run": # run axis + if sys.argv[2] == "x": + reprap.cartesian.x.forward( int(sys.argv[3]) ) + elif sys.argv[2] == "y": + reprap.cartesian.y.forward( int(sys.argv[3]) ) + +#spin stepper in reverse +if sys.argv[1] == "runb": #runb axis + if sys.argv[2] == "x": + reprap.axies.backward( reprap.axisX, int(sys.argv[3]) ) + elif sys.argv[2] == "y": + reprap.axies.backward( reprap.axisY, int(sys.argv[3]) ) + +if sys.argv[1] == "step": + if sys.argv[2] == "x": + reprap.cartesian.x.forward1() + elif sys.argv[2] == "y": + reprap.cartesian.y.forward1() + +################# control of extruder ##################### + +#test extrder motor +elif sys.argv[1] == "motor": + nn = 0 + while 1: + if nn > 0: + nn = 0 + else: + nn = 150 + reprap.extruder.setMotor(reprap.CMD_REVERSE, nn) + time.sleep(1) + +elif sys.argv[1] == "getinfo": + mtype = reprap.extruder.getModuleType() + version = reprap.extruder.getVersion() + print "module", mtype, "version", version + +elif sys.argv[1] == "heat": + reprap.extruder.setHeat(255, 255, 255, 255) + +#setHeat(self, lowHeat, highHeat, tempTarget, tempMax + +elif sys.argv[1] == "temp": + print "Temp is ", reprap.extruder.getTemp() + +elif sys.argv[1] == "setref": + reprap.extruder.setVoltateReference( int(sys.argv[2]) ) + + + + +############### scan network for devices ################### + +#scan snap network +elif sys.argv[1] == "scan": + reprap.scanNetwork() + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/extrude.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/extrude.py new file mode 100644 index 0000000..1d85212 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/extrude.py @@ -0,0 +1,390 @@ +""" +Extrude is a script to display and extrude a gcode file. + +It controls the extruder and movement. It can read linear and helical move commands. It saves a log file with the suffix _log. + +To run extrude, install python 2.x on your machine, which is avaliable from http://www.python.org/download/ + +Then in the folder which extrude is in, type 'python' in a shell to run the python interpreter. Finally type 'import extrude' to import +this program. Extrude requires pySerial installed for this module to work. If you are using Fedora it is available on yum +(run "sudo yum install pyserial"). To actually control the reprap requires write access to the serial device, running as root is +one way to get that access. + + +This example displays and extrudes a gcode file. This example is run in a terminal as root in the folder which contains +Hollow Square.gcode, and extrude.py. + +>>> import extrude +Extrude has been imported. +The gcode files in this directory that are not log files are the following: +['Hollow Square.gcode'] + + +>>> extrude.display() +File Hollow Square.gcode is being displayed. +reprap.serial = serial.Serial(0, 19200, timeout = 60) +reprap.cartesian.x.active = True +reprap.cartesian.y.active = True +reprap.cartesian.z.active = True +reprap.extruder.active = True +reprap.cartesian.x.setNotify() +reprap.cartesian.y.setNotify() +reprap.cartesian.z.setNotify() +reprap.cartesian.x.limit = 2523 +reprap.cartesian.y.limit = 2000 +reprap.cartesian.homeReset( 200, True ) +( GCode generated by March 29,2007 Skeinforge ) +( Extruder Initialization ) +M100 P210 +M103 +reprap.extruder.setMotor(reprap.CMD_REVERSE, 0) +.. +many lines of gcode and extruder commands +.. +reprap.cartesian.homeReset( 600, True ) +reprap.cartesian.free() +The gcode log file is saved as Hollow Square_log.gcode + + +>>> extrude.displayFile("Hollow Square.gcode") +File Hollow Square.gcode is being displayed. +.. +The gcode log file is saved as Hollow Square_log.gcode + + +>>> extrude.displayFiles(["Hollow Square.gcode"]) +File Hollow Square.gcode is being displayed. +.. +The gcode log file is saved as Hollow Square_log.gcode + + +>>> extrude.displayText(" +( GCode generated by March 29,2007 Skeinforge ) +( Extruder Initialization ) +.. +many lines of gcode +.. +") + +reprap.serial = serial.Serial(0, 19200, timeout = 60) +reprap.cartesian.x.active = True +reprap.cartesian.y.active = True +reprap.cartesian.z.active = True +reprap.extruder.active = True +reprap.cartesian.x.setNotify() +reprap.cartesian.y.setNotify() +reprap.cartesian.z.setNotify() +reprap.cartesian.x.limit = 2523 +reprap.cartesian.y.limit = 2000 +reprap.cartesian.homeReset( 200, True ) +( GCode generated by March 29,2007 Skeinforge ) +( Extruder Initialization ) +M100 P210 +M103 +reprap.extruder.setMotor(reprap.CMD_REVERSE, 0) +.. +many lines of gcode and extruder commands +.. +reprap.cartesian.homeReset( 600, True ) +reprap.cartesian.free() + + +Note: On my system the reprap is not connected, so I get can not connect messages, like: + +>>> extrude.extrude() +File Hollow Square.gcode is being extruded. +reprap.serial = serial.Serial(0, 19200, timeout = 60) +reprap.cartesian.x.active = True +reprap.cartesian.y.active = True +reprap.cartesian.z.active = True +reprap.extruder.active = True +reprap.cartesian.x.setNotify() +Error: Serial timeout +Error: ACK not recieved +.. + +On a system where a reprap is connected to the serial port, you should get the following: + +>>> extrude.extrude() +File Hollow Square.gcode is being extruded. +.. +The gcode log file is saved as Hollow Square_log.gcode + + +>>> extrude.extrudeFile("Hollow Square.gcode") +File Hollow Square.gcode is being extruded. +.. +The gcode log file is saved as Hollow Square_log.gcode + + +>>> extrude.extrudeFiles(["Hollow Square.gcode"]) +File Hollow Square.gcode is being extruded. +.. +The gcode log file is saved as Hollow Square_log.gcode + + +>>> extrude.extrudeText(" +( GCode generated by March 29,2007 Skeinforge ) +( Extruder Initialization ) +.. +many lines of gcode +.. +") + +reprap.serial = serial.Serial(0, 19200, timeout = 60) +reprap.cartesian.x.active = True +reprap.cartesian.y.active = True +reprap.cartesian.z.active = True +reprap.extruder.active = True +reprap.cartesian.x.setNotify() +reprap.cartesian.y.setNotify() +reprap.cartesian.z.setNotify() +reprap.cartesian.x.limit = 2523 +reprap.cartesian.y.limit = 2000 +reprap.cartesian.homeReset( 200, True ) +( GCode generated by March 29,2007 Skeinforge ) +( Extruder Initialization ) +M100 P210 +M103 +reprap.extruder.setMotor(reprap.CMD_REVERSE, 0) +.. +many lines of gcode and extruder commands +.. +reprap.cartesian.homeReset( 600, True ) +reprap.cartesian.free() +""" + +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__ + +try: + import serial # Import the pySerial modules. +except: + print('You do not have pySerial installed, which is needed to control the serial port.') + print('Information on pySerial is at:\nhttp://pyserial.wiki.sourceforge.net/pySerial') + +from skeinforge_tools.skeinforge_utilities.vector3 import Vector3 +from skeinforge_tools.skeinforge_utilities import archive +from skeinforge_tools.skeinforge_utilities import euclidean +from skeinforge_tools.skeinforge_utilities import gcodec +import math +import os +import reprap # Import the reprap module. +import time + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'greenarrow ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def display( filename = ''): + "Parse a gcode file and display the commands. If no filename is specified, parse all the gcode files which are not log files in this folder." + if filename == '': + displayFiles( getGCodeFilesWhichAreNotLogFiles() ) + return + displayFile( filename ) + +def displayFile( filename ): + "Parse a gcode file and display the commands." + print('File ' + filename + ' is being displayed.') + fileText = archive.getFileText( filename ) + gcodec.writeFileMessageSuffix( filename, displayText(fileText), 'The gcode log file is saved as ', '_log') + +def displayFiles( filenames ): + "Parse gcode files and display the commands." + for filename in filenames: + displayFile( filename ) + +def displayText(gcodeText): + "Parse a gcode text and display the commands." + skein = displaySkein() + skein.parseText(gcodeText) + return skein.output + +def extrude( filename = ''): + """Parse a gcode file and send the commands to the extruder. If no filename is specified, parse all the gcode files which are not log files in this folder. + This function requires write access to the serial device, running as root is one way to get that access.""" + if filename == '': + extrudeFiles( getGCodeFilesWhichAreNotLogFiles() ) + return + extrudeFile( filename ) + +def extrudeFile( filename ): + """Parse a gcode file and send the commands to the extruder. + This function requires write access to the serial device, running as root is one way to get that access.""" + print('File ' + filename + ' is being extruded.') + fileText = archive.getFileText( filename ) + gcodec.writeFileMessageSuffix( filename, extrudeText(fileText), 'The gcode log file is saved as ', '_log') + +def extrudeFiles( filenames ): + """Parse gcode files and send the commands to the extruder. + This function requires write access to the serial device, running as root is one way to get that access.""" + for filename in filenames: + extrudeFile( filename ) + +def extrudeText(gcodeText): + """Parse a gcode text and send the commands to the extruder. + This function requires write access to the serial device, running as root is one way to get that access.""" + skein = extrudeSkein() + skein.parseText(gcodeText) + return skein.output + +def getGCodeFilesWhichAreNotLogFiles(): + "Get gcode files which are not log files." + return archive.getFilesWithFileTypeWithoutWords('gcode', ['_log'] ) + +def getIntegerString(number): + "Get integer as string." + return str( int(number) ) + + +class displaySkein: + "A class to display a gcode skein of extrusions." + def __init__(self): + self.extruderActive = 0 + self.feedrateMinute = 200.0 + self.oldLocation = None + self.output = '' + + def addToOutput(self, line): + "Add line with a newline at the end to the output." + print(line) + self.output += line + '\n' + + def evaluateCommand( self, command ): + "Add an extruder command to the output." + self.addToOutput( command ) + + def helicalMove( self, isCounterclockwise, splitLine ): + "Parse a helical move gcode line and send the commands to the extruder." + if self.oldLocation == None: + return + location = Vector3( self.oldLocation ) + self.setFeedrate(splitLine) + setPointToSplitLine( location, splitLine ) + location = location + self.oldLocation + center = Vector3( self.oldLocation ) + indexOfR = getIndexOfStartingWithSecond( "R", splitLine ) + if indexOfR > 0: + radius = getDoubleAfterFirstLetter( splitLine[ indexOfR ] ) + halfLocationMinusOld = location - self.oldLocation + halfLocationMinusOld *= 0.5 + halfLocationMinusOldLength = halfLocationMinusOld.length() + centerMidpointDistance = math.sqrt( radius * radius - halfLocationMinusOldLength * halfLocationMinusOldLength ) + centerMinusMidpoint = getRotatedWiddershinsQuarterAroundZAxis( halfLocationMinusOld ) + centerMinusMidpoint.normalize() + centerMinusMidpoint *= centerMidpointDistance + if isCounterclockwise: + center.setToVec3( halfLocationMinusOld + centerMinusMidpoint ) + else: + center.setToVec3( halfLocationMinusOld - centerMinusMidpoint ) + else: + center.x = getDoubleForLetter( "I", splitLine ) + center.y = getDoubleForLetter( "J", splitLine ) + curveSection = 0.5 + center += self.oldLocation + afterCenterSegment = location - center + beforeCenterSegment = self.oldLocation - center + afterCenterDifferenceAngle = getAngleAroundZAxisDifference( afterCenterSegment, beforeCenterSegment ) + absoluteDifferenceAngle = abs( afterCenterDifferenceAngle ) + steps = int( math.ceil( max( absoluteDifferenceAngle * 2.4, absoluteDifferenceAngle * beforeCenterSegment.length() / curveSection ) ) ) + stepPlaneAngle = getPolar( afterCenterDifferenceAngle / steps, 1.0 ) + zIncrement = ( afterCenterSegment.z - beforeCenterSegment.z ) / float( steps ) + for step in range( 1, steps ): + beforeCenterSegment = getRoundZAxisByPlaneAngle( stepPlaneAngle, beforeCenterSegment ) + beforeCenterSegment.z += zIncrement + arcPoint = center + beforeCenterSegment + self.moveExtruder( arcPoint ) + self.moveExtruder( location ) + self.oldLocation = location + + def homeReset(self): + "Send all axies to home position. Wait until arrival." + homeCommandString = 'reprap.cartesian.homeReset(' + getIntegerString( self.feedrateMinute ) + ', True )' + self.evaluateCommand( homeCommandString ) + + def linearMove( self, splitLine ): + "Parse a linear move gcode line and send the commands to the extruder." + location = Vector3() + if self.oldLocation != None: + location = self.oldLocation + self.setFeedrate(splitLine) + setPointToSplitLine( location, splitLine ) + self.moveExtruder( location ) + self.oldLocation = location + + def moveExtruder(self, location): + "Seek to location. Wait until arrival." + moveSpeedString = getIntegerString( self.feedrateMinute ) + xMoveString = getIntegerString(location.x) + yMoveString = getIntegerString(location.y) + zMoveString = getIntegerString(location.z) + moveCommandString = 'reprap.cartesian.seek( (' + xMoveString + ', ' + yMoveString + ', ' + zMoveString + '), ' + moveSpeedString + ', True )' + self.evaluateCommand( moveCommandString ) + + def parseGCode(self, lines): + "Parse gcode and send the commands to the extruder." + self.evaluateCommand('reprap.serial = serial.Serial(0, 19200, timeout = 60)') # Initialise serial port, here the first port (0) is used. + self.evaluateCommand('reprap.cartesian.x.active = True') # These devices are present in network, will automatically scan in the future. + self.evaluateCommand('reprap.cartesian.y.active = True') + self.evaluateCommand('reprap.cartesian.z.active = True') + self.evaluateCommand('reprap.extruder.active = True') + self.evaluateCommand('reprap.cartesian.x.setNotify()') + self.evaluateCommand('reprap.cartesian.y.setNotify()') + self.evaluateCommand('reprap.cartesian.z.setNotify()') + self.evaluateCommand('reprap.cartesian.x.limit = 2523') + self.evaluateCommand('reprap.cartesian.y.limit = 2000') + self.homeReset() # The module is now ready to receive commands + for line in lines: + self.parseLine(line) + self.homeReset() + self.evaluateCommand('reprap.cartesian.free()') # Shut off power to all motors. + + def parseLine(self, line): + "Parse a gcode line and send the command to the extruder." + self.addToOutput(line) + splitLine = line.split(' ') + if len(splitLine) < 1: + return 0 + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + if firstWord == 'G2': + self.helicalMove( False, splitLine ) + if firstWord == 'G3': + self.helicalMove( True, splitLine ) + if firstWord == 'M101': + self.extruderActive = 1 + self.evaluateCommand('reprap.extruder.setMotor(reprap.CMD_REVERSE, 150)') + if firstWord == 'M103': + self.extruderActive = 0 + self.evaluateCommand('reprap.extruder.setMotor(reprap.CMD_REVERSE, 0)') + self.oldActiveLocation = None + + def parseText( self, text ): + "Parse a gcode text and evaluate the commands." + textLines = getTextLines(text) + self.parseGCode( textLines ) + + def setFeedrate( self, splitLine ): + "Set the feedrate to the gcode split line." + indexOfF = getIndexOfStartingWithSecond( "F", splitLine ) + if indexOfF > 0: + self.feedrateMinute = getDoubleAfterFirstLetter( splitLine[indexOfF] ) + + +class extrudeSkein( displaySkein ): + "A class to extrude a gcode skein of extrusions." + def evaluateCommand( self, command ): + """Add an extruder command to the output and evaluate the extruder command. + Display the entire command, but only evaluate the command after the first equal sign.""" + self.addToOutput( command ) + firstEqualIndex = command.find('=') + exec( command ) + + +print('Extrude has been imported.') +print('The gcode files in this directory that are not log files are the following:') +print( getGCodeFilesWhichAreNotLogFiles() ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/frank_davies/bring_to_temp.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/frank_davies/bring_to_temp.py new file mode 100644 index 0000000..4fe8ce5 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/frank_davies/bring_to_temp.py @@ -0,0 +1,47 @@ +# bring reprap to temperature +# Frank Davies +import serial +import time +import sys + +def out_rep(out_string): + ser.write(out_string) + print out_string + #print "waiting for OK" + start_time=time.clock() + while (ser.inWaiting()==0) and (time.clock()temp.gcode # make temporary file with extra at the beginning +ascii-xfr -sv temp.gcode >/dev/ttyUSB0 # transfer the file +#cp $1 /dev/ttyUSB0 # alternate transfer method commented out. +echo DONE diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/reprap.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/reprap.py new file mode 100644 index 0000000..fdceb4b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/reprap.py @@ -0,0 +1,467 @@ +""" + pyRepRap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + pyRepRap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pyRepRap. If not, see . +""" +""" + This is the main user imported module containing all end user functions +""" + +# add commands to switch to gcode mode to allow any script using this library to write gcode too. + +try: + import serial # Import the pySerial modules. +except: + print('You do not have pySerial installed, which is needed to control the serial port.') + print('Information on pySerial is at:\nhttp://pyserial.wiki.sourceforge.net/pySerial') + +import snap +import time + + +printDebug = False # print debug info + +# SNAP Control Commands - Taken from PIC code # + +# extruder commands # +CMD_VERSION = 0 +CMD_FORWARD = 1 +CMD_REVERSE = 2 +CMD_SETPOS = 3 +CMD_GETPOS = 4 +CMD_SEEK = 5 +CMD_FREE = 6 +CMD_NOTIFY = 7 +CMD_ISEMPTY = 8 +CMD_SETHEAT = 9 +CMD_GETTEMP = 10 +CMD_SETCOOLER = 11 +CMD_PWMPERIOD = 50 +CMD_PRESCALER = 51 +CMD_SETVREF = 52 +CMD_SETTEMPSCALER = 53 +CMD_GETDEBUGINFO = 54 +CMD_GETTEMPINFO = 55 + +# stepper commands # +CMD_VERSION = 0 +CMD_FORWARD = 1 +CMD_REVERSE = 2 +CMD_SETPOS = 3 +CMD_GETPOS = 4 +CMD_SEEK = 5 +CMD_FREE = 6 +CMD_NOTIFY = 7 +CMD_SYNC = 8 +CMD_CALIBRATE = 9 +CMD_GETRANGE = 10 +CMD_DDA = 11 +CMD_FORWARD1 = 12 +CMD_BACKWARD1 = 13 +CMD_SETPOWER = 14 +CMD_GETSENSOR = 15 +CMD_HOMERESET = 16 +CMD_GETMODULETYPE = 255 + +# sync modes # +sync_none = 0 # no sync (default) +sync_seek = 1 # synchronised seeking +sync_inc = 2 # inc motor on each pulse +sync_dec = 3 # dec motor on each pulse + +snap.localAddress = 0 # local address of host PC. This will always be 0. +#global serialPort +#serialPort = False + +def openSerial( port, rate, tout ): + global serialPort + try: + serialPort = serial.Serial( port, rate, timeout = tout ) + return True + except 13: + print "You do not have permissions to use the serial port, try running as root" + +def closeSerial(): + serialPort.close() + +# Convert two 8 bit bytes to one integer +def bytes2int(LSB, MSB): + return int( (0x100 * int(MSB) ) | int(LSB) ) + +# Convert integer to two 8 bit bytes +def int2bytes(val): + MSB = int( ( int(val) & 0xFF00) / 0x100 ) + LSB = int( int(val) & 0xFF ) + return LSB, MSB + +#def loopTest(): +# p = snap.SNAPPacket( serial, snap.localAddress, snap.localAddress, 0, 1, [] ) + +# Scan reprap network for devices (incomplete) - this will be used by autoconfig functions when complete +def scanNetwork(): + devices = [] + for remoteAddress in range(1, 10): # For every address in range. full range will be 255 + print "Trying address " + str(remoteAddress) + p = snap.SNAPPacket( serialPort, remoteAddress, snap.localAddress, 0, 1, [CMD_GETMODULETYPE] ) # Create snap packet requesting module type + #p = snap.SNAPPacket( serialPort, remoteAddress, snap.localAddress, 0, 1, [CMD_VERSION] ) + if p.send(): # Send snap packet, if sent ok then await reply + rep = p.getReply() + if rep: + #devices[ rep.dataBytes[1] ] = remoteAddress + devices.append( { 'address':remoteAddress, 'type':rep.dataBytes[1], 'subType':rep.dataBytes[2] } ) # If device replies then add to device list. + else: + "print na" + else: + print "scan no ack" + time.sleep(0.5) + for d in devices: + #now get versions + print "device", d + +def getNotification(serialPort): + return snap.getPacket(serialPort) + +class extruderClass: + def __init__(self): + self.address = 8 + self.active = False + + def getModuleType(self): #note: do pics not support this yet? I can't see it in code and get no reply from pic + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_GETMODULETYPE] ) # Create SNAP packet requesting module type + if p.send(): + rep = p.getReply() + data = checkReplyPacket( rep, 2, CMD_GETMODULETYPE ) # If packet sent ok and was acknoledged then await reply, otherwise return False + if data: + return data[1] # If valid reply is recieved then return it, otherwise return False + return False + + def getVersion(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_VERSION] ) + if p.send(): + rep = p.getReply() + data = checkReplyPacket( rep, 3, CMD_VERSION ) + if data: + return data[1], data[2] + return False + + def setMotor(self, direction, speed): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [int(direction), int(speed)] ) ##no command being sent, whats going on? + if p.send(): + return True + return False + + def getTemp(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_GETTEMP] ) + if p.send(): + rep = p.getReply() + data = checkReplyPacket( rep, 2, CMD_GETTEMP ) + if data: + return data[1] + return False + + def setVoltateReference(self, val): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_SETVREF, int(val)] ) + if p.send(): + return True + return False + + def setHeat(self, lowHeat, highHeat, tempTarget, tempMax): + if self.active: + tempTargetMSB, tempTargetLSB = int2bytes( tempTarget ) + tempMaxMSB ,tempMaxLSB = int2bytes( tempMax ) + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_SETHEAT, int(lowHeat), int(highHeat), tempTargetMSB, tempTargetLSB, tempMaxMSB, tempMaxLSB] ) # assumes MSB first (don't know this!) + if p.send(): + return True + return False + + def setCooler(self, speed): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_SETCOOLER, int(speed)] ) + if p.send(): + return True + return False + + def freeMotor(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_FREE] ) + if p.send(): + return True + return False + +extruder = extruderClass() + + +def checkReplyPacket (packet, numExpectedBytes, command): + if packet: + if len( packet.dataBytes ) == numExpectedBytes: # check correct number of data bytes have been recieved + if packet.dataBytes[0] == command: # check reply is a reply to sent command + return packet.dataBytes + return False + + +class axisClass: + def __init__(self, address): + self.address = address + self.active = False # when scanning network, set this, then in each func below, check alive before doing anything + self.limit = 100000 # limit effectively disabled unless set + #move axis one step forward + def forward1(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_FORWARD1] ) + if p.send(): + return True + return False + + #move axis one step backward + def backward1(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_BACKWARD1] ) + if p.send(): + return True + return False + + #spin axis forward at given speed + def forward(self, speed): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_FORWARD, int(speed)] ) + if p.send(): + return True + return False + + #spin axis backward at given speed + def backward(self, speed): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_REVERSE, int(speed)] ) + if p.send(): + return True + return False + + #debug only + def getSensors(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_GETSENSOR] ) + if p.send(): + rep = p.getReply() + data = checkReplyPacket( rep, 3, CMD_GETSENSOR ) # replace this with a proper object in SNAP module? + if data: + print data[1], data[2] + return False + + #get current axis position + def getPos(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_GETPOS] ) + if p.send(): + rep = p.getReply() + data = checkReplyPacket( rep, 3, CMD_GETPOS ) + if data: + pos = bytes2int( data[1], data[2] ) + return pos # return value + return False + + #set current position (set variable not robot position) + def setPos(self, pos): + if self.active: + posMSB ,posLSB = int2bytes( pos ) + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_SETPOS, posMSB, posLSB] ) + if p.send(): + return True + return False + + #power off coils on stepper + def free(self): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_FREE] ) + if p.send(): + return True + return False + + #seek to axis location. When waitArrival is True, funtion does not return until seek is compete + def seek(self, pos, speed, waitArrival = True): + if self.active and pos <= self.limit: + posMSB ,posLSB = int2bytes( pos ) + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_SEEK, int(speed), posMSB ,posLSB] ) + if p.send(): + if waitArrival: + if printDebug: print " wait notify" + notif = getNotification( serialPort ) + if notif.dataBytes[0] == CMD_SEEK: + if printDebug: print " valid notification for seek" + else: + return False + if printDebug: print " rec notif" + return True + return False + + #goto 0 position. When waitArrival is True, funtion does not return until reset is compete + def homeReset(self, speed, waitArrival = True): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_HOMERESET, int(speed)] ) + if p.send(): + if waitArrival: + if printDebug: print "reset wait" + notif = getNotification( serialPort ) + if notif.dataBytes[0] == CMD_HOMERESET: + if printDebug: print " valid notification for reset" + else: + return False + if printDebug: print "reset done" + return True + return False + + def setNotify(self): + #global serialPort + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_NOTIFY, snap.localAddress] ) # set notifications to be sent to host + if p.send(): + return True + return False + + def setSync( self, syncMode ): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_SYNC, int(syncMode)] ) + if p.send(): + return True + return False + + def DDA( self, speed, seekTo, slaveDelta, waitArrival = True): + if self.active and seekTo <= self.limit: + masterPosMSB, masterPosLSB = int2bytes( seekTo ) + slaveDeltaMSB, slaveDeltaLSB = int2bytes( slaveDelta ) + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_DDA, int(speed), masterPosMSB ,masterPosLSB, slaveDeltaMSB, slaveDeltaLSB] ) #start sync + if p.send(): + if waitArrival: + notif = getNotification( serialPort ) + if notif.dataBytes[0] == CMD_DDA: + if printDebug: print " valid notification for DDA" # todo: add actual enforement on wrong notification + else: + return False + return True + return False + + def setPower( self, power ): + if self.active: + p = snap.SNAPPacket( serialPort, self.address, snap.localAddress, 0, 1, [CMD_SETPOWER, int( power * 0.63 )] ) # This is a value from 0 to 63 (6 bits) + if p.send(): + return True + return False + +class syncAxis: + def __init__( self, axis, seekTo, delta, direction ): + self.axis = axis + self.seekTo = seekTo + self.delta = delta + self.direction = direction + + if self.direction > 0: + self.syncMode = sync_inc + else: + self.syncMode = sync_dec + + +class cartesianClass: + def __init__(self): + # initiate axies with addresses + self.x = axisClass(2) + self.y = axisClass(3) + self.z = axisClass(4) + + # goto home position (all axies) + def homeReset(self, speed, waitArrival = True): + if self.x.homeReset( speed, waitArrival ): #setting these to true breaks waitArrival convention. need to rework waitArrival and possibly have each axis storing it's arrival flag and pos as variables? + print "X Reset" + if self.y.homeReset( speed, waitArrival ): + print "Y Reset" + if self.z.homeReset( speed, waitArrival ): + print "Z Reset" + # add a way to collect all three notifications (in whatever order) then check they are all there. this will allow symultanious axis movement and use of waitArrival + + # seek to location (all axies). When waitArrival is True, funtion does not return until all seeks are compete + # seek will automatically use syncSeek when it is required. Always use the seek function + def seek(self, pos, speed, waitArrival = True): + curX, curY, curZ = self.x.getPos(), self.y.getPos(), self.z.getPos() + x, y, z = pos + if x <= self.x.limit and y <= self.y.limit and z <= self.z.limit: + if printDebug: print "seek from [", curX, curY, curZ, "] to [", x, y, z, "]" + if x == curX or y == curY: + if printDebug: print " standard seek" + self.x.seek( x, speed, True ) #setting these to true breaks waitArrival convention. need to rework waitArrival and possibly have each axis storing it's arrival flag and pos as variables? + self.y.seek( y, speed, True ) + else: + if printDebug: print " sync seek" + self.syncSeek( pos, speed, waitArrival ) + if z != curZ: + self.z.seek( z, speed, True ) + else: + print "Trying to print outside of limit, aborting seek" + + # perform syncronised x/y movement. This is called by seek when needed. + def syncSeek(self, pos, speed, waitArrival = True): + curX, curY = self.x.getPos(), self.y.getPos() + newX, newY, nullZ = pos + deltaX = abs( curX - newX ) # calc delta movements + deltaY = abs( curY - newY ) + directionX = ( curX - newX ) / -deltaX # gives direction -1 or 1 + directionY = ( curY - newY ) / -deltaY + if printDebug: print " dx", deltaX, "dy", deltaY, "dirX", directionX, "dirY", directionY + if printDebug: print " using x master" + + master = syncAxis( self.x, newX, deltaX, directionX ) # create two swapable data structures, set x as master, y as slave + slave = syncAxis( self.y, newY, deltaY, directionY ) + + if slave.delta > master.delta: # if y has the greater movement then make y master + slave, master = master, slave + if printDebug: print " switching to y master" + if printDebug: print " masterPos", master.seekTo, "slaveDelta", slave.delta + slave.axis.setSync( slave.syncMode ) + master.axis.DDA( speed, master.seekTo, slave.delta, True ) + time.sleep(0.1) + slave.axis.setSync( sync_none ) + if printDebug: print " sync seek complete" + + # get current position of all three axies + def getPos(self): + return self.x.getPos(), self.y.getPos(), self.z.getPos() + + # stop all motors + def stop(self): + self.x.forward( 0 ) + self.y.forward( 0 ) + self.z.forward( 0 ) + + # free all motors (no current on coils) + def free(self): + self.x.free() + self.y.free() + self.z.free() + def setPower(self, power): + self.x.setPower( power ) + self.y.setPower( power ) + self.z.setPower( power ) + #def lockout(): + #keep sending power down commands to all board every second + + +cartesian = cartesianClass() + +#wait on serial only when after somthing? or do pics send messages without pc request? + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/send.html b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/send.html new file mode 100644 index 0000000..c150344 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/send.html @@ -0,0 +1,78 @@ +

+send.py is "glue" for sending a skeinforge-generated gcode file to your arduino-based reprap. +

+

+It is a command-line only utility, starting it from your GUI of choice will not be useful. +

+

+ +Syntax is simple: +

+send.py [options] <gcode or file> [<gcode or file>...]
+
+

+

+ +To send your extruder.gcode file to your reprap, type: +

+send.py extruder.gcode
+
+

+

+This will print the extruder.gcode shape, and print comments to the console. +Typically, comments are such things as +(>layerStart< 0.402 ) +which can be very useful to track the progress of your build, so these are "on" by default. +

+

+There are a simple options that may be useful for special circumstances. +These are --quiet, --noreset, --port, and --verbose. +These can also be writted -q, -n, -p, and -v for short. +If you are writing a script (for instance, the M100 scripts for use with EMC) then I'd recommend that you use the long options, so future maintainers don't have to look things up. +

+

+Quiet will suppress all but the most basic messages. It won't supress everything, however. Error messages will still be printed. But it will supress almost everything. +Since options are processed in order on the command line, so if you want to supress messages about processing options, you'll have to make Quiet the first option. +

+

+Normally, the arduino is reset by dropping the DTR line for 1 second. +Since the Arduino takes several seconds to reboot, you will want to disable this behavior when including send.py in scripts. +

+

+The verbose option will cause not just comments, but every command sent to and every response recieved from the arduino to be printed out. Useful for debugging, but it prints a great deal of text in ordinary usage. +

+

+The port option uses reasonable defaults for most operating systems - /dev/ttyUSB0 for posix systems, and COM3 for windows systems. +If you have some other port you'll have to set in manually as "send.py -p COM5 extruder.gcode" or +"send.py --port /dev/ttyUSB5 extruder.gcode" or something. +

+

+Future improvements: +

+

+

+I would like to add support for more g-code contructs on the python side of things. +Stuff like variables, subroutines, etc. +Stuff that the g-code firmware is unlikely to ever implement because of size restrictions. +The current version works, and skeinforge doesn't use these features. +It might be nice for a future "print several objects at once, automatically filling the bed area" interface. +And if I get my extruder built, I might even take the time to do that! +

+RepRapArduinoSerialSender.py +

+

+ +This, like send.py, was cribbed from Brenden Erwin's code for using EMC. It's been modified somewhat for more general use. +There are only five methods: +

+
+__init__
+reset
+write
+read
+close
+
+

+Of these, you should not directly use read(). It's used internally by write and reset to verify that the operation was completed successfully. +

+ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/send.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/send.py new file mode 100644 index 0000000..c7d7db8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/send.py @@ -0,0 +1,168 @@ +#!/usr/bin/python2.5 +# encoding: utf-8 +""" +Created by Brendan Erwin on 2008-05-21. +Modified by John Gilmore 2008-08-23 +Copyright (c) 2008 Brendan Erwin. All rights reserved. +Copyright (c) 2008 John Gilmore. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +import os +import sys +import getopt +import RepRapArduinoSerialSender + +help_message = ''' +Usage: send [options] [...] + --verbose : Verbose - print ALL communication, not just comments. + -v : prints responses from the arduino, and every command sent. + + --quiet : Quiet - don't print anything, whereas + -q : normally comments are printed. + + --noreset : skip the reset. + -n : causes the arduino to not be deliberately reset. + + --port : Set the port to write to + -p : default is "/dev/ttyUSB0" for posix, "COM3" for windows. + + --baud : Set the baud rate to use + -b : defaults to 19200 + +You may call this with either a single statement of g-code +to be sent to the arduino, or with the name of a g-code file. +------------------------------------------------------------------ +Copyright (C) 2008 Brendan Erwin +Copyright (C) 2008 John Gilmore + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +''' +#This was originally release by Brendan under GPLv2 or later + + + +class Usage(Exception): + def __init__(self, msg): + self.msg = msg + +def main(argv=None): + + # Set resonable defaults for port, verbosity, and reset. + verbose = 1 + baud = 19200 + reset = True + if os.name == "posix": + port = "/dev/ttyUSB0" + elif os.name == "nt": + port = "COM3" + else: + port = "/dev/ttyUSB0" + + if argv is None: + argv = sys.argv + + try: + try: + opts, argv = getopt.getopt(argv[1:], "vqnhb:p:", ["verbose","quiet","noreset","help","baud=","port="]) + except getopt.error, msg: + raise Usage(msg) + + # option processing + for option, value in opts: + if option in ( "-v" , "--verbose" ): + verbose = 2 + print "You have requested that verbosity be set to True" + print "All communication with the arduino will be printed" + elif option in ( "-q" , "--quiet" ): + verbose = 0 + #don't print "quiet mode on" + elif option in ( "-n" , "--noreset" ): + reset = False + if verbose: + print "Arduino will not be reset before sending gcode" + elif option in ( "-p" , "--port" ): + port = value + elif option in ("-h", "--help" ): + raise Usage(help_message) + elif option in ("-b", "--baud" ): + baud = int(value) + + if verbose: + print "Arduino port set to " + port + + except Usage, err: + #print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg) + print >> sys.stderr, str(err.msg) + print >> sys.stderr, "For help use --help" + return 2 + + + sender = RepRapArduinoSerialSender.RepRapArduinoSerialSender(port, baud, verbose>1) + if reset: + sender.reset() + + for filename in argv: + processfile(filename,sender,verbose) + +def processfile(filename,sender,verbose): + try: + datafile = open(filename) + except IOError: + #Ignore verbosity settings here, as if it's a typo we'll want to know. + line=filename + if line.lstrip().startswith(("G","X","Y","Z","M")): + if verbose: + print "Unable to open file \"" + line + "\", assuming it's one line of direct G-code..." + sender.write(line) + return 0 + else: + print "Unable to open file \"" + line + "\"" + sys.exit(-1) + + try: + for line in datafile: + line=line.rstrip() + # Ignore lines with comments (not technically correct, should ignore only the comment, + # but all gcode files that I've actually seen so far don't have code on comment lines. + if line.lstrip().startswith( ('(', '"' , '\\') ): + if verbose: + print line + continue + + # This is the place to insert G-Code interpretation. + # Subroutines, Variables, all sorts of fun stuff. + # probably by calling a "gcode interpreter" class intead + # of simply "sender". + + sender.write(line) + finally: + datafile.close() + + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/snap.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/snap.py new file mode 100644 index 0000000..30845d6 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/fabricate/snap.py @@ -0,0 +1,280 @@ +""" + pyRepRap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + pyRepRap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pyRepRap. If not, see . +""" + +try: + import serial # Import the pySerial modules. +except: + print('You do not have pySerial installed, which is needed to control the serial port.') + print('Information on pySerial is at:\nhttp://pyserial.wiki.sourceforge.net/pySerial') + + +offset_payload = 5 +offset_hdb1 = 2 + +#ackTimeout = 0.3 # unused +messageTimeout = 0.3 # used for ack also (possible to split?) +#messageTimeout = 2 # used for ack also (possible to split?) +retries = 3 # number of packet send retries allowed (for whatever failed reason + +printOutgoingPackets = False +printIncomingPackets = False +printFailedPackets = False + +#this is done again in full decode, but needed here so num bytes to expect is known. +def getPacketLen(buffer): + l = breakHDB1( buffer[offset_hdb1] ) + #l = buffer[offset_hdb1] & 0x0f; + #if (l & 8) != 0: + # return 8 << (l & 7) + return l + +#PCaddress = 0 + +#wait for a packet on serial - note : packets addressed to something other than 0 get recieved if you try sending to a non existant pcb (looped round). should we delete or pass on? (they cause errors right now in getpacket) +def getPacket(ser): + buffer = [] + while 1: + byte = ser.read() # read serial byte. + if len(byte) > 0: + buffer.append( ord (byte) ) # add serial byte to buffer. + else: + print "Error: Serial timeout" #clear buffer on timeout? + return False # timeout has occured. + #TODO - add check for sync on first byte + if len(buffer) > 4: # one packet length is recieved (HDB1?). + expectedLength = getPacketLen(buffer) + offset_payload + 1; # read num data bytes. + if len(buffer) >= expectedLength: # check we have enough data, otherwise continue reading from serial. + #print "############PR#############" + p = SNAPPacket( ser, 0, 0, 0, 0, [] ) # create empty packet + for b in buffer: + p.addByte(b) # add byte to packet + p.decode() + if printIncomingPackets: + print "###INCOMING PACKET##" + p.printPacket() + print "###END INCOMING PACKET##" + return p # return recieved packet + #need to check if packet is for pc (0), if not send on. + +#class for checksum calculator +class SNAPChecksum: + def __init__(self): + self.crc = 0 + def addData(self, data): + #byte i = (byte)(data ^ self.crc) + i = data ^ self.crc + self.crc = 0 + if((i & 1) != 0): + self.crc ^= 0x5e + if((i & 2) != 0): + self.crc ^= 0xbc + if((i & 4) != 0): + self.crc ^= 0x61 + if((i & 8) != 0): + self.crc ^= 0xc2 + if((i & 0x10) != 0): + self.crc ^= 0x9d + if((i & 0x20) != 0): + self.crc ^= 0x23 + if((i & 0x40) != 0): + self.crc ^= 0x46 + if((i & 0x80) != 0): + self.crc ^= 0x8c + return data + def getResult(self): + return self.crc + + +#class for snap packet +class SNAPPacket: + def __init__(self, serial, DAB, SAB, ACK, NAK, dataBytes): #specify serial here, not reason not to + self.SYNC = 0x54 + self.DAB = DAB + self.SAB = SAB + self.ACK = ACK + self.NAK = NAK + self.dataBytes = dataBytes + + self.bytes = [] + self.leftoverBytes = [] + self.encoded = False + self.decoded = False + self.valid = False + self.serial = serial + + #manually add a byte to packet (unused) + def addByte(self, byte): + self.bytes.append(byte) + + #convert individual packet properties into table self.bytes (raw data packet) + def encode(self): + self.NDB = len(self.dataBytes) + self.bytes = [] + self.bytes.insert( 0, 0xFF & self.SYNC ) #SYNC + self.bytes.insert( 1, 0xFF & makeHDB2(self.ACK, self.NAK) ) #HDB2 + self.bytes.insert( 2, 0xFF & makeHDB1(self.NDB) ) #HDB1 + self.bytes.insert( 3, 0xFF & self.DAB ) #DAB + self.bytes.insert( 4, 0xFF & self.SAB ) #SAB + + for d in self.dataBytes: + self.bytes.append( 0xFF & d ) #DATA + + checksum = SNAPChecksum() + for d in self.bytes[1:]: + checksum.addData(d) + self.CRC = checksum.getResult() + self.bytes.append( self.CRC ) #CRC + #print self.bytes + self.encoded = True + + #convert table self.bytes (raw data packet) into individual packet properties + def decode(self): + self.SYNC = self.bytes[0] + self.HDB2 = self.bytes[1] + self.HDB1 = self.bytes[2] + self.DAB = self.bytes[3] + self.SAB = self.bytes[4] + self.NDB = breakHDB1(self.HDB1) + + self.dataBytes = [] + for d in self.bytes[5:5 + self.NDB]: + self.dataBytes.append(d) + + #print self.bytes, self.NDB + self.CRC = self.bytes[5 + self.NDB::6 + self.NDB][0] + numLeftoverBytes = len(self.bytes) - 6 - self.NDB + self.leftoverBytes = self.bytes[6 + self.NDB:len(self.bytes)] + if numLeftoverBytes > 0: + print "leftover bytes", numLeftoverBytes, self.leftoverBytes + self.ACK, self.NAK = breakHDB2(self.HDB2) + self.bytes = self.bytes[:6 + self.NDB] + #print "newb", self.bytes + self.decoded = True + + #calculate checksum, compare to value in recieved packet + def check(self): + newChecksum = SNAPChecksum() + for d in self.bytes[1:-1]: + newChecksum.addData(d) + testCRC = newChecksum.getResult() + if testCRC == self.CRC: + self.valid = True + return True + else: + self.valid = False + return False, testCRC, self.CRC + + #actual sending of data packet (self.bytes) + def sendBytes(self): + if self.encoded == True: + for d in self.bytes: + #print "sending", d, chr(d) + self.serial.write(chr(d)) + else: + print "Error: packet not encoded" + + #user send function, sends packet and awaits and checks acknoledgement. + def send(self): + self.encode() + retriesLeft = retries + while retriesLeft > 0: # try sending define number of times only + self.sendBytes() # send data + if printOutgoingPackets: + print "###OUTGOING PACKET##" + self.decode() #remove need for this (tidy up) + self.printPacket() + print "###END OUTGOING PACKET##" + + ack = getPacket(self.serial) # await ack, returns false on timout + if ack: + ack.decode() + if ack.ACK == 1 and ack.SAB == self.DAB: # check that packet is an acknoledgement and that it is from the device we just messaged. + return True + #do some check on ack - TODO + if printFailedPackets: + print "###FAILED OUTGOING PACKET##" + self.decode() #remove need for this (tidy up) + self.printPacket() + print "###END FAILED OUTGOING PACKET##" + else: + print "Error: ACK not recieved" + if printFailedPackets: + print "###FAILED OUTGOING PACKET##" + self.decode() #remove need for this (tidy up) + self.printPacket() + print "###END FAILED OUTGOING PACKET##" + + retriesLeft = retriesLeft - 1 + print "Error: Packet send FAILED (or reply)" + return False + + # get a modules reply packet (not ack) + def getReply(self): + rep = getPacket(self.serial) + return rep + + #print packet info to console + def printPacket(self): + if self.decoded == True: + print self.bytes + print "SNAP Packet:" + if self.SYNC == 0x54: + print "...Sync OK" + else: + print "...Sync Error" + print "...Check: ", self.check() + print "...DATA", self.dataBytes + print "...CRC", self.CRC + print "...SAB", self.SAB + print "...DAB", self.DAB + print "...HDB1", self.HDB1, ":" + print "...........NDB", self.NDB + print "...HDB2", self.HDB2, ":" + print "...........ACK", self.ACK + print "...........NAK", self.NAK + print "END OF PACKET" + else: + print "Error: packet not decoded" + + + +#create HDB2 +def makeHDB2(ACK, NAK): + SAB = 1 # Length of the Source Address Bytes, in Binary. RepRap currently only accepts source addresses of 1 byte length + DAB = 1 # Length of the Destination Address Bytes, in Binary. RepRap currently only accepts destinations of 1 byte length + PFB = 0 # Length of Protocol Flag Bytes. RepRap does not accept any protocol flag bytes, so this must be set to 00 + HDB2val = ((DAB & 0x3) * pow(2,6)) | ((SAB & 0x3) * pow(2,4)) | ((PFB & 0x3) * pow(2,2)) | ((ACK & 0x1) * pow(2,1)) | (NAK & 0x1) + #print "HDB2 = '" + str(HDB2val) + "'" + return HDB2val + +def breakHDB2(HDB2): + ACK = (HDB2 & 0x2) / pow(2,1) + NAK = (HDB2 & 0x1) + return ACK, NAK + +#create HDB1 +def makeHDB1(NDB): + CMD = 0 # Command Mode Bit. Not implemented by RepRap and should be set to 0 + EMD = 0x3 # Currently RepRap only implements 8-bit self.crc. this should be set to 011 + HDB1val = ((CMD & 0x1) * pow(2,7)) | ((EMD & 0x7) * pow(2,4)) | (0xF & NDB) + #print "HDB1 = '" + str(HDB1val) + "'" + return HDB1val + +def breakHDB1(HDB1): + NDB = HDB1 & 0xF + return NDB + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/enrique.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/enrique.py new file mode 100644 index 0000000..69a7a60 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/enrique.py @@ -0,0 +1,132 @@ +import Image, ImageDraw, ImageChops +from GifImagePlugin import getheader, getdata +from vector3 import Vector3 + +# Get the entire text of a file. +# @param fileName name of the file +# @return entire text of a file. +def getFileText(fileName): + file = open( fileName, 'r') + fileText = file.read() + file.close() + return fileText + +# Get the all the lines of text of a text. +# @param text text +# @return the lines of text of a text +def getTextLines(text): + return text.replace('\r', '\n').split('\n') + +# Get the double value of the word after the first letter. +# @param word string with value starting after the first letter +# @return double value of the word after the first letter +def getDoubleAfterFirstLetter(word): + return float( word[1 :] ) + +# Get the double value of the word after the first occurence of the letter in the split line. +def getDoubleForLetter(letter, splitLine): + return getDoubleAfterFirstLetter( splitLine[ getIndexOfStartingWithSecond(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 +def getIndexOfStartingWithSecond(letter, splitLine): + for wordIndex in xrange( 1, len(splitLine) ): + word = splitLine[ wordIndex ] + firstLetter = word[0] + if firstLetter == letter: + return wordIndex + return - 1 + +# straightforward delta encoding taken from gifmaker.py +def makedelta(fp, sequence): + """Convert list of image frames to a GIF animation file""" + previous = None + for im in sequence: + if not previous: + # global header + for s in getheader(im) + getdata(im): + fp.write(s) + else: + # delta frame + delta = ImageChops.subtract_modulo(im, previous) + bbox = delta.getbbox() + if not bbox: + bbox = (0,0, 1,1) + # compress difference + for s in getdata(im.crop(bbox), offset = bbox[:2]): + fp.write(s) + previous = im.copy() + fp.write(";") + + + +class g2gif: + def __init__(self,fileName, outfile): + self.last_pos = Vector3() + self.last_pos.z = 999 + self.do_move = 1 + fileText = getFileText(fileName) + textLines = getTextLines(fileText) + self.images = [] + self.image = None + for line in textLines: + self.parseLine(line) + self.images.append(self.image) + # write GIF animation + fp = open(outfile, "wb") + makedelta(fp, self.images) + fp.close() + + + def parseLine(self, line): + splitLine = line.split(' ') + if len(splitLine) < 1: + return 0 + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + if firstWord == 'M101': + self.do_move = 1 + + # Set the feedRate to the gcode split line. + def setFeedRate( self, splitLine ): + indexOfF = getIndexOfStartingWithSecond( "F", splitLine ) + if indexOfF > 0: + self.feedRateMinute = getDoubleAfterFirstLetter( splitLine[indexOfF] ) + + # Set a point to the gcode split line. + def setPointComponent( self, point, splitLine ): + point.x = getDoubleForLetter( "X", splitLine ) + point.y = getDoubleForLetter( "Y", splitLine ) + indexOfZ = getIndexOfStartingWithSecond( "Z", splitLine ) + if indexOfZ > 0: + point.z = getDoubleAfterFirstLetter( splitLine[indexOfZ] ) + + def scale( self, x, y ): + return x * 5 + 150, - y * 5 + 100 + + def linearMove( self, splitLine ): + location = Vector3() + self.setFeedRate(splitLine) + self.setPointComponent( location, splitLine ) + if location.z != self.last_pos.z: + if self.image: + for i in xrange(10): + self.images.append(self.image) + self.image = Image.new('P', (300, 200), 255) + palette = [] + for red in xrange(8): + for green in xrange(8): + for blue in xrange(4): + palette.extend((red * 255 / 7, green * 255 / 7, blue * 255 / 3)) + self.image.putpalette(palette) + self.segment = 0 + else: + if self.do_move: + draw = ImageDraw.Draw(self.image) + draw.line( ( self.scale( self.last_pos.x, self.last_pos.y ), self.scale( location.x, location.y ) ), fill = 192 ) + self.segment = self.segment + 1 + else: + draw = ImageDraw.Draw(self.image) + draw.line( ( self.scale( self.last_pos.x, self.last_pos.y ), self.scale(location.x, location.y ) ), fill = self.segment ) + self.last_pos = location + self.do_move = 0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/gRead.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/gRead.py new file mode 100644 index 0000000..abc4862 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/gRead.py @@ -0,0 +1,103 @@ +from vector3 import Vector3 + +# Get the entire text of a file. +# @param fileName name of the file +# @return entire text of a file. +def getFileText(fileName): + file = open( fileName, 'r') + fileText = file.read() + file.close() + return fileText + +# Get the all the lines of text of a text. +# @param text text +# @return the lines of text of a text +def getTextLines(text): + return text.replace('\r', '\n').split('\n') + +# Get the double value of the word after the first letter. +# @param word string with value starting after the first letter +# @return double value of the word after the first letter +def getDoubleAfterFirstLetter(word): + return float( word[1 :] ) + +# 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 +def getIndexOfStartingWithSecond(letter, splitLine): + for wordIndex in xrange( 1, len(splitLine) ): + word = splitLine[ wordIndex ] + firstLetter = word[0] + if firstLetter == letter: + return wordIndex + return - 1 + + +class gRead: + def __init__(self,fileName, layers,gcodeText = ''): + if gcodeText == '': + gcodeText = getFileText(fileName) + textLines = getTextLines(gcodeText) + self.last_pos = Vector3() + self.layers = layers + self.layer = None + self.thread = None + self.skeinforge = 0 + self.max_z = -9999999999 + for line in textLines: + self.parseLine(line) + self.newLayer() + + def parseLine(self, line): + if line.startswith( "(" ): + if line.startswith( "(" ): + self.newLayer() + return + splitLine = line.split() + if len(splitLine) < 1: + return 0 + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + if firstWord == 'M110': #filament height only sent by skeinforge at the moment + self.skeinforge = 1 + self.newThread() + if firstWord == 'M103': #extruder off + if self.skeinforge: + self.newThread() #end of thread if skeinforge + if firstWord == 'G92': #offset coordinate system + self.newThread() #for RepRap + + # Set a point to the gcode split line. + def setPointComponent( self, point, splitLine ): + indexOfX = getIndexOfStartingWithSecond( "X", splitLine ) + if indexOfX > 0: + point.x = getDoubleAfterFirstLetter( splitLine[indexOfX] ) + indexOfY = getIndexOfStartingWithSecond( "Y", splitLine ) + if indexOfY > 0: + point.y = getDoubleAfterFirstLetter( splitLine[indexOfY] ) + indexOfZ = getIndexOfStartingWithSecond( "Z", splitLine ) + if indexOfZ > 0: + point.z = getDoubleAfterFirstLetter( splitLine[indexOfZ] ) + + def newLayer(self): + self.newThread() + if self.layer: + self.layers.append(self.layer) + self.layer = [] + + def newThread(self): + if self.thread: + self.layer.append(self.thread) + self.thread = [] + + def linearMove( self, splitLine ): + if self.thread != None: + pos = self.last_pos.copy() + self.setPointComponent( pos, splitLine ) + if pos.z > self.max_z: +# self.newLayer() + self.max_z = pos.z + if pos.z < self.last_pos.z: + self.newThread() + if self.skeinforge or pos.z < self.max_z: + self.thread.append(pos) + self.last_pos = pos diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/hexgrid.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/hexgrid.py new file mode 100644 index 0000000..e0d4385 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/hexgrid.py @@ -0,0 +1,28 @@ +import math + +# root parameters +drillDiameter = 25.4 / 16.0 # 1/16 of an inch +separationMultiplier = 2.5 +safetyMultiplier = 1.0 +bottomLeft = complex( - 10.0, - 10.0 ) +topRight = complex( 10.0, 10.0 ) + +# derived parameters +separation = drillDiameter * separationMultiplier +horizontalSeparation = separation * math.cos( math.radians( 30.0 ) ) +oddRowOffset = separation * math.sin( math.radians( 30.0 ) ) +safetyMargin = complex( separation, separation ) * safetyMultiplier +safeBottomLeft = bottomLeft + safetyMargin +safeTopRight = topRight - safetyMargin + +# generate drill locations +drillLocation = safeBottomLeft * 1.0 +offset = 0.0 +while drillLocation.imag < safeTopRight.imag: + print('') + while drillLocation.real < safeTopRight.real: + print( drillLocation ) + drillLocation = complex( drillLocation.real + separation, drillLocation.imag ) + offset = oddRowOffset - offset + drillLocation = complex( safeBottomLeft.real + offset, drillLocation.imag + horizontalSeparation ) +print('') diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/layers.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/layers.py new file mode 100644 index 0000000..c3051e9 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/layers.py @@ -0,0 +1,72 @@ +from vector3 import Vector3 +import Image, ImageDraw + +def bounding_cube(layers): + min_x = 999999 + min_y = 999999 + min_z = 999999 + max_x = -999999 + max_y = -999999 + max_z = -999999 + for layer in layers: + for thread in layer: + for point in thread: + if point.x > max_x: + max_x = point.x + if point.y > max_y: + max_y = point.y + if point.z > max_z: + max_z = point.z + if point.x < min_x: + min_x = point.x + if point.y < min_y: + min_y = point.y + if point.z < min_z: + min_z = point.z + return Vector3(min_x, min_y, min_z), Vector3(max_x, max_y, max_z) + +def make_images(layers): + palette = [] + for i in xrange(256): + #resistor colour codes + if i == 1: + palette.extend((134, 100, 57)) # brown + elif i == 2: + palette.extend((255, 0, 0)) # red + elif i == 3: + palette.extend((218, 90, 35)) # orange + elif i == 4: + palette.extend((255, 255, 0)) # yellow + elif i == 5: + palette.extend(( 0, 255, 0)) # green + elif i == 6: + palette.extend(( 0, 0, 255)) # blue + elif i == 7: + palette.extend((255, 0, 255)) # purple + else: + palette.extend((i, i, i)) # shades of grey + cube = bounding_cube(layers) + scale = 10 + x0 = int(cube[0].x) - 1 + y0 = int(cube[0].y) - 1 + width = int(round(cube[1].x - x0) + 1) * scale + height = int(round(cube[1].y - y0) + 1) * scale + last_pos = None + images = [] + for layer in layers: + image = Image.new('P', (width, height), 255) + image.putpalette(palette) + draw = ImageDraw.Draw(image) + segment = 0 + for thread in layer: + if last_pos != None: + draw.line(((( last_pos.x - x0) * scale, height - ( last_pos.y - y0) * scale), + ((thread[0].x - x0) * scale, height - (thread[0].y - y0) * scale)), fill = 128) + last_pos = thread[0].copy() + for point in thread[1:]: + draw.line((((last_pos.x - x0) * scale, height - (last_pos.y - y0) * scale), + ( (point.x - x0) * scale, height - (point.y - y0) * scale)), fill = segment % 8) + last_pos = point.copy() + segment = segment + 1 + images.append(image) + return images diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/preview.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/preview.py new file mode 100644 index 0000000..e48a6d4 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/preview.py @@ -0,0 +1,69 @@ +import sys +try: + import Tkinter +except: + print('You do not have Tkinter, which is needed for the graphical interface.') + print('Information on how to download Tkinter is at:\nwww.tcl.tk/software/tcltk/') +try: + from layers import * + from gRead import * + import ImageTk +except: + print('You do not have the Python Imaging Library, which is needed by preview and gifview to view the gcode.') + print('The Python Imaging Library can be downloaded from:\nwww.pythonware.com/products/pil/') + +class Preview: + def __init__(self, layers): + self.images = make_images(layers) + self.index = 0 + size = self.images[0].size + self.root = Tkinter.Tk() + self.root.title("Gifscene from HydraRaptor") + frame = Tkinter.Frame(self.root) + frame.pack() + self.canvas = Tkinter.Canvas(frame, width = size[0], height = size[1]) + self.canvas.pack() + self.canvas.config(scrollregion=self.canvas.bbox(Tkinter.ALL)) + self.exit_button = Tkinter.Button(frame, text = "Exit", fg = "red", command = frame.quit) + self.exit_button.pack(side=Tkinter.RIGHT) + self.down_button = Tkinter.Button(frame, text = "Down", command = self.down) + self.down_button.pack(side=Tkinter.LEFT) + self.up_button = Tkinter.Button(frame, text = "Up", command = self.up) + self.up_button.pack(side=Tkinter.LEFT) + self.update() + self.root.mainloop() + + def update(self): + # FIXME: Somehow this fails if this is launched using the Preferences, + # but works from the command-line. + self.image = ImageTk.PhotoImage(self.images[self.index]) + self.canvas.create_image(0,0, anchor= Tkinter.NW, image = self.image) + if self.index < len(self.images) - 1: + self.up_button.config(state = Tkinter.NORMAL) + else: + self.up_button.config(state = Tkinter.DISABLED) + if self.index > 0: + self.down_button.config(state = Tkinter.NORMAL) + else: + self.down_button.config(state = Tkinter.DISABLED) + + def up(self): + self.index += 1 + self.update() + + def down(self): + self.index -= 1 + self.update() + + +def viewGif( fileName, gcodeText = ''): + layers = [] + try: + gRead(fileName, layers, gcodeText) + Preview(layers) + except Exception, why: + print('Preview failed: ' + str( why ) ) + + +if __name__ == "__main__": + viewGif(' '.join(sys.argv[1 :])) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/vector3.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/vector3.py new file mode 100644 index 0000000..9bac3ba --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/miscellaneous/nophead/vector3.py @@ -0,0 +1,489 @@ +""" +Vec3 is a three dimensional vector class. + +Below are examples of Vector3 use. + +>>> from vector3 import Vector3 +>>> origin = Vector3() +>>> origin +0.0, 0.0, 0.0 +>>> pythagoras = Vector3( 3, 4, 0 ) +>>> pythagoras +3.0, 4.0, 0.0 +>>> pythagoras.magnitude() +5.0 +>>> pythagoras.magnitudeSquared() +25 +>>> triplePythagoras = pythagoras * 3.0 +>>> triplePythagoras +9.0, 12.0, 0.0 +>>> plane = pythagoras.dropAxis() +>>> plane +(3+4j) +""" + +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__ + +import math +import operator + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Nophead \nArt of Illusion ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +class Vector3: + "A three dimensional vector class." + __slots__ = ['x', 'y', 'z'] + + def __init__( self, x = 0.0, y = 0.0, z = 0.0 ): + self.x = x + self.y = y + self.z = z + + def __abs__(self): + "Get the magnitude of the Vector3." + return math.sqrt( self.x * self.x + self.y * self.y + self.z * self.z ) + + magnitude = __abs__ + + def __add__(self, other): + "Get the sum of this Vector3 and other one." + return Vector3( self.x + other.x, self.y + other.y, self.z + other.z ) + + def __copy__(self): + "Get the copy of this Vector3." + return Vector3( self.x, self.y, self.z ) + + __pos__ = __copy__ + + copy = __copy__ + + def __div__(self, other): + "Get a new Vector3 by dividing each component of this one." + return Vector3( self.x / other, self.y / other, self.z / other ) + + def __eq__(self, other): + "Determine whether this vector is identical to other one." + if other == None: + return False + return self.x == other.x and self.y == other.y and self.z == other.z + + def __floordiv__(self, other): + "Get a new Vector3 by floor dividing each component of this one." + return Vector3( self.x // other, self.y // other, self.z // other ) + + def __hash__(self): + "Determine whether this vector is identical to other one." + return self.__repr__().__hash__() + + def __iadd__(self, other): + "Add other Vector3 to this one." + self.x += other.x + self.y += other.y + self.z += other.z + return self + + def __idiv__(self, other): + "Divide each component of this Vector3." + self.x /= other + self.y /= other + self.z /= other + return self + + def __ifloordiv__(self, other): + "Floor divide each component of this Vector3." + self.x //= other + self.y //= other + self.z //= other + return self + + def __imul__(self, other): + "Multiply each component of this Vector3." + self.x *= other + self.y *= other + self.z *= other + return self + + def __isub__(self, other): + "Subtract other Vector3 from this one." + self.x -= other.x + self.y -= other.y + self.z -= other.z + return self + + def __itruediv__(self, other): + "True divide each component of this Vector3." + self.x = operator.truediv( self.x, other ) + self.y = operator.truediv( self.y, other ) + self.z = operator.truediv( self.z, other ) + return self + + def __mul__(self, other): + "Get a new Vector3 by multiplying each component of this one." + return Vector3( self.x * other, self.y * other, self.z * other ) + + def __ne__(self, other): + "Determine whether this vector is not identical to other one." + return not self.__eq__(other) + + def __neg__(self): + return Vector3( - self.x, - self.y, - self.z ) + + def __nonzero__(self): + return self.x != 0 or self.y != 0 or self.z != 0 + + def __repr__(self): + "Get the string representation of this Vector3." + return '%s, %s, %s' % ( self.x, self.y, self.z ) + + def __rdiv__(self, other): + "Get a new Vector3 by dividing each component of this one." + return Vector3( other / self.x, other / self.y, other / self.z ) + + def __rfloordiv__(self, other): + "Get a new Vector3 by floor dividing each component of this one." + return Vector3( other // self.x, other // self.y, other // self.z ) + + def __rmul__(self, other): + "Get a new Vector3 by multiplying each component of this one." + return Vector3( self.x * other, self.y * other, self.z * other ) + + def __rtruediv__(self, other): + "Get a new Vector3 by true dividing each component of this one." + return Vector3( operator.truediv( other , self.x ), operator.truediv( other, self.y ), operator.truediv( other, self.z ) ) + + def __sub__(self, other): + "Get the difference between the Vector3 and other one." + return Vector3( self.x - other.x, self.y - other.y, self.z - other.z ) + + def __truediv__(self, other): + "Get a new Vector3 by true dividing each component of this one." + return Vector3( operator.truediv( self.x, other ), operator.truediv( self.y, other ), operator.truediv( self.z, other ) ) + + def cross(self, other): + "Calculate the cross product of this vector with other one." + return Vector3( self.y * other.z - self.z * other.y, - self.x * other.z + self.z * other.x, self.x * other.y - self.y * other.x ) + + def distance(self, other): + "Get the Euclidean distance between this vector and other one." + return math.sqrt( self.distanceSquared(other) ) + + def distanceSquared(self, other): + "Get the square of the Euclidean distance between this vector and other one." + separationX = self.x - other.x + separationY = self.y - other.y + separationZ = self.z - other.z + return separationX * separationX + separationY * separationY + separationZ * separationZ + + def dot(self, other): + "Calculate the dot product of this vector with other one." + return self.x * other.x + self.y * other.y + self.z * other.z + + def dropAxis( self, which ): + """Get a complex by removing one axis of this one. + + Keyword arguments: + which -- the axis to drop (0=X, 1=Y, 2=Z)""" + if which == 0: + return complex( self.y, self.z ) + if which == 1: + return complex( self.x, self.z ) + if which == 2: + return complex( self.x, self.y ) + + def getNormalized(self, other): + "Get the normalized Vector3." + magnitude = abs(self) + if magnitude == 0.0: + return self.copy() + return self / magnitude + + def magnitudeSquared(self): + "Get the square of the magnitude of the Vector3." + return self.x * self.x + self.y * self.y + self.z * self.z + + def normalize(self): + "Scale each component of this Vector3 so that it has a magnitude of 1. If this Vector3 has a magnitude of 0, this method has no effect." + magnitude = abs(self) + if magnitude != 0.0: + self /= magnitude + + def reflect( self, normal ): + "Reflect the Vector3 across the normal, which is assumed to be normalized." + distance = 2 * ( self.x * normal.x + self.y * normal.y + self.z * normal.z ) + return Vector3( self.x - distance * normal.x, self.y - distance * normal.y, self.z - distance * normal.z ) + + def setToVec3(self, other): + "Set this Vector3 to be identical to other one." + self.x = other.x + self.y = other.y + self.z = other.z + + def setToXYZ( self, x, y, z ): + "Set the x, y, and z components of this Vector3." + self.x = x + self.y = y + self.z = z + +""" +class Vector3: + __slots__ = ['x', 'y', 'z'] + + def __init__(self, x, y, z): + self.x = x + self.y = y + self.z = z + + def __copy__(self): + return self.__class__(self.x, self.y, self.z) + + copy = __copy__ + + def __repr__(self): + return 'Vector3(%.2f, %.2f, %.2f)' % (self.x, + self.y, + self.z) + + def __eq__(self, other): + if isinstance(other, Vector3): + return self.x == other.x and \ + self.y == other.y and \ + self.z == other.z + else: + assert hasattr(other, '__len__') and len(other) == 3 + return self.x == other[0] and \ + self.y == other[1] and \ + self.z == other[2] + + def __ne__(self, other): + return not self.__eq__(other) + + def __nonzero__(self): + return self.x != 0 or self.y != 0 or self.z != 0 + + def __len__(self): + return 3 + + def __getitem__(self, key): + return (self.x, self.y, self.z)[key] + + def __setitem__(self, key, value): + l = [self.x, self.y, self.z] + l[key] = value + self.x, self.y, self.z = l + + def __iter__(self): + return iter((self.x, self.y, self.z)) + + def __getattr__(self, name): + try: + return tuple([(self.x, self.y, self.z)['xyz'.index(c)] \ + for c in name]) + except ValueError: + raise AttributeError, name + + if _enable_swizzle_set: + # This has detrimental performance on ordinary setattr as well + # if enabled + def __setattr__(self, name, value): + if len(name) == 1: + object.__setattr__(self, name, value) + else: + try: + l = [self.x, self.y, self.z] + for c, v in map(None, name, value): + l['xyz'.index(c)] = v + self.x, self.y, self.z = l + except ValueError: + raise AttributeError, name + + + def __add__(self, other): + if isinstance(other, Vector3): + # Vector + Vector -> Vector + # Vector + Point -> Point + # Point + Point -> Vector + if self.__class__ is other.__class__: + _class = Vector3 + else: + _class = Point3 + return _class(self.x + other.x, + self.y + other.y, + self.z + other.z) + else: + assert hasattr(other, '__len__') and len(other) == 3 + return Vector3(self.x + other[0], + self.y + other[1], + self.z + other[2]) + __radd__ = __add__ + + def __iadd__(self, other): + if isinstance(other, Vector3): + self.x += other.x + self.y += other.y + self.z += other.z + else: + self.x += other[0] + self.y += other[1] + self.z += other[2] + return self + + def __sub__(self, other): + if isinstance(other, Vector3): + # Vector - Vector -> Vector + # Vector - Point -> Point + # Point - Point -> Vector + if self.__class__ is other.__class__: + _class = Vector3 + else: + _class = Point3 + return Vector3(self.x - other.x, + self.y - other.y, + self.z - other.z) + else: + assert hasattr(other, '__len__') and len(other) == 3 + return Vector3(self.x - other[0], + self.y - other[1], + self.z - other[2]) + + + def __rsub__(self, other): + if isinstance(other, Vector3): + return Vector3(other.x - self.x, + other.y - self.y, + other.z - self.z) + else: + assert hasattr(other, '__len__') and len(other) == 3 + return Vector3(other.x - self[0], + other.y - self[1], + other.z - self[2]) + + def __mul__(self, other): + if isinstance(other, Vector3): + # TODO component-wise mul/div in-place and on Vector2; docs. + if self.__class__ is Point3 or other.__class__ is Point3: + _class = Point3 + else: + _class = Vector3 + return _class(self.x * other.x, + self.y * other.y, + self.z * other.z) + else: + assert type(other) in (int, long, float) + return Vector3(self.x * other, + self.y * other, + self.z * other) + + __rmul__ = __mul__ + + def __imul__(self, other): + assert type(other) in (int, long, float) + self.x *= other + self.y *= other + self.z *= other + return self + + def __div__(self, other): + assert type(other) in (int, long, float) + return Vector3(operator.div(self.x, other), + operator.div(self.y, other), + operator.div(self.z, other)) + + + def __rdiv__(self, other): + assert type(other) in (int, long, float) + return Vector3(operator.div(other, self.x), + operator.div(other, self.y), + operator.div(other, self.z)) + + def __floordiv__(self, other): + assert type(other) in (int, long, float) + return Vector3(operator.floordiv(self.x, other), + operator.floordiv(self.y, other), + operator.floordiv(self.z, other)) + + + def __rfloordiv__(self, other): + assert type(other) in (int, long, float) + return Vector3(operator.floordiv(other, self.x), + operator.floordiv(other, self.y), + operator.floordiv(other, self.z)) + + def __truediv__(self, other): + assert type(other) in (int, long, float) + return Vector3(operator.truediv(self.x, other), + operator.truediv(self.y, other), + operator.truediv(self.z, other)) + + + def __rtruediv__(self, other): + assert type(other) in (int, long, float) + return Vector3(operator.truediv(other, self.x), + operator.truediv(other, self.y), + operator.truediv(other, self.z)) + + def __neg__(self): + return Vector3(-self.x, + -self.y, + -self.z) + + __pos__ = __copy__ + + def __abs__(self): + return math.sqrt(self.x ** 2 + \ + self.y ** 2 + \ + self.z ** 2) + + magnitude = __abs__ + + def magnitude_squared(self): + return self.x ** 2 + \ + self.y ** 2 + \ + self.z ** 2 + + def normalize(self): + d = self.magnitude() + if d: + self.x /= d + self.y /= d + self.z /= d + return self + + def normalized(self): + d = self.magnitude() + if d: + return Vector3(self.x / d, + self.y / d, + self.z / d) + return self.copy() + + def dot(self, other): + assert isinstance(other, Vector3) + return self.x * other.x + \ + self.y * other.y + \ + self.z * other.z + + def cross(self, other): + assert isinstance(other, Vector3) + return Vector3(self.y * other.z - self.z * other.y, + -self.x * other.z + self.z * other.x, + self.x * other.y - self.y * other.x) + + def reflect(self, normal): + # assume normal is normalized + assert isinstance(normal, Vector3) + d = 2 * (self.x * normal.x + self.y * normal.y + self.z * normal.z) + return Vector3(self.x - d * normal.x, + self.y - d * normal.y, + self.z - d * normal.z) +""" diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/settings.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/settings.py new file mode 100644 index 0000000..07f6307 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/settings.py @@ -0,0 +1,2018 @@ +""" +Settings is a collection of utilities to display, read & write the settings and position widgets. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +import io +import math +import os +import shutil +import sys +import traceback +import webbrowser +try: + import Tkinter +except: + print('You do not have Tkinter, which is needed for the graphical interface, you will only be able to use the command line.') + print('Information on how to download Tkinter is at:\nwww.tcl.tk/software/tcltk/') + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = "$Date: 2008/23/04 $" +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +globalRepositoryDialogListTable = {} +globalProfileSaveListenerListTable = {} +globalCloseListTables = [ globalRepositoryDialogListTable, globalProfileSaveListenerListTable ] +globalSpreadsheetSeparator = '\t' +globalTemporaryOverrides = {} + + +def addAcceleratorCommand( acceleratorBinding, commandFunction, master, menu, text ): + "Add accelerator command." + acceleratorText = acceleratorBinding[1 : -1] + lastIndexOfMinus = acceleratorText.rfind('-') + if lastIndexOfMinus > - 1: + acceleratorText = acceleratorText[ : lastIndexOfMinus + 1 ] + acceleratorText[ lastIndexOfMinus + 1 : ].capitalize() + acceleratorText = acceleratorText.replace('KeyPress-', '') + acceleratorText = acceleratorText.replace('-', '+') + acceleratorText = acceleratorText.replace('Control', 'Ctrl') + acceleratorBinding = acceleratorBinding.replace('KeyPress', '') + menu.add_command( accelerator = acceleratorText, label = text, underline = 0, command = commandFunction ) + master.bind( acceleratorBinding, commandFunction ) + +def addEmptyRow( gridPosition ): + "Add an empty row." + gridPosition.increment() + Tkinter.Label( gridPosition.master ).grid( row = gridPosition.row, column = gridPosition.column ) + +def addListsToRepository(fileNameHelp, repository): + 'Add the value to the lists.' + addListsToRepositoryByFunction(fileNameHelp, None, repository) + +def addListsToRepositoryByFunction(fileNameHelp, getProfileDirectory, repository): + 'Add the value to the lists.' + repository.displayEntities = [] + repository.executeTitle = None + repository.fileNameHelp = fileNameHelp + repository.fileNameInput = None + repository.lowerName = fileNameHelp.split('.')[-2] + repository.baseName = repository.lowerName + '.csv' + repository.baseNameSynonym = None + repository.capitalizedName = getEachWordCapitalized( repository.lowerName ) + repository.getProfileDirectory = getProfileDirectory + repository.openLocalHelpPage = HelpPage().getOpenFromDocumentationSubName( repository.fileNameHelp ) + repository.openWikiManualHelpPage = None + repository.preferences = [] + repository.repositoryDialog = None + repository.saveListenerTable = {} + repository.title = repository.capitalizedName + ' Settings' + repository.menuEntities = [] + repository.saveCloseTitle = 'Save and Close' + repository.windowPosition = WindowPosition().getFromValue( repository, '0+0') + for setting in repository.preferences: + setting.repository = repository + +def addMenuEntitiesToMenu( menu, menuEntities ): + "Add the menu entities to the menu." + for menuEntity in menuEntities: + menuEntity.addToMenu( menu ) + +def addMenuEntitiesToMenuFrameable( menu, menuEntities ): + "Add the menu entities to the menu." + for menuEntity in menuEntities: + menuEntity.addToMenuFrameable( menu ) + +def addPluginsParentToMenu( directoryPath, menu, parentPath, pluginFileNames ): + "Add plugins and the parent to the menu." + ToolDialog().addPluginToMenu( menu, parentPath[ : parentPath.rfind('.') ] ) + menu.add_separator() + addPluginsToMenu( directoryPath, menu, pluginFileNames ) + +def addPluginsToMenu( directoryPath, menu, pluginFileNames ): + "Add plugins to the menu." + for pluginFileName in pluginFileNames: + ToolDialog().addPluginToMenu( menu, os.path.join( directoryPath, pluginFileName ) ) + +def cancelRepository(repository): + "Read the repository then set all the entities to the read repository values." + getReadRepository(repository) + for setting in repository.displayEntities: + if setting in repository.preferences: + setting.setStateToValue() + +def deleteDirectory( directory, subfolderName ): + "Delete the directory if it exists." + subDirectory = os.path.join( directory, subfolderName ) + if os.path.isdir( subDirectory ): + shutil.rmtree( subDirectory ) + +def deleteMenuItems( menu ): + "Delete the menu items." + try: + lastMenuIndex = menu.index( Tkinter.END ) + if lastMenuIndex != None: + menu.delete( 0, lastMenuIndex ) + except: + print('this should never happen, the lastMenuIndex in deleteMenuItems in settings could not be determined.') + +def getAlongWayHexadecimalColor( beginBrightness, colorWidth, difference, endColorTuple, wayLength ): + "Get a color along the way from begin brightness to the end color." + alongWay = 1.0 + if wayLength != 0.0: + alongWay = 0.4 + 0.6 * min( 1.0, abs( float( difference ) / float( wayLength ) ) ) + hexadecimalColor = '#' + oneMinusAlongWay = 1.0 - alongWay + for primaryIndex in xrange(3): + hexadecimalColor += getAlongWayHexadecimalPrimary( beginBrightness, oneMinusAlongWay, colorWidth, endColorTuple[ primaryIndex ], alongWay ) + return hexadecimalColor + +def getAlongWayHexadecimalPrimary( beginBrightness, beginRatio, colorWidth, endBrightness, endRatio ): + "Get a primary color along the way from grey to the end color." + brightness = beginRatio * float( beginBrightness ) + endRatio * float( endBrightness ) + return getWidthHex( int( round( brightness ) ), colorWidth ) + +def getAlterationFile(fileName): + "Get the file from the fileName or the lowercase fileName in the alterations directories." + settingsAlterationsDirectory = archive.getSettingsPath('alterations') + archive.makeDirectory(settingsAlterationsDirectory) + fileInSettingsAlterationsDirectory = getFileInGivenDirectory(settingsAlterationsDirectory, fileName) + if fileInSettingsAlterationsDirectory != '': + return fileInSettingsAlterationsDirectory + alterationsDirectory = archive.getSkeinforgePath('alterations') + return getFileInGivenDirectory(alterationsDirectory, fileName) + +def getAlterationFileLine(fileName): + "Get the alteration file line from the fileName." + lines = getAlterationLines(fileName) + if len(lines) == 0: + return [] + return getAlterationFileLineBlindly(fileName) + +def getAlterationFileLineBlindly(fileName): + "Get the alteration file line from the fileName." + return '() %s ()' % fileName + +def getAlterationFileLines(fileName): + 'Get the alteration file line and the text lines from the fileName in the alterations directories.' + lines = getAlterationLines(fileName) + if len(lines) == 0: + return [] + return [getAlterationFileLineBlindly(fileName)] + lines + +def getAlterationLines(fileName): + "Get the text lines from the fileName in the alterations directories." + return archive.getTextLines(getAlterationFile(fileName)) + +def getDisplayedDialogFromConstructor(repository): + "Display the repository dialog." + try: + getReadRepository(repository) + return RepositoryDialog( repository, Tkinter.Tk() ) + except: + print('this should never happen, getDisplayedDialogFromConstructor in settings could not open') + print(repository) + traceback.print_exc(file=sys.stdout) + return None + +def getDisplayedDialogFromPath(path): + "Display the repository dialog." + pluginModule = archive.getModuleWithPath(path) + if pluginModule == None: + return None + return getDisplayedDialogFromConstructor( pluginModule.getNewRepository() ) + +def getDisplayToolButtonsRepository( directoryPath, importantFileNames, names, repository ): + "Get the display tool buttons." + displayToolButtons = [] + for name in names: + displayToolButton = DisplayToolButton().getFromPath( name in importantFileNames, name, os.path.join( directoryPath, name ), repository ) + displayToolButtons.append( displayToolButton ) + return displayToolButtons + +def getEachWordCapitalized( name ): + "Get the capitalized name." + withSpaces = name.lower().replace('_', ' ') + words = withSpaces.split(' ') + capitalizedStrings = [] + for word in words: + capitalizedStrings.append( word.capitalize() ) + return ' '.join( capitalizedStrings ) + +def getFileInGivenDirectory( directory, fileName ): + "Get the file from the fileName or the lowercase fileName in the given directory." + directoryListing = os.listdir(directory) + lowerFileName = fileName.lower() + for directoryFile in directoryListing: + if directoryFile.lower() == lowerFileName: + return getFileTextGivenDirectoryFileName( directory, directoryFile ) + return '' + +def getFileTextGivenDirectoryFileName( directory, fileName ): + "Get the entire text of a file with the given file name in the given directory." + absoluteFilePath = os.path.join( directory, fileName ) + return archive.getFileText( absoluteFilePath ) + +def getFolders(directory): + "Get the folder list in a directory." + archive.makeDirectory(directory) + directoryListing = [] + try: + directoryListing = os.listdir(directory) + except OSError: + print('Skeinforge can not list the directory:') + print(directory) + print('so give it read/write permission for that directory.') + folders = [] + for fileName in directoryListing: + if os.path.isdir( os.path.join( directory, fileName ) ): + folders.append(fileName) + return folders + +def getGlobalRepositoryDialogValues(): + "Get the global repository dialog values." + global globalRepositoryDialogListTable + return euclidean.getListTableElements(globalRepositoryDialogListTable) + +def getPathInFabmetheusFromFileNameHelp( fileNameHelp ): + "Get the directory path from file name help." + fabmetheusPath = archive.getFabmetheusPath() + splitFileNameHelps = fileNameHelp.split('.') + splitFileNameDirectoryNames = splitFileNameHelps[ : - 1 ] + for splitFileNameDirectoryName in splitFileNameDirectoryNames: + fabmetheusPath = os.path.join( fabmetheusPath, splitFileNameDirectoryName ) + return fabmetheusPath + +def getProfileBaseName(repository): + "Get the profile base file name." + if repository.getProfileDirectory == None: + return repository.baseName + return os.path.join(repository.getProfileDirectory(), repository.baseName) + +def getProfileBaseNameSynonym(repository): + "Get the profile base file name synonym." + if repository.getProfileDirectory == None: + return repository.baseNameSynonym + return os.path.join(repository.getProfileDirectory(), repository.baseNameSynonym) + +def getProfilesDirectoryInAboveDirectory(subName=''): + "Get the profiles directory path in the above directory." + aboveProfilesDirectory = archive.getSkeinforgePath('profiles') + if subName == '': + return aboveProfilesDirectory + return os.path.join( aboveProfilesDirectory, subName ) + +def getRadioPluginsAddPluginFrame( directoryPath, importantFileNames, names, repository ): + "Get the radio plugins and add the plugin frame." + repository.pluginFrame = PluginFrame() + radioPlugins = [] + for name in names: + radioPlugin = RadioPlugin().getFromRadio( name in importantFileNames, repository.pluginFrame.latentStringVar, name, repository, name == importantFileNames[0] ) + radioPlugin.updateFunction = repository.pluginFrame.update + radioPlugins.append( radioPlugin ) + defaultRadioButton = getSelectedRadioPlugin( importantFileNames + [ radioPlugins[0].name ], radioPlugins ) + repository.pluginFrame.getFromPath( defaultRadioButton, directoryPath, repository ) + return radioPlugins + +def getReadRepository(repository): + "Read and return settings from a file." + text = archive.getFileText(archive.getProfilesPath(getProfileBaseName(repository)), False) + if text == '': + if repository.baseNameSynonym != None: + text = archive.getFileText(archive.getProfilesPath(getProfileBaseNameSynonym(repository)), False) + if text == '': + print('The default %s will be written in the .skeinforge folder in the home directory.' % repository.title.lower() ) + text = archive.getFileText(getProfilesDirectoryInAboveDirectory(getProfileBaseName(repository)), False) + if text != '': + readSettingsFromText(repository, text) + writeSettings(repository) + temporaryApplyOverrides(repository) + return repository + readSettingsFromText(repository, text) + temporaryApplyOverrides(repository) + return repository + +def getRepositoryText(repository): + "Get the text representation of the repository." + repositoryWriter = getRepositoryWriter(repository.title.lower()) + for setting in repository.preferences: + setting.writeToRepositoryWriter(repositoryWriter) + return repositoryWriter.getvalue() + +def getRepositoryWriter(title): + "Get the repository writer for the title." + repositoryWriter = io.BytesIO() + repositoryWriter.write('Format is tab separated %s.\n' % title) + repositoryWriter.write('_Name %sValue\n' % globalSpreadsheetSeparator) + return repositoryWriter + +def getSelectedPluginModuleFromPath(filePath, plugins): + "Get the selected plugin module." + for plugin in plugins: + if plugin.value: + return gcodec.getModuleFromPath(plugin.name, filePath) + return None + +def getSelectedPluginName( plugins ): + "Get the selected plugin name." + for plugin in plugins: + if plugin.value: + return plugin.name + return '' + +def getSelectedRadioPlugin( names, radioPlugins ): + "Get the selected radio button if it exists, None otherwise." + for radioPlugin in radioPlugins: + if radioPlugin.value: + return radioPlugin + for name in names: + for radioPlugin in radioPlugins: + if radioPlugin.name == name: + radioPlugin.value = True + return radioPlugin + print('this should never happen, no getSelectedRadioPlugin in settings') + print( names ) + return radioPlugin[0] + +def getShortestUniqueSettingName(settingName, settings): + "Get the shortest unique name in the settings." + for length in range(3, len(settingName)): + numberOfEquals = 0 + shortName = settingName[: length] + for setting in settings: + if setting.name[: length] == shortName: + numberOfEquals += 1 + if numberOfEquals < 2: + return shortName.lower() + return settingName.lower() + +def getSubfolderWithBasename( basename, directory ): + "Get the subfolder in the directory with the basename." + archive.makeDirectory(directory) + directoryListing = os.listdir(directory) + for fileName in directoryListing: + joinedFileName = os.path.join( directory, fileName ) + if os.path.isdir(joinedFileName): + if basename == fileName: + return joinedFileName + return None + +def getTitleFromName( title ): + "Get the title of this setting." + if title[-1] == ':': + title = title[ : - 1 ] + spaceBracketIndex = title.find(' (') + if spaceBracketIndex > - 1: + return title[ : spaceBracketIndex ] + return title + +def getUntilFirstBracket(text): + 'Get the text until the first bracket, if any.' + dotIndex = text.find('(') + if dotIndex < 0: + return text + return text[: dotIndex] + +def getWidthHex( number, width ): + "Get the first width hexadecimal digits." + return ('0000%s' % hex(number)[ 2 : ] )[ - width : ] + +def liftRepositoryDialogs( repositoryDialogs ): + "Lift the repository dialogs." + for repositoryDialog in repositoryDialogs: + repositoryDialog.root.withdraw() # the withdraw & deiconify trick is here because lift does not work properly on my linux computer + repositoryDialog.root.lift() # probably not necessary, here in case the withdraw & deiconify trick does not work on some other computer + repositoryDialog.root.deiconify() + repositoryDialog.root.lift() # probably not necessary, here in case the withdraw & deiconify trick does not work on some other computer + repositoryDialog.root.update_idletasks() + +def openSVGPage( fileName, svgViewer ): + "Open svg page with an svg program." + if svgViewer == '': + return + if svgViewer == 'webbrowser': + openWebPage(fileName) + return + filePath = '"' + os.path.normpath(fileName) + '"' # " to send in file name with spaces + shellCommand = svgViewer + ' ' + filePath + commandResult = os.system(shellCommand) + if commandResult != 0: + print('It may be that the system could not find the %s program.' % svgViewer ) + print('If so, try installing the %s program or look for another svg viewer, like Netscape which can be found at:' % svgViewer ) + print('http://www.netscape.org/') + print('') + +def openWebPage( webPagePath ): + "Open a web page in a browser." + if webPagePath.find('#') != - 1: # to get around # encode bug + redirectionText = '\n\n\n' + redirectionText += '\n\n' % webPagePath + webPagePath = archive.getDocumentationPath('redirect.html') + archive.writeFileText( webPagePath, redirectionText ) + webPagePath = '"%s"' % webPagePath # " to get around space in url bug + try: # " to get around using gnome-open or internet explorer for webbrowser default + webbrowserController = webbrowser.get('firefox') + except: + webbrowserController = webbrowser.get() + webbrowserName = webbrowserController.name + if webbrowserName == '': + try: + os.startfile( webPagePath )#this is available on some python environments, but not all + return + except: + pass + print('Skeinforge was not able to open the file in a web browser. To see the documentation, open the following file in a web browser:') + print( webPagePath ) + return + else: + os.system(webbrowserName + ' ' + webPagePath)#used this instead of webbrowser.open() to workaround webbrowser open() bug + +def printProgress(layerIndex, procedureName): + "Print layerIndex followed by a carriage return." + printProgressByString('%s layer count %s...' % (procedureName.capitalize(), layerIndex + 1)) + +def printProgressByNumber(layerIndex, numberOfLayers, procedureName): + "Print layerIndex and numberOfLayers followed by a carriage return." + printProgressByString('%s layer count %s of %s...' % (procedureName.capitalize(), layerIndex + 1, numberOfLayers)) + +def printProgressByString(progressString): + "Print progress string." + sys.stdout.write(progressString) + sys.stdout.write(chr(27) + '\r') + sys.stdout.flush() + +def quitWindow(root): + "Quit a window." + try: + root.destroy() + except: + pass + +def quitWindows( event=None ): + "Quit all windows." + global globalRepositoryDialogListTable + globalRepositoryDialogValues = euclidean.getListTableElements( globalRepositoryDialogListTable ) + for globalRepositoryDialogValue in globalRepositoryDialogValues: + quitWindow(globalRepositoryDialogValue.root) + +def readSettingsFromText(repository, text): + "Read settings from a text." + text = text.replace(('\nName %sValue\n' % globalSpreadsheetSeparator), ('\n_Name %sValue\n' % globalSpreadsheetSeparator)) + lines = archive.getTextLines(text) + shortDictionary = {} + for setting in repository.preferences: + shortDictionary[getShortestUniqueSettingName(setting.name, repository.preferences)] = setting + for lineIndex in range(len(lines)): + setRepositoryToLine(lineIndex, lines, shortDictionary) + +def saveAll(): + "Save all the dialogs." + for globalRepositoryDialogValue in getGlobalRepositoryDialogValues(): + globalRepositoryDialogValue.save() + +def saveRepository(repository): + "Set the entities to the dialog then write them." + for setting in repository.preferences: + setting.setToDisplay() + writeSettingsPrintMessage(repository) + for saveListener in repository.saveListenerTable.values(): + saveListener() + +def setButtonFontWeightString( button, isBold ): + "Set button font weight given isBold." + try: + weightString = 'normal' + if isBold: + weightString = 'bold' + splitFont = button['font'].split() + button['font'] = ( splitFont[0], splitFont[1], weightString ) + except: + pass + +def setEntryText( entry, value ): + "Set the entry text." + if entry == None: + return + entry.delete( 0, Tkinter.END ) + entry.insert( 0, str(value) ) + +def setIntegerValueToString( integerSetting, valueString ): + "Set the integer to the string." + dotIndex = valueString.find('.') + if dotIndex > - 1: + valueString = valueString[: dotIndex] + try: + integerSetting.value = int( valueString ) + return + except: + print('Warning, can not read integer ' + integerSetting.name + ' ' + valueString ) + print('Will try reading as a boolean, which might be a mistake.') + integerSetting.value = 0 + if valueString.lower() == 'true': + integerSetting.value = 1 + +def setRepositoryToLine(lineIndex, lines, shortDictionary): + "Set setting dictionary to a setting line." + line = lines[lineIndex] + splitLine = line.split(globalSpreadsheetSeparator) + if len(splitLine) < 2: + return + fileSettingName = splitLine[0] + shortDictionaryKeys = shortDictionary.keys() + + # NOT SOLVED!!!! Uncomment line below! + # shortDictionaryKeys.sort(key=len, reverse=True) # so that a short word like fill is not overidden by a longer word like fillet + + for shortDictionaryKey in shortDictionaryKeys: + if fileSettingName[: len(shortDictionaryKey)].lower() == shortDictionaryKey: + shortDictionary[shortDictionaryKey].setValueToSplitLine(lineIndex, lines, splitLine) + return + +def setSpinColor( setting ): + "Set the spin box color to the value, yellow if it is lower than the default and blue if it is higher." + if setting.entry == None: + return + if setting.backgroundColor == None: + setting.backgroundColor = setting.entry['background'] + if setting.backgroundColor[0] != '#': + setting.backgroundColor = '#ffffff' + setting.colorWidth = len( setting.backgroundColor ) / 3 + setting.grey = int( setting.backgroundColor[ 1 : 1 + setting.colorWidth ], 16 ) + setting.white = int('f' * setting.colorWidth, 16 ) + if abs( setting.value - setting.defaultValue ) <= 0.75 * setting.increment: + setting.entry['background'] = setting.backgroundColor + return + difference = setting.value - setting.defaultValue + if difference > 0.0: + wayLength = setting.to - setting.defaultValue + setting.entry['background'] = getAlongWayHexadecimalColor( setting.grey, setting.colorWidth, difference, ( 0, setting.white, setting.white ), wayLength ) + return + wayLength = setting.from_ - setting.defaultValue + setting.entry['background'] = getAlongWayHexadecimalColor( setting.grey, setting.colorWidth, difference, ( setting.white, setting.white, 0 ), wayLength ) + +def startMainLoopFromConstructor(repository): + "Display the repository dialog and start the main loop." + try: + import Tkinter + except: + return + displayedDialogFromConstructor = getDisplayedDialogFromConstructor(repository) + if displayedDialogFromConstructor == None: + print('Warning, displayedDialogFromConstructor in settings is none, so the window will not be displayed.') + else: + displayedDialogFromConstructor.root.mainloop() + +def startMainLoopFromWindow(window): + 'Display the tableau window and start the main loop.' + if window == None: + return + if window.root == None: + print('Warning, window.root in startMainLoopFromWindow in settings is none, so the window will not be displayed.') + return + window.root.mainloop() + +def temporaryAddPreferenceOverride(module, name, value): + global globalTemporaryOverrides + if not module in globalTemporaryOverrides: + globalTemporaryOverrides[module] = {} + globalTemporaryOverrides[module][name] = value + print('OVERRIDE %s %s %s' % (module,name,value)) + print(globalTemporaryOverrides[module]) + +def temporaryApplyOverrides(repository): + 'Apply any overrides that have been set at the command line.' + # The override dictionary is a mapping of repository names to + # key-value mappings. + global globalTemporaryOverrides + if repository.baseName in globalTemporaryOverrides: + settingTable = {} + for setting in repository.preferences: + settingTable[ setting.name ] = setting + for (name, value) in globalTemporaryOverrides[repository.baseName].items(): + if name in settingTable: + settingTable[name].setValueToString(value) + else: + print('Override not applied for: %s, %s' % (name,value)) + +def writeSettings(repository): + "Write the settings to a file." + profilesDirectoryPath = archive.getProfilesPath(getProfileBaseName(repository)) + archive.makeDirectory(os.path.dirname(profilesDirectoryPath)) + archive.writeFileText(profilesDirectoryPath, getRepositoryText(repository)) + for setting in repository.preferences: + setting.updateSaveListeners() + +def writeSettingsPrintMessage(repository): + "Set the settings to the dialog then write them." + writeSettings(repository) + print( repository.title.lower().capitalize() + ' have been saved.') + +def writeValueListToRepositoryWriter( repositoryWriter, setting ): + "Write tab separated name and list to the repository writer." + repositoryWriter.write( setting.name ) + for item in setting.value: + if item != '[]': + repositoryWriter.write(globalSpreadsheetSeparator) + repositoryWriter.write( item ) + repositoryWriter.write('\n') + + +class StringSetting: + "A class to display, read & write a string." + def __init__(self): + "Set the update function to none." + self.entry = None + self.updateFunction = None + + def __repr__(self): + "Get the string representation of this StringSetting." + return str(self.__dict__) + + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.label = Tkinter.Label( gridPosition.master, text = self.name ) + self.label.grid( row = gridPosition.row, column = 0, columnspan = 3, sticky = Tkinter.W ) + self.createEntry( gridPosition.master ) + self.setStateToValue() + self.entry.grid( row = gridPosition.row, column = 3, columnspan = 2, sticky = Tkinter.W ) + self.bindEntry() + LabelHelp( self.repository.fileNameHelp, gridPosition.master, self.name, self.label ) + + def addToMenu( self, repositoryMenu ): + "Do nothing because this should only be added to a frameable repository menu." + pass + + def addToMenuFrameable( self, repositoryMenu ): + "Add this to the frameable repository menu." + titleFromName = getTitleFromName( self.name ) + helpWindowMenu = Tkinter.Menu( repositoryMenu, tearoff = 0 ) + repositoryMenu.add_cascade( label = titleFromName, menu = helpWindowMenu, underline = 0 ) + if self.name in self.repository.frameList.value: + helpWindowMenu.add_command( label = 'Remove from Window', command = self.removeFromWindow ) + else: + helpWindowMenu.add_command( label = 'Add to Window', command = self.addToWindow ) + helpWindowMenu.add_separator() + helpWindowMenu.add_command( label = 'Help', command = HelpPage().getOpenFromDocumentationSubName( self.repository.fileNameHelp + '#' + titleFromName ) ) + + def addToWindow(self): + "Add this to the repository frame list." + self.repository.frameList.addToList( self.name ) + + def bindEntry(self): + "Bind the entry to the update function." + if self.updateFunction != None: + self.entry.bind('', self.updateFunction ) + + def createEntry( self, root ): + "Create the entry." + self.entry = Tkinter.Entry( root ) + + def getFromValue( self, name, repository, value ): + "Initialize." + return self.getFromValueOnlyAddToRepository( name, repository, value ) + + def getFromValueOnly( self, name, repository, value ): + "Initialize." + self.defaultValue = value + self.name = name + self.repository = repository + self.value = value + return self + + def getFromValueOnlyAddToRepository( self, name, repository, value ): + "Initialize." + repository.displayEntities.append(self) + repository.menuEntities.append(self) + repository.preferences.append(self) + return self.getFromValueOnly( name, repository, value ) + + def removeFromWindow(self): + "Remove this from the repository frame list." + self.repository.frameList.removeFromList( self.name ) + + def setStateToValue(self): + "Set the entry to the value." + setEntryText( self.entry, self.value ) + + def setToDisplay(self): + "Set the string to the entry field." + try: + valueString = self.entry.get() + self.setValueToString( valueString ) + except: + pass + + def setUpdateFunction( self, updateFunction ): + "Set the update function." + self.updateFunction = updateFunction + + def setValueToSplitLine( self, lineIndex, lines, splitLine ): + "Set the value to the second word of a split line." + self.setValueToString(splitLine[1]) + + def setValueToString( self, valueString ): + "Set the value to the value string." + self.value = valueString + + def updateSaveListeners(self): + "Update save listeners if any." + pass + + def writeToRepositoryWriter( self, repositoryWriter ): + "Write tab separated name and value to the repository writer." + repositoryWriter.write('%s%s%s\n' % ( self.name, globalSpreadsheetSeparator, self.value ) ) + + +class BooleanSetting( StringSetting ): + "A class to display, read & write a boolean." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.checkbutton = Tkinter.Checkbutton( gridPosition.master, command = self.toggleCheckbutton, text = self.name ) +#toggleCheckbutton is being used instead of a Tkinter IntVar because there is a weird bug where it doesn't work properly if this setting is not on the first window. + self.checkbutton.grid( row = gridPosition.row, columnspan = 5, sticky = Tkinter.W ) + self.setStateToValue() + LabelHelp( self.repository.fileNameHelp, gridPosition.master, self.name, self.checkbutton ) + + def addToMenu( self, repositoryMenu ): + "Add this to the repository menu." + self.activateToggleMenuCheckbutton = False +#activateToggleMenuCheckbutton is being used instead of setting command after because add_checkbutton does not return a checkbutton. + repositoryMenu.add_checkbutton( label = getTitleFromName( self.name ), command = self.toggleMenuCheckbutton ) + if self.value: + repositoryMenu.invoke( repositoryMenu.index( Tkinter.END ) ) + self.activateToggleMenuCheckbutton = True + + def addToMenuFrameable( self, repositoryMenu ): + "Add this to the frameable repository menu." + titleFromName = getTitleFromName( self.name ) + helpWindowMenu = Tkinter.Menu( repositoryMenu, tearoff = 0 ) + repositoryMenu.add_cascade( label = titleFromName, menu = helpWindowMenu, underline = 0 ) + self.addToMenu( helpWindowMenu ) + helpWindowMenu.add_separator() + helpWindowMenu.add_command( label = 'Help', command = HelpPage().getOpenFromDocumentationSubName( self.repository.fileNameHelp + '#' + titleFromName ) ) + + def setStateToValue(self): + "Set the checkbutton to the boolean." + try: + if self.value: + self.checkbutton.select() + else: + self.checkbutton.deselect() + except: + pass + + def setToDisplay(self): + "Do nothing because toggleCheckbutton is handling the value." + pass + + def setValueToString( self, valueString ): + "Set the boolean to the string." + self.value = ( valueString.lower() == 'true') + + def toggleCheckbutton(self): + "Workaround for Tkinter bug, toggle the value." + self.value = not self.value + self.setStateToValue() + if self.updateFunction != None: + self.updateFunction() + + def toggleMenuCheckbutton(self): + "Workaround for Tkinter bug, toggle the value." + if self.activateToggleMenuCheckbutton: + self.value = not self.value + if self.updateFunction != None: + self.updateFunction() + + +class CloseListener: + "A class to listen to link a window to the global repository dialog list table." + def __init__( self, window, closeFunction = None ): + "Add the window to the global repository dialog list table." + self.closeFunction = closeFunction + self.window = window + self.shouldWasClosedBeBound = True + global globalRepositoryDialogListTable + euclidean.addElementToListDictionaryIfNotThere( window, window, globalRepositoryDialogListTable ) + + def listenToWidget( self, widget ): + "Listen to the destroy message of the widget." + if self.shouldWasClosedBeBound: + self.shouldWasClosedBeBound = False + widget.bind('', self.wasClosed ) + + def wasClosed(self, event): + "The dialog was closed." + global globalCloseListTables + for globalCloseListTable in globalCloseListTables: + if self.window in globalCloseListTable: + del globalCloseListTable[ self.window ] + if self.closeFunction != None: + self.closeFunction() + + +class DisplayToolButton: + "A class to display the tool dialog button, in a two column wide table." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + self.displayButton = Tkinter.Button( gridPosition.master, activebackground = 'black', activeforeground = 'white', text = getEachWordCapitalized( self.name ), command = self.displayDialog ) + setButtonFontWeightString( self.displayButton, self.important ) + gridPosition.incrementGivenNumberOfColumns(2) + self.displayButton.grid( row = gridPosition.row, column = gridPosition.column, columnspan = 2 ) + + def displayDialog(self): + "Display function." + ToolDialog().getFromPath( self.path ).display() + + def getFromPath( self, important, name, path, repository ): + "Initialize." + self.important = important + self.name = name + self.path = path + self.repository = repository + repository.displayEntities.append(self) + return self + + +class FileHelpMenuBar: + def __init__( self, root ): + "Create a menu bar with a file and help menu." + self.underlineLetters = [] + self.menuBar = Tkinter.Menu( root ) + self.root = root + root.config( menu = self.menuBar ) + self.fileMenu = Tkinter.Menu( self.menuBar, tearoff = 0 ) + self.menuBar.add_cascade( label = "File", menu = self.fileMenu, underline = 0 ) + self.underlineLetters.append('f') + + def addMenuToMenuBar( self, labelText, menu ): + "Add a menu to the menu bar." + lowerLabelText = labelText.lower() + for underlineLetterIndex in xrange( len( lowerLabelText ) ): + underlineLetter = lowerLabelText[ underlineLetterIndex ] + if underlineLetter not in self.underlineLetters: + self.underlineLetters.append( underlineLetter ) + self.menuBar.add_cascade( label = labelText, menu = menu, underline = underlineLetterIndex ) + return + self.menuBar.add_cascade( label = labelText, menu = menu ) + + def addPluginToMenuBar( self, modulePath, repository, window ): + "Add a menu to the menu bar from a tool." + pluginModule = archive.getModuleWithPath( modulePath ) + if pluginModule == None: + print('this should never happen, pluginModule in addMenuToMenuBar in settings is None.') + return None + repositoryMenu = Tkinter.Menu( self.menuBar, tearoff = 0 ) + labelText = getEachWordCapitalized( os.path.basename( modulePath ) ) + self.addMenuToMenuBar( labelText, repositoryMenu ) + pluginModule.addToMenu( self.root, repositoryMenu, repository, window ) + + def completeMenu(self, closeFunction, repository, saveFunction, window): + "Complete the menu." + self.closeFunction = closeFunction + self.saveFunction = saveFunction + addAcceleratorCommand('', saveFunction, self.root, self.fileMenu, 'Save') + self.fileMenu.add_command(label = "Save and Close", command = self.saveClose) + addAcceleratorCommand('', closeFunction, self.root, self.fileMenu, 'Close') + self.fileMenu.add_separator() + addAcceleratorCommand('', quitWindows, self.root, self.fileMenu, 'Quit') + skeinforgePluginsPath = archive.getSkeinforgePath('skeinforge_plugins') + pluginFileNames = archive.getPluginFileNamesFromDirectoryPath(skeinforgePluginsPath) + for pluginFileName in pluginFileNames: + self.addPluginToMenuBar(os.path.join(skeinforgePluginsPath, pluginFileName), repository, window) + + def saveClose(self): + "Call the save function then the close function." + self.saveFunction() + self.closeFunction() + + +class FileNameInput( StringSetting ): + "A class to display, read & write a fileName." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + self.gridPosition = gridPosition + gridPosition.executables.append(self) + + def execute(self): + "Open the file picker." + self.wasCancelled = False + parent = self.gridPosition.master + try: + import tkFileDialog + summarized = archive.getSummarizedFileName(self.value) + initialDirectory = os.path.dirname( summarized ) + if len( initialDirectory ) > 0: + initialDirectory += os.sep + else: + initialDirectory = "." + fileName = tkFileDialog.askopenfilename( filetypes = self.getFileNameFirstTypes(), initialdir = initialDirectory, initialfile = os.path.basename( summarized ), parent = parent, title = self.name ) + self.setCancelledValue(fileName) + return + except: + print('Could not get the old directory in settings, so the file picker will be opened in the default directory.') + try: + fileName = tkFileDialog.askopenfilename( filetypes = self.getFileNameFirstTypes(), initialdir = '.', initialfile = '', parent = parent, title = self.name ) + self.setCancelledValue(fileName) + except: + print('Error in execute in FileName in settings, ' + self.name ) + + def getFileNameFirstTypes(self): + "Get the file types with the file type of the fileName moved to the front of the list." + allFiles = [ ('All', '*.*') ] + try: + basename = os.path.basename(self.value) + splitFile = basename.split('.') + allReadables = [] + if len( self.fileTypes ) > 1: + for fileType in self.fileTypes: + allReadable = ( ('All Readable', fileType[1] ) ) + allReadables.append( allReadable ) + if len( splitFile ) < 1: + return allReadables + allFiles + self.fileTypes + baseExtension = splitFile[-1] + for fileType in self.fileTypes: + fileExtension = fileType[1].split('.')[-1] + if fileExtension == baseExtension: + fileNameFirstTypes = self.fileTypes[:] + fileNameFirstTypes.remove( fileType ) + return [ fileType ] + allReadables + allFiles + fileNameFirstTypes + return allReadables + allFiles + self.fileTypes + except: + return allFiles + + def getFromFileName( self, fileTypes, name, repository, value ): + "Initialize." + self.getFromValueOnly( name, repository, value ) + self.fileTypes = fileTypes + self.wasCancelled = False + repository.displayEntities.append(self) + repository.preferences.append(self) + return self + + def setCancelledValue( self, fileName ): + "Set the value to the file name and wasCancelled true if a file was not picked." + if ( str(fileName) == '()' or str(fileName) == ''): + self.wasCancelled = True + else: + self.value = fileName + + def setToDisplay(self): + "Do nothing because the file dialog is handling the value." + pass + + +class FloatSetting( StringSetting ): + "A class to display, read & write a float." + def setValueToString( self, valueString ): + "Set the float to the string." + try: + self.value = float( valueString ) + except: + print('Oops, can not read float' + self.name + ' ' + valueString ) + + +class FloatSpin( FloatSetting ): + "A class to display, read & write an float in a spin box." + def addToMenuFrameable( self, repositoryMenu ): + "Add this to the frameable repository menu." + titleFromName = getTitleFromName( self.name ) + helpWindowMenu = Tkinter.Menu( repositoryMenu, tearoff = 0 ) + repositoryMenu.add_cascade( label = titleFromName, menu = helpWindowMenu, underline = 0 ) + if self.name in self.repository.frameList.value: + helpWindowMenu.add_command( label = 'Remove from Window', command = self.removeFromWindow ) + else: + helpWindowMenu.add_command( label = 'Add to Window', command = self.addToWindow ) + helpWindowMenu.add_separator() + changeString = ' by %s' % self.increment + helpWindowMenu.add_command( label = 'Increase' + changeString, command = self.increase ) + helpWindowMenu.add_command( label = 'Decrease' + changeString, command = self.decrease ) + helpWindowMenu.add_separator() + helpWindowMenu.add_command( label = 'Help', command = HelpPage().getOpenFromDocumentationSubName( self.repository.fileNameHelp + '#' + titleFromName ) ) + + def bindEntry(self): + "Bind the entry to the update function." + self.entry.bind('', self.entryUpdated ) + self.setColor() + + def createEntry( self, root ): + "Create the entry." + self.entry = Tkinter.Spinbox( root, command = self.setColorToDisplay, from_ = self.from_, increment = self.increment, to = self.to ) + + def decrease(self): + "Decrease the value then set the state and color to the value." + self.value -= self.increment + self.setStateUpdateColor() + + def entryUpdated(self, event=None): + "Create the entry." + self.setColorToDisplay() + if self.updateFunction != None: + self.updateFunction(event) + + def getFromValue(self, from_, name, repository, to, value): + "Initialize." + self.backgroundColor = None + self.from_ = from_ + self.minimumWidth = min(value - from_, to - value) + rank = euclidean.getRank(0.05 * (to - from_)) + self.increment = euclidean.getIncrementFromRank(rank) + self.to = to + return self.getFromValueOnlyAddToRepository(name, repository, value) + + def increase(self): + "Increase the value then set the state and color to the value." + self.value += self.increment + self.setStateUpdateColor() + + def setColor(self, event=None): + "Set the color to the value, yellow if it is lower than the default and blue if it is higher." + setSpinColor(self) + + def setColorToDisplay(self, event=None): + "Set the color to the value, yellow if it is lower than the default and blue if it is higher." + self.setToDisplay() + self.setColor() + + def setStateToValue(self): + "Set the entry to the value." + setEntryText( self.entry, self.value ) + self.setColor() + + def setStateUpdateColor(self): + "Set the state to the value, call the update function, then set the color." + self.setStateToValue() + if self.updateFunction != None: + self.updateFunction() + + +class FloatSpinNotOnMenu( FloatSpin ): + "A class to display, read & write an float in a spin box, which is not to be added to a menu." + def getFromValueOnlyAddToRepository( self, name, repository, value ): + "Initialize." + repository.displayEntities.append(self) + repository.preferences.append(self) + return self.getFromValueOnly( name, repository, value ) + + +class FloatSpinUpdate( FloatSpin ): + "A class to display, read, update & write an float in a spin box." + def createEntry( self, root ): + "Create the entry." + self.entry = Tkinter.Spinbox( root, command = self.entryUpdated, from_ = self.from_, increment = self.increment, to = self.to ) + + +class FrameList: + "A class to list the frames." + def addToList(self, word): + "Add the word to the sorted list." + self.value.append(word) + self.value.sort() + self.repository.window.redisplayWindowUpdate() + + def getFromValue( self, name, repository, value ): + "Initialize." + repository.preferences.append(self) + self.name = name + self.repository = repository + self.value = value + return self + + def removeFromList(self, word): + "Remove the word from the sorted list." + self.value.remove(word) + self.value.sort() + self.repository.window.redisplayWindowUpdate() + + def setToDisplay(self): + "Do nothing because frame list does not have a display." + pass + + def setValueToSplitLine( self, lineIndex, lines, splitLine ): + "Set the value to the second and later words of a split line." + self.value = splitLine[1 :] + + def updateSaveListeners(self): + "Update save listeners if any." + pass + + def writeToRepositoryWriter( self, repositoryWriter ): + "Write tab separated name and list to the repository writer." + writeValueListToRepositoryWriter( repositoryWriter, self ) + + +class GridHorizontal: + "A class to place elements horizontally on a grid." + def __init__( self, column, row ): + "Initialize the column and row." + self.column = column + self.columnStart = column + self.row = row + + def getCopy(self): + "Get a copy." + copy = GridHorizontal( self.column, self.row ) + copy.columnStart = self.columnStart + return copy + + def increment(self): + "Increment the position horizontally." + self.column += 1 + + +class GridVertical: + "A class to place elements vertically on a grid." + def __init__( self, column, row ): + "Initialize the column and row." + self.column = column + self.columnOffset = column + self.columnStart = column + self.row = row + self.rowStart = row + + def execute(self): + "The execute button was clicked." + for executable in self.executables: + executable.execute() + saveAll() + self.repository.execute() + + def getCopy(self): + "Get a copy." + copy = GridVertical( self.column, self.row ) + copy.columnOffset = self.columnOffset + copy.columnStart = self.columnStart + copy.rowStart = self.rowStart + return copy + + def increment(self): + "Increment the position vertically." + self.column = self.columnStart + self.columnOffset = self.columnStart + self.row += 1 + + def incrementGivenNumberOfColumns( self, numberOfColumns ): + "Increment the position vertically and offset it horizontally by the given number of columns." + self.column = self.columnOffset + if self.columnOffset == self.columnStart: + self.columnOffset = self.columnStart + 1 + self.row += 1 + return + if self.columnOffset < self.columnStart + numberOfColumns - 1: + self.columnOffset += 1 + return + self.columnOffset = self.columnStart + + def setExecutablesRepository( self, repository ): + "Set the executables to an empty list and set the repository." + self.executables = [] + self.repository = repository + + +class HelpPage: + "A class to open a help page." + def __init__(self): + "Initialize column." + self.column = 3 + + def addToDialog( self, gridPosition ): + "Add this to the dialog." + capitalizedName = getEachWordCapitalized( self.name ) + self.displayButton = Tkinter.Button( gridPosition.master, activebackground = 'black', activeforeground = 'white', command = self.openPage, text = capitalizedName ) + if len( capitalizedName ) < 12: + self.displayButton['width'] = 10 + self.displayButton.grid( row = gridPosition.row, column = self.column, columnspan = 2 ) + + def addToMenu( self, repositoryMenu ): + "Add this to the repository menu." + repositoryMenu.add_command( label = getTitleFromName( self.name ), command = self.openPage ) + + def addToMenuFrameable( self, repositoryMenu ): + "Add this to the frameable repository menu." + self.addToMenu( repositoryMenu ) + + def getFromNameAfterHTTP( self, afterHTTP, name, repository ): + "Initialize." + self.setToNameRepository( name, repository ) + self.hypertextAddress = 'http://' + afterHTTP + return self + + def getFromNameAfterWWW( self, afterWWW, name, repository ): + "Initialize." + self.setToNameRepository( name, repository ) + self.hypertextAddress = 'http://www.' + afterWWW + return self + + def getFromNameSubName( self, name, repository, subName=''): + "Initialize." + self.setToNameRepository( name, repository ) + self.hypertextAddress = archive.getDocumentationPath( subName ) + return self + + def getOpenFromAbsolute( self, hypertextAddress ): + "Get the open help page function from the hypertext address." + self.hypertextAddress = hypertextAddress + return self.openPage + + def getOpenFromAfterHTTP( self, afterHTTP ): + "Get the open help page function from the part of the address after the HTTP." + self.hypertextAddress = 'http://' + afterHTTP + return self.openPage + + def getOpenFromAfterWWW( self, afterWWW ): + "Get the open help page function from the afterWWW of the address after the www." + self.hypertextAddress = 'http://www.' + afterWWW + return self.openPage + + def getOpenFromDocumentationSubName( self, subName=''): + "Get the open help page function from the afterWWW of the address after the www." + self.hypertextAddress = archive.getDocumentationPath( subName ) + return self.openPage + + def openPage(self, event=None): + "Open the browser to the hypertext address." + openWebPage( self.hypertextAddress ) + + def setToNameRepository( self, name, repository ): + "Set to the name and repository." + self.name = name + self.repository = repository + repository.displayEntities.append(self) + repository.menuEntities.append(self) + + +class HelpPageRepository: + "A class to open a repository help page." + def __init__( self, repository ): + "Add this to the dialog." + self.repository = repository + + def openPage(self, event=None): + "Open the browser to the repository help page." + if self.repository.openWikiManualHelpPage == None: + self.repository.openLocalHelpPage() + return + from skeinforge_application.skeinforge_utilities import skeinforge_help + helpRepository = getReadRepository( skeinforge_help.HelpRepository() ) + if helpRepository.wikiManualPrimary.value: + self.repository.openWikiManualHelpPage() + return + self.repository.openLocalHelpPage() + + +class IntSetting( FloatSetting ): + "A class to display, read & write an int." + def setValueToString( self, valueString ): + "Set the integer to the string." + setIntegerValueToString( self, valueString ) + + +class IntSpin(FloatSpin): + "A class to display, read & write an int in a spin box." + def getFromValue(self, from_, name, repository, to, value): + "Initialize." + self.backgroundColor = None + self.from_ = from_ + rank = euclidean.getRank(0.05 * (to - from_)) + self.increment = max(1, int(euclidean.getIncrementFromRank(rank))) + self.minimumWidth = min(value - from_, to - value) + self.to = to + return self.getFromValueOnlyAddToRepository(name, repository, value) + + def getSingleIncrementFromValue( self, from_, name, repository, to, value ): + "Initialize." + self.backgroundColor = None + self.from_ = from_ + self.increment = 1 + self.minimumWidth = min(value - from_, to - value) + self.to = to + return self.getFromValueOnlyAddToRepository( name, repository, value ) + + def setValueToString( self, valueString ): + "Set the integer to the string." + setIntegerValueToString( self, valueString ) + + + +class IntSpinNotOnMenu( IntSpin ): + "A class to display, read & write an integer in a spin box, which is not to be added to a menu." + def getFromValueOnlyAddToRepository( self, name, repository, value ): + "Initialize." + repository.displayEntities.append(self) + repository.preferences.append(self) + return self.getFromValueOnly( name, repository, value ) + + +class IntSpinUpdate( IntSpin ): + "A class to display, read, update & write an int in a spin box." + def createEntry( self, root ): + "Create the entry." + self.entry = Tkinter.Spinbox( root, command = self.entryUpdated, from_ = self.from_, increment = self.increment, to = self.to ) + + +class LabelDisplay: + "A class to add a label." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.label = Tkinter.Label( gridPosition.master, text = self.name ) + self.label.grid( row = gridPosition.row, column = 0, columnspan = 3, sticky = Tkinter.W ) + LabelHelp( self.repository.fileNameHelp, gridPosition.master, self.name, self.label ) + + def getFromName( self, name, repository ): + "Initialize." + self.name = name + self.repository = repository + repository.displayEntities.append(self) + return self + + +class LabelHelp: + "A class to add help to a widget." + def __init__( self, fileNameHelp, master, name, widget ): + "Add menu to the widget." + if len( name ) < 1: + return + self.popupMenu = Tkinter.Menu( master, tearoff = 0 ) + titleFromName = getTitleFromName( name.replace('- ', '').replace(' -', '') ) + self.popupMenu.add_command( label = 'Help', command = HelpPage().getOpenFromDocumentationSubName( fileNameHelp + '#' + titleFromName ) ) + widget.bind('', self.unpostPopupMenu ) + widget.bind('', self.unpostPopupMenu ) + widget.bind('', self.displayPopupMenu ) + + def displayPopupMenu(self, event=None): + 'Display the popup menu when the button is right clicked.' + try: + self.popupMenu.tk_popup( event.x_root + 30, event.y_root, 0 ) + finally: + self.popupMenu.grab_release() + + def unpostPopupMenu(self, event=None): + 'Unpost the popup menu.' + self.popupMenu.unpost() + + +class LabelSeparator: + "A class to add a label and menu separator." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.label = Tkinter.Label( gridPosition.master, text='') + self.label.grid( row = gridPosition.row, column = 0, columnspan = 3, sticky = Tkinter.W ) + + def addToMenu( self, repositoryMenu ): + "Add this to the repository menu." + repositoryMenu.add_separator() + + def addToMenuFrameable( self, repositoryMenu ): + "Add this to the frameable repository menu." + self.addToMenu( repositoryMenu ) + + def getFromRepository( self, repository ): + "Initialize." + self.name = '' + self.repository = repository + repository.displayEntities.append(self) + repository.menuEntities.append(self) + return self + + +class LatentStringVar: + "A class to provide a StringVar when needed." + def __init__(self): + "Set the string var." + self.stringVar = None + + def getString(self): + "Get the string." + return self.getVar().get() + + def getVar(self): + "Get the string var." + if self.stringVar == None: + self.stringVar = Tkinter.StringVar() + return self.stringVar + + def setString(self, word): + "Set the string." + self.getVar().set(word) + + +class LayerCount: + 'A class to handle the layerIndex.' + def __init__(self): + 'Initialize.' + self.layerIndex = 0 + + def __repr__(self): + 'Get the string representation of this LayerCount.' + return str(self.layerIndex) + + def printProgressIncrement(self, procedureName): + 'Print progress then increment layerIndex.' + printProgress(self.layerIndex, procedureName) + self.layerIndex += 1 + + +class MenuButtonDisplay: + "A class to add a menu button." + def addRadiosToDialog( self, gridPosition ): + "Add the menu radios to the dialog." + for menuRadio in self.menuRadios: + menuRadio.addToDialog( gridPosition ) + + def addToMenu( self, repositoryMenu ): + "Add this to the repository menu." + if len( self.menuRadios ) < 1: + print('The MenuButtonDisplay in settings should have menu items.') + print( self.name ) + return + self.menu = Tkinter.Menu( repositoryMenu, tearoff = 0 ) + repositoryMenu.add_cascade( label = getTitleFromName( self.name ), menu = self.menu ) + self.setRadioVarToName( self.menuRadios[0].name ) + + def addToMenuFrameable( self, repositoryMenu ): + "Add this to the frameable repository menu." + titleFromName = getTitleFromName( self.name ) + self.addToMenu( repositoryMenu ) + self.menu.add_command( label = 'Help', command = HelpPage().getOpenFromDocumentationSubName( self.repository.fileNameHelp + '#' + titleFromName ) ) + self.menu.add_separator() + + def getFromName( self, name, repository ): + "Initialize." + self.menuRadios = [] + self.name = name + self.radioVar = None + self.repository = repository + repository.menuEntities.append(self) + return self + + def removeMenus(self): + "Remove all menus." + deleteMenuItems( self.menu ) + self.menuRadios = [] + + def setRadioVarToName(self, name): + "Get the menu button." + self.optionList = [name] + self.radioVar = Tkinter.StringVar() + self.radioVar.set( self.optionList[0] ) + + def setToNameAddToDialog( self, name, gridPosition ): + "Get the menu button." + if self.radioVar != None: + return + gridPosition.increment() + self.setRadioVarToName( name ) + self.label = Tkinter.Label( gridPosition.master, text = self.name ) + self.label.grid( row = gridPosition.row, column = 0, columnspan = 3, sticky = Tkinter.W ) + self.menuButton = Tkinter.OptionMenu( gridPosition.master, self.radioVar, self.optionList ) + self.menuButton.grid( row = gridPosition.row, column = 3, columnspan = 2, sticky = Tkinter.W ) + self.menuButton.menu = Tkinter.Menu( self.menuButton, tearoff = 0 ) + self.menu = self.menuButton.menu + self.menuButton['menu'] = self.menu + LabelHelp( self.repository.fileNameHelp, gridPosition.master, self.name, self.label ) + + +class MenuRadio( BooleanSetting ): + "A class to display, read & write a boolean with associated menu radio button." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + self.menuButtonDisplay.setToNameAddToDialog( self.name, gridPosition ) + self.addToSubmenu() + + def addToMenu( self, repositoryMenu ): + "Add this to the submenu set by MenuButtonDisplay, the repository menu is ignored" + self.addToSubmenu() + + def addToMenuFrameable( self, repositoryMenu ): + "Add this to the frameable repository menu." + self.addToMenu( repositoryMenu ) + + def addToSubmenu(self): + "Add this to the submenu." + self.activate = False + menu = self.menuButtonDisplay.menu + menu.add_radiobutton( label = self.name, command = self.clickRadio, value = self.name, variable = self.menuButtonDisplay.radioVar ) + self.menuLength = menu.index( Tkinter.END ) + if self.value: + self.menuButtonDisplay.radioVar.set( self.name ) + self.invoke() + self.activate = True + + def clickRadio(self): + "Workaround for Tkinter bug, invoke and set the value when clicked." + if not self.activate: + return + self.menuButtonDisplay.radioVar.set( self.name ) + if self.updateFunction != None: + self.updateFunction() + + def getFromMenuButtonDisplay( self, menuButtonDisplay, name, repository, value ): + "Initialize." + self.getFromValueOnlyAddToRepository( name, repository, value ) + self.menuButtonDisplay = menuButtonDisplay + self.menuButtonDisplay.menuRadios.append(self) + return self + + def invoke(self): + "Workaround for Tkinter bug, invoke to set the value when changed." + self.menuButtonDisplay.menu.invoke( self.menuLength ) + + def setStateToValue(self): + "Set the checkbutton to the boolean." + try: + if self.value: + self.invoke() + except: + pass + + def setToDisplay(self): + "Set the boolean to the checkbutton." + if self.menuButtonDisplay.radioVar != None: + self.value = ( self.menuButtonDisplay.radioVar.get() == self.name ) + + +class PluginFrame: + "A class to display the plugins in a frame." + def __init__(self): + "Initialize." + self.gridTable = {} + self.latentStringVar = LatentStringVar() + self.oldLatentString = '' + + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.gridPosition = gridPosition.getCopy() + self.gridPosition.master = gridPosition.master + self.createFrame( gridPosition ) + + def createFrame( self, gridPosition ): + "Create the frame." + gridVertical = GridVertical( 0, 0 ) + gridVertical.master = Tkinter.LabelFrame( gridPosition.master, borderwidth = 3, relief = 'raised') + gridVertical.master.grid( row = gridPosition.row, column = gridPosition.column, columnspan = 12, sticky = Tkinter.E + Tkinter.W + Tkinter.N + Tkinter.S ) + gridPosition.master.grid_rowconfigure( gridPosition.row, weight = 1 ) + gridPosition.master.grid_columnconfigure( gridPosition.column + 11, weight = 1 ) + if self.latentStringVar.getString() == '': + self.defaultRadioButton.setSelect() + self.gridTable[ self.latentStringVar.getString() ] = gridVertical + path = os.path.join( self.directoryPath, self.latentStringVar.getString() ) + pluginModule = archive.getModuleWithPath(path) + if pluginModule == None: + print('this should never happen, pluginModule in addToDialog in PluginFrame in settings is None') + print(path) + return + gridVertical.repository = getReadRepository( pluginModule.getNewRepository() ) + gridVertical.frameGridVertical = GridVertical( 0, 0 ) + gridVertical.frameGridVertical.setExecutablesRepository( gridVertical.repository ) + executeTitle = gridVertical.repository.executeTitle + if executeTitle != None: + executeButton = Tkinter.Button( gridVertical.master, activebackground = 'black', activeforeground = 'blue', text = executeTitle, command = gridVertical.frameGridVertical.execute ) + executeButton.grid( row = gridVertical.row, column = gridVertical.column, sticky = Tkinter.W ) + gridVertical.column += 1 + self.helpButton = Tkinter.Button( gridVertical.master, activebackground = 'black', activeforeground = 'white', text = "?", command = HelpPageRepository( gridVertical.repository ).openPage ) + self.helpButton.grid( row = gridVertical.row, column = gridVertical.column, sticky = Tkinter.W ) + addEmptyRow( gridVertical ) + gridVertical.increment() + from fabmetheus_utilities.hidden_scrollbar import HiddenScrollbar + gridVertical.xScrollbar = HiddenScrollbar( gridVertical.master, orient = Tkinter.HORIZONTAL ) + gridVertical.xScrollbar.grid( row = gridVertical.row + 1, column = gridVertical.column, columnspan = 11, sticky = Tkinter.E + Tkinter.W ) + gridVertical.yScrollbar = HiddenScrollbar( gridVertical.master ) + gridVertical.yScrollbar.grid( row = gridVertical.row, column = gridVertical.column + 12, sticky = Tkinter.N + Tkinter.S ) + canvasHeight = min( 1000, gridPosition.master.winfo_screenheight() - 540 ) - 6 - int( gridVertical.xScrollbar['width'] ) + canvasWidth = min( 650, gridPosition.master.winfo_screenwidth() - 100 ) - 6 - int( gridVertical.yScrollbar['width'] ) + gridVertical.canvas = Tkinter.Canvas( gridVertical.master, height = canvasHeight, highlightthickness = 0, width = canvasWidth ) + gridVertical.frameGridVertical.master = Tkinter.Frame( gridVertical.canvas ) + for setting in gridVertical.repository.displayEntities: + setting.addToDialog( gridVertical.frameGridVertical ) + addEmptyRow( gridVertical.frameGridVertical ) + gridVertical.frameGridVertical.master.update_idletasks() + gridVertical.xScrollbar.config( command = gridVertical.canvas.xview ) + gridVertical.canvas['xscrollcommand'] = gridVertical.xScrollbar.set + gridVertical.yScrollbar.config( command = gridVertical.canvas.yview ) + gridVertical.canvas['yscrollcommand'] = gridVertical.yScrollbar.set + gridVertical.canvas.create_window( 0, 0, anchor = Tkinter.NW, window = gridVertical.frameGridVertical.master ) + gridVertical.canvas['scrollregion'] = gridVertical.frameGridVertical.master.grid_bbox() + gridVertical.canvas.grid( row = gridVertical.row, column = gridVertical.column, columnspan = 11, sticky = Tkinter.E + Tkinter.W + Tkinter.N + Tkinter.S ) + gridVertical.master.grid_rowconfigure( gridVertical.row, weight = 1 ) + gridVertical.master.grid_columnconfigure( gridVertical.column + 11, weight = 1 ) + gridVertical.frameGridVertical.master.lift() + self.oldLatentString = self.latentStringVar.getString() + + def focusSetMaster( self, gridPosition ): + "Set the focus to the plugin master." + gridPosition.frameGridVertical.master.focus_set() + + def getFromPath( self, defaultRadioButton, directoryPath, repository ): + "Initialize." + self.defaultRadioButton = defaultRadioButton + self.directoryPath = directoryPath + self.name = 'PluginFrame' + self.repository = repository + repository.displayEntities.append(self) + repository.preferences.append(self) + return self + + def setStateToValue(self): + "Set the state of all the plugins to the value." + for gridTableValue in self.gridTable.values(): + cancelRepository( gridTableValue.repository ) + + def setToDisplay(self): + "Set the plugins to the display." + pass + + def update(self): + "Update the frame." + if len(self.gridTable) < 1: + return + if self.oldLatentString == self.latentStringVar.getString(): + return + self.oldLatentString = self.latentStringVar.getString() + self.repository.preferences.remove(self) + for setting in self.repository.preferences: + setting.setToDisplay() + writeSettingsPrintMessage(self.repository) + self.repository.preferences.append(self) + if self.latentStringVar.getString() in self.gridTable: + gridPosition = self.gridTable[self.latentStringVar.getString()] + gridPosition.master.lift() + self.focusSetMaster(gridPosition) + return + self.createFrame(self.gridPosition) + + def updateSaveListeners(self): + "Update save listeners if any." + gridTableKeys = self.gridTable.keys() + gridTableKeys.sort() + for gridTableKey in gridTableKeys: + saveRepository( self.gridTable[ gridTableKey ].repository ) + + def writeToRepositoryWriter( self, repositoryWriter ): + "Write tab separated name and value to the repository writer." + pass + + +class PluginGroupFrame( PluginFrame ): + "A class to display the plugin groups in a frame." + def createFrame( self, gridPosition ): + "Create the frame." + gridVertical = GridVertical( 0, 0 ) + gridVertical.master = Tkinter.LabelFrame( gridPosition.master, borderwidth = 3, relief = 'raised') + gridVertical.master.grid( row = gridPosition.row, column = gridPosition.column, columnspan = 11, sticky = Tkinter.E + Tkinter.W + Tkinter.N + Tkinter.S ) + gridPosition.master.grid_rowconfigure( gridPosition.row, weight = 1 ) + gridPosition.master.grid_columnconfigure( gridPosition.column + 10, weight = 1 ) + if self.latentStringVar.getString() == '': + self.defaultRadioButton.setSelect() + self.gridTable[ self.latentStringVar.getString() ] = gridVertical + path = os.path.join( self.directoryPath, self.latentStringVar.getString() ) + pluginModule = archive.getModuleWithPath(path) + if pluginModule == None: + print('this should never happen, pluginModule in addToDialog in PluginFrame in settings is None') + print(path) + return + gridVertical.repository = getReadRepository( pluginModule.getNewRepository() ) + gridVertical.setExecutablesRepository( gridVertical.repository ) + executeTitle = gridVertical.repository.executeTitle + if executeTitle != None: + executeButton = Tkinter.Button( gridVertical.master, activebackground = 'black', activeforeground = 'blue', text = executeTitle, command = gridVertical.execute ) + executeButton.grid( row = gridVertical.row, column = gridVertical.column, sticky = Tkinter.W ) + gridVertical.column += 1 + self.helpButton = Tkinter.Button( gridVertical.master, activebackground = 'black', activeforeground = 'white', text = "?", command = HelpPageRepository( gridVertical.repository ).openPage ) + self.helpButton.grid( row = gridVertical.row, column = gridVertical.column, sticky = Tkinter.W ) + addEmptyRow( gridVertical ) + gridVertical.increment() + for setting in gridVertical.repository.displayEntities: + setting.addToDialog( gridVertical ) + gridVertical.master.update_idletasks() + gridVertical.master.lift() + self.oldLatentString = self.latentStringVar.getString() + + def focusSetMaster( self, gridPosition ): + "Set the focus to the plugin master." + gridPosition.master.focus_set() + + +class Radio( BooleanSetting ): + "A class to display, read & write a boolean with associated radio button." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.createRadioButton( gridPosition ) + self.radiobutton.grid( row = gridPosition.row, column = 0, columnspan = 3, sticky = Tkinter.W ) + self.setStateToValue() + + def clickRadio(self): + "Workaround for Tkinter bug, set the value." + self.latentStringVar.setString( self.radiobutton['value'] ) + if self.updateFunction != None: + self.updateFunction() + + def createRadioButton( self, gridPosition ): + "Create the radio button." + self.radiobutton = Tkinter.Radiobutton( gridPosition.master, command = self.clickRadio, text = self.name, value = self.name, variable = self.latentStringVar.getVar() ) + LabelHelp( self.repository.fileNameHelp, gridPosition.master, self.name, self.radiobutton ) + + def getFromRadio( self, latentStringVar, name, repository, value ): + "Initialize." + self.getFromValueOnly( name, repository, value ) + self.latentStringVar = latentStringVar + repository.displayEntities.append(self) + repository.preferences.append(self) +#when addToMenu is added to this entity, the line below should be uncommented +# repository.menuEntities.append(self) + return self + + def setSelect(self): + "Set the int var and select the radio button." + oldLatentStringValue = self.latentStringVar.getString() + self.latentStringVar.setString( self.radiobutton['value'] ) + self.radiobutton.select() + if oldLatentStringValue == '': + return False + return oldLatentStringValue != self.latentStringVar.getString() + + def setStateToValue(self): + "Set the checkbutton to the boolean." + if self.value: + if self.setSelect(): + if self.updateFunction != None: + self.updateFunction() + + def setToDisplay(self): + "Set the boolean to the checkbutton." + self.value = ( self.latentStringVar.getString() == self.radiobutton['value'] ) + + +class RadioCapitalized( Radio ): + "A class to display, read & write a boolean with associated radio button." + def createRadioButton( self, gridPosition ): + "Create the radio button." + capitalizedName = getEachWordCapitalized( self.name ) + self.radiobutton = Tkinter.Radiobutton( gridPosition.master, command = self.clickRadio, text = capitalizedName, value = self.name, variable = self.latentStringVar.getVar() ) + + +class RadioCapitalizedButton( Radio ): + "A class to display, read & write a boolean with associated radio button." + def createRadioButton( self, gridPosition ): + "Create the radio button." + capitalizedName = getEachWordCapitalized( self.name ) + self.radiobutton = Tkinter.Radiobutton( gridPosition.master, command = self.clickRadio, text = capitalizedName, value = self.name, variable = self.latentStringVar.getVar() ) + self.displayButton = Tkinter.Button( gridPosition.master, activebackground = 'black', activeforeground = 'white', text = capitalizedName, command = self.displayDialog ) + self.displayButton.grid( row = gridPosition.row, column = 3, columnspan = 2 ) + + def displayDialog(self): + "Display function." + ToolDialog().getFromPath( self.path ).display() + self.setSelect() + + def getFromPath( self, latentStringVar, name, path, repository, value ): + "Initialize." + self.getFromRadio( latentStringVar, name, repository, value ) + self.path = path + return self + + +class RadioPlugin( RadioCapitalized ): + "A class to display, read & write a boolean with associated radio button." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + self.createRadioButton( gridPosition ) + self.radiobutton['activeforeground'] = 'magenta' + self.radiobutton['selectcolor'] = 'white' + self.radiobutton['borderwidth'] = 3 + self.radiobutton['indicatoron'] = 0 + setButtonFontWeightString( self.radiobutton, self.important ) + self.incrementGridPosition( gridPosition ) + self.setStateToValue() + + def getFromRadio( self, important, latentStringVar, name, repository, value ): + "Initialize." + self.important = important + return RadioCapitalized.getFromRadio( self, latentStringVar, name, repository, value ) + + def incrementGridPosition( self, gridPosition ): + "Increment the grid position." + gridPosition.incrementGivenNumberOfColumns( 10 ) + self.radiobutton.grid( row = gridPosition.row, column = gridPosition.column, sticky = Tkinter.W ) + + +class TextSetting( StringSetting ): + "A class to display, read & write a text." + def __init__(self): + "Set the update function to none." + self.tokenConversions = [ + TokenConversion(), + TokenConversion('carriageReturn', '\r'), + TokenConversion('doubleQuote', '"'), + TokenConversion('newline', '\n'), + TokenConversion('semicolon', ';'), + TokenConversion('singleQuote', "'" ), + TokenConversion('tab', '\t') ] + self.updateFunction = None + + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.label = Tkinter.Label( gridPosition.master, text = self.name ) + self.label.grid( row = gridPosition.row, column = 0, columnspan = 3, sticky = Tkinter.W ) + gridPosition.increment() + self.entry = Tkinter.Text( gridPosition.master ) + self.setStateToValue() + self.entry.grid( row = gridPosition.row, column = 0, columnspan = 5, sticky = Tkinter.W ) + LabelHelp( self.repository.fileNameHelp, gridPosition.master, self.name, self.label ) + + def getFromValue( self, name, repository, value ): + "Initialize." + self.getFromValueOnly( name, repository, value ) + repository.displayEntities.append(self) + repository.preferences.append(self) + return self + + def setStateToValue(self): + "Set the entry to the value." + try: + self.entry.delete( 1.0, Tkinter.END ) + self.entry.insert( Tkinter.INSERT, self.value ) + except: + pass + + def setToDisplay(self): + "Set the string to the entry field." + valueString = self.entry.get( 1.0, Tkinter.END ) + self.setValueToString( valueString ) + + def setValueToSplitLine( self, lineIndex, lines, splitLine ): + "Set the value to the second word of a split line." + replacedValue = splitLine[1] + for tokenConversion in reversed( self.tokenConversions ): + replacedValue = tokenConversion.getTokenizedString( replacedValue ) + self.setValueToString( replacedValue ) + + def writeToRepositoryWriter( self, repositoryWriter ): + "Write tab separated name and value to the repository writer." + replacedValue = self.value + for tokenConversion in self.tokenConversions: + replacedValue = tokenConversion.getNamedString( replacedValue ) + repositoryWriter.write('%s%s%s\n' % ( self.name, globalSpreadsheetSeparator, replacedValue ) ) + + +class TokenConversion: + "A class to convert tokens in a string." + def __init__( self, name = 'replaceToken', token = '___replaced___'): + "Set the name and token." + self.replacedName = '___replaced___' + name + self.token = token + + def getNamedString( self, text ): + "Get a string with the tokens changed to names." + return text.replace( self.token, self.replacedName ) + + def getTokenizedString( self, text ): + "Get a string with the names changed to tokens." + return text.replace( self.replacedName, self.token ) + + +class ToolDialog: + "A class to display the tool repository dialog." + def addPluginToMenu( self, menu, path ): + "Add the display command to the menu." + name = os.path.basename(path) + self.path = path + menu.add_command( label = getEachWordCapitalized( name ) + '...', command = self.display ) + + def display(self): + "Display the tool repository dialog." + global globalRepositoryDialogListTable + for repositoryDialog in globalRepositoryDialogListTable: + if getPathInFabmetheusFromFileNameHelp( repositoryDialog.repository.fileNameHelp ) == self.path: + liftRepositoryDialogs( globalRepositoryDialogListTable[ repositoryDialog ] ) + return + self.repositoryDialog = getDisplayedDialogFromPath( self.path ) + + def getFromPath( self, path ): + "Initialize and return display function." + self.path = path + return self + + +class WindowPosition( StringSetting ): + "A class to display, read & write a window position." + def addToDialog( self, gridPosition ): + "Set the root to later get the geometry." + self.root = gridPosition.master + self.setToDisplay() + + def getFromValue( self, repository, value ): + "Initialize." + self.getFromValueOnly('WindowPosition', repository, value ) + repository.displayEntities.append(self) + repository.preferences.append(self) + return self + + def setToDisplay(self): + "Set the string to the window position." + try: + geometryString = self.root.geometry() + except: + return + if geometryString == '1x1+0+0': + return + firstPlusIndexPlusOne = geometryString.find('+') + 1 + self.value = geometryString[ firstPlusIndexPlusOne : ] + + def setWindowPosition(self): + "Set the window position." + movedGeometryString = '%sx%s+%s' % ( self.root.winfo_reqwidth(), self.root.winfo_reqheight(), self.value ) + self.root.geometry( movedGeometryString ) + + +class RepositoryDialog: + def __init__( self, repository, root ): + "Add entities to the dialog." + self.isFirst = ( len( globalRepositoryDialogListTable.keys() ) == 0 ) + self.closeListener = CloseListener(self) + self.repository = repository + self.gridPosition = GridVertical( 0, - 1 ) + self.gridPosition.setExecutablesRepository(repository) + self.gridPosition.master = root + self.root = root + self.openDialogListeners = [] + repository.repositoryDialog = self + root.withdraw() + title = repository.title + if repository.fileNameInput != None: + title = os.path.basename( repository.fileNameInput.value ) + ' - ' + title + root.title( title ) + fileHelpMenuBar = FileHelpMenuBar( root ) + fileHelpMenuBar.completeMenu( self.close, repository, self.save, self ) + for setting in repository.displayEntities: + setting.addToDialog( self.gridPosition ) + if self.gridPosition.row < 20: + addEmptyRow( self.gridPosition ) + self.addButtons( repository, root ) + root.update_idletasks() + self.setWindowPositionDeiconify() + root.deiconify() + for openDialogListener in self.openDialogListeners: + openDialogListener.openDialog() + + def __repr__(self): + "Get the string representation of this RepositoryDialog." + return self.repository.title + + def addButtons( self, repository, root ): + "Add buttons to the dialog." + columnIndex = 0 + self.gridPosition.increment() + saveCommand = self.save + saveText = 'Save' + if self.isFirst: + saveCommand = saveAll + saveText = 'Save All' + if repository.executeTitle != None: + executeButton = Tkinter.Button( root, activebackground = 'black', activeforeground = 'blue', text = repository.executeTitle, command = self.gridPosition.execute ) + executeButton.grid( row = self.gridPosition.row, column = columnIndex, columnspan = 2, sticky = Tkinter.W ) + columnIndex += 2 + self.helpButton = Tkinter.Button( root, activebackground = 'black', activeforeground = 'white', text = "?", command = HelpPageRepository(self.repository).openPage ) + self.helpButton.grid( row = self.gridPosition.row, column = columnIndex, sticky = Tkinter.W ) + self.closeListener.listenToWidget( self.helpButton ) + columnIndex += 6 + cancelButton = Tkinter.Button( root, activebackground = 'black', activeforeground = 'orange', command = self.cancel, fg = 'orange', text = 'Cancel') + cancelButton.grid( row = self.gridPosition.row, column = columnIndex ) + columnIndex += 1 + self.saveButton = Tkinter.Button( root, activebackground = 'black', activeforeground = 'darkgreen', command = saveCommand, fg = 'darkgreen', text = saveText ) + self.saveButton.grid( row = self.gridPosition.row, column = columnIndex ) + + def cancel(self, event=None): + "Set all entities to their saved state." + cancelRepository(self.repository) + + def close(self, event=None): + "The dialog was closed." + try: + self.root.destroy() + except: + pass + + def save(self, event=None): + "Set the entities to the dialog then write them." + saveRepository(self.repository) + + def setWindowPositionDeiconify(self): + "Set the window position if that setting exists." + for setting in self.repository.preferences: + if setting.name == 'WindowPosition': + setting.setWindowPosition() + return diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/svg_reader.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/svg_reader.py new file mode 100644 index 0000000..481877a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/svg_reader.py @@ -0,0 +1,959 @@ +""" +Svg reader. + +""" + + +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 fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.xml_simple_reader import DocumentNode +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +import math +import os +import sys +import traceback + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Nophead \nArt of Illusion ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +globalNumberOfCornerPoints = 11 +globalNumberOfBezierPoints = globalNumberOfCornerPoints + globalNumberOfCornerPoints +globalNumberOfCirclePoints = 4 * globalNumberOfCornerPoints + + +def addFunctionsToDictionary( dictionary, functions, prefix ): + "Add functions to dictionary." + for function in functions: + dictionary[ function.__name__[ len( prefix ) : ] ] = function + +def getArcComplexes(begin, end, largeArcFlag, radius, sweepFlag, xAxisRotation): + 'Get the arc complexes, procedure at http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes' + if begin == end: + print('Warning, begin equals end in getArcComplexes in svgReader') + print(begin) + print(end) + return [] + if radius.imag < 0.0: + print('Warning, radius.imag is less than zero in getArcComplexes in svgReader') + print(radius) + radius = complex(radius.real, abs(radius.imag)) + if radius.real < 0.0: + print('Warning, radius.real is less than zero in getArcComplexes in svgReader') + print(radius) + radius = complex(abs(radius.real), radius.imag) + if radius.imag <= 0.0: + print('Warning, radius.imag is too small for getArcComplexes in svgReader') + print(radius) + return [end] + if radius.real <= 0.0: + print('Warning, radius.real is too small for getArcComplexes in svgReader') + print(radius) + return [end] + xAxisRotationComplex = euclidean.getWiddershinsUnitPolar(xAxisRotation) + reverseXAxisRotationComplex = complex(xAxisRotationComplex.real, -xAxisRotationComplex.imag) + beginRotated = begin * reverseXAxisRotationComplex + endRotated = end * reverseXAxisRotationComplex + beginTransformed = complex(beginRotated.real / radius.real, beginRotated.imag / radius.imag) + endTransformed = complex(endRotated.real / radius.real, endRotated.imag / radius.imag) + midpointTransformed = 0.5 * (beginTransformed + endTransformed) + midMinusBeginTransformed = midpointTransformed - beginTransformed + midMinusBeginTransformedLength = abs(midMinusBeginTransformed) + if midMinusBeginTransformedLength > 1.0: + print('Warning, midMinusBeginTransformedLength is too large for getArcComplexes in svgReader') + print(begin) + print(end) + print(beginTransformed) + print(endTransformed) + print(midpointTransformed) + print(midMinusBeginTransformed) + print('The ellipse will be scaled to fit.') + radius *= midMinusBeginTransformedLength + scale = 1.0 / midMinusBeginTransformedLength + beginTransformed *= scale + endTransformed *= scale + midpointTransformed *= scale + midMinusBeginTransformed *= scale + midMinusBeginTransformedLength = 1.0 + midWiddershinsTransformed = complex(-midMinusBeginTransformed.imag, midMinusBeginTransformed.real) + midWiddershinsLengthSquared = 1.0 - midMinusBeginTransformedLength * midMinusBeginTransformedLength + if midWiddershinsLengthSquared < 0.0: + midWiddershinsLengthSquared = 0.0 + midWiddershinsLength = math.sqrt(midWiddershinsLengthSquared) + midWiddershinsTransformed *= midWiddershinsLength / abs(midWiddershinsTransformed) + centerTransformed = midpointTransformed + if largeArcFlag == sweepFlag: + centerTransformed -= midWiddershinsTransformed + else: + centerTransformed += midWiddershinsTransformed + beginMinusCenterTransformed = beginTransformed - centerTransformed + beginMinusCenterTransformedLength = abs(beginMinusCenterTransformed) + if beginMinusCenterTransformedLength <= 0.0: + return end + beginAngle = math.atan2(beginMinusCenterTransformed.imag, beginMinusCenterTransformed.real) + endMinusCenterTransformed = endTransformed - centerTransformed + angleDifference = euclidean.getAngleDifferenceByComplex(endMinusCenterTransformed, beginMinusCenterTransformed) + if sweepFlag: + if angleDifference < 0.0: + angleDifference += 2.0 * math.pi + else: + if angleDifference > 0.0: + angleDifference -= 2.0 * math.pi + global globalSideAngle + sides = int(math.ceil(abs(angleDifference) / globalSideAngle)) + sideAngle = angleDifference / float(sides) + arcComplexes = [] + center = complex(centerTransformed.real * radius.real, centerTransformed.imag * radius.imag) * xAxisRotationComplex + for side in xrange(1, sides): + unitPolar = euclidean.getWiddershinsUnitPolar(beginAngle + float(side) * sideAngle) + circumferential = complex(unitPolar.real * radius.real, unitPolar.imag * radius.imag) * beginMinusCenterTransformedLength + point = center + circumferential * xAxisRotationComplex + arcComplexes.append(point) + arcComplexes.append(end) + return arcComplexes + +def getChainMatrixSVG(elementNode, matrixSVG): + "Get chain matrixSVG by svgElement." + matrixSVG = matrixSVG.getOtherTimesSelf(getMatrixSVG(elementNode).tricomplex) + if elementNode.parentNode != None: + matrixSVG = getChainMatrixSVG(elementNode.parentNode, matrixSVG) + return matrixSVG + +def getChainMatrixSVGIfNecessary(elementNode, yAxisPointingUpward): + "Get chain matrixSVG by svgElement and yAxisPointingUpward." + matrixSVG = MatrixSVG() + if yAxisPointingUpward: + return matrixSVG + return getChainMatrixSVG(elementNode, matrixSVG) + +def getCubicPoint( along, begin, controlPoints, end ): + 'Get the cubic point.' + segmentBegin = getQuadraticPoint( along, begin, controlPoints[0], controlPoints[1] ) + segmentEnd = getQuadraticPoint( along, controlPoints[0], controlPoints[1], end ) + return ( 1.0 - along ) * segmentBegin + along * segmentEnd + +def getCubicPoints( begin, controlPoints, end, numberOfBezierPoints=globalNumberOfBezierPoints): + 'Get the cubic points.' + bezierPortion = 1.0 / float(numberOfBezierPoints) + cubicPoints = [] + for bezierIndex in xrange( 1, numberOfBezierPoints + 1 ): + cubicPoints.append(getCubicPoint(bezierPortion * bezierIndex, begin, controlPoints, end)) + return cubicPoints + +def getFontReader(fontFamily): + "Get the font reader for the fontFamily." + fontLower = fontFamily.lower().replace(' ', '_') + global globalFontReaderDictionary + if fontLower in globalFontReaderDictionary: + return globalFontReaderDictionary[fontLower] + global globalFontFileNames + if globalFontFileNames == None: + globalFontFileNames = archive.getFileNamesByFilePaths(archive.getFilePathsByDirectory(getFontsDirectoryPath())) + if fontLower not in globalFontFileNames: + print('Warning, the %s font was not found in the fonts folder, so Gentium Basic Regular will be substituted.' % fontFamily) + fontLower = 'gentium_basic_regular' + fontReader = FontReader(fontLower) + globalFontReaderDictionary[fontLower] = fontReader + return fontReader + +def getFontsDirectoryPath(): + "Get the fonts directory path." + return archive.getFabmetheusUtilitiesPath('fonts') + +def getLabelString(dictionary): + "Get the label string for the dictionary." + for key in dictionary: + labelIndex = key.find('label') + if labelIndex >= 0: + return dictionary[key] + return '' + +def getMatrixSVG(elementNode): + "Get matrixSVG by svgElement." + matrixSVG = MatrixSVG() + if 'transform' not in elementNode.attributes: + return matrixSVG + transformWords = [] + for transformWord in elementNode.attributes['transform'].replace(')', '(').split('('): + transformWordStrip = transformWord.strip() + if transformWordStrip != '': # workaround for split(character) bug which leaves an extra empty element + transformWords.append(transformWordStrip) + global globalGetTricomplexDictionary + getTricomplexDictionaryKeys = globalGetTricomplexDictionary.keys() + for transformWordIndex, transformWord in enumerate(transformWords): + if transformWord in getTricomplexDictionaryKeys: + transformString = transformWords[transformWordIndex + 1].replace(',', ' ') + matrixSVG = matrixSVG.getSelfTimesOther(globalGetTricomplexDictionary[ transformWord ](transformString.split())) + return matrixSVG + +def getQuadraticPoint( along, begin, controlPoint, end ): + 'Get the quadratic point.' + oneMinusAlong = 1.0 - along + segmentBegin = oneMinusAlong * begin + along * controlPoint + segmentEnd = oneMinusAlong * controlPoint + along * end + return oneMinusAlong * segmentBegin + along * segmentEnd + +def getQuadraticPoints(begin, controlPoint, end, numberOfBezierPoints=globalNumberOfBezierPoints): + 'Get the quadratic points.' + bezierPortion = 1.0 / float(numberOfBezierPoints) + quadraticPoints = [] + for bezierIndex in xrange(1, numberOfBezierPoints + 1): + quadraticPoints.append(getQuadraticPoint(bezierPortion * bezierIndex, begin, controlPoint, end)) + return quadraticPoints + +def getRightStripAlphabetPercent(word): + "Get word with alphabet characters and the percent sign stripped from the right." + word = word.strip() + for characterIndex in xrange(len(word) - 1, -1, -1): + character = word[characterIndex] + if not character.isalpha() and not character == '%': + return float(word[: characterIndex + 1]) + return None + +def getRightStripMinusSplit(lineString): + "Get string with spaces after the minus sign stripped." + oldLineStringLength = -1 + while oldLineStringLength < len(lineString): + oldLineStringLength = len(lineString) + lineString = lineString.replace('- ', '-') + return lineString.split() + +def getStrokeRadius(elementNode): + "Get the stroke radius." + return 0.5 * getRightStripAlphabetPercent(getStyleValue('1.0', elementNode, 'stroke-width')) + +def getStyleValue(defaultValue, elementNode, key): + "Get the stroke value string." + if 'style' in elementNode.attributes: + line = elementNode.attributes['style'] + strokeIndex = line.find(key) + if strokeIndex > -1: + words = line[strokeIndex :].replace(':', ' ').replace(';', ' ').split() + if len(words) > 1: + return words[1] + if key in elementNode.attributes: + return elementNode.attributes[key] + if elementNode.parentNode == None: + return defaultValue + return getStyleValue(defaultValue, elementNode.parentNode, key) + +def getTextComplexLoops(fontFamily, fontSize, text, yAxisPointingUpward=True): + "Get text as complex loops." + textComplexLoops = [] + fontReader = getFontReader(fontFamily) + horizontalAdvanceX = 0.0 + for character in text: + glyph = fontReader.getGlyph(character, yAxisPointingUpward) + textComplexLoops += glyph.getSizedAdvancedLoops(fontSize, horizontalAdvanceX, yAxisPointingUpward) + horizontalAdvanceX += glyph.horizontalAdvanceX + return textComplexLoops + +def getTransformedFillOutline(elementNode, loop, yAxisPointingUpward): + "Get the loops if fill is on, otherwise get the outlines." + fillOutlineLoops = None + if getStyleValue('none', elementNode, 'fill').lower() == 'none': + fillOutlineLoops = intercircle.getAroundsFromLoop(loop, getStrokeRadius(elementNode)) + else: + fillOutlineLoops = [loop] + return getChainMatrixSVGIfNecessary(elementNode, yAxisPointingUpward).getTransformedPaths(fillOutlineLoops) + +def getTransformedOutlineByPath(elementNode, path, yAxisPointingUpward): + "Get the outline from the path." + aroundsFromPath = intercircle.getAroundsFromPath(path, getStrokeRadius(elementNode)) + return getChainMatrixSVGIfNecessary(elementNode, yAxisPointingUpward).getTransformedPaths(aroundsFromPath) + +def getTransformedOutlineByPaths(elementNode, paths, yAxisPointingUpward): + "Get the outline from the paths." + aroundsFromPaths = intercircle.getAroundsFromPaths(paths, getStrokeRadius(elementNode)) + return getChainMatrixSVGIfNecessary(elementNode, yAxisPointingUpward).getTransformedPaths(aroundsFromPaths) + +def getTricomplexmatrix(transformWords): + "Get matrixSVG by transformWords." + tricomplex = [euclidean.getComplexByWords(transformWords)] + tricomplex.append(euclidean.getComplexByWords(transformWords, 2)) + tricomplex.append(euclidean.getComplexByWords(transformWords, 4)) + return tricomplex + +def getTricomplexrotate(transformWords): + "Get matrixSVG by transformWords." + rotate = euclidean.getWiddershinsUnitPolar(math.radians(float(transformWords[0]))) + return [rotate, complex(-rotate.imag,rotate.real), complex()] + +def getTricomplexscale(transformWords): + "Get matrixSVG by transformWords." + scale = euclidean.getComplexByWords(transformWords) + return [complex(scale.real,0.0), complex(0.0,scale.imag), complex()] + +def getTricomplexskewX(transformWords): + "Get matrixSVG by transformWords." + skewX = math.tan(math.radians(float(transformWords[0]))) + return [complex(1.0, 0.0), complex(skewX, 1.0), complex()] + +def getTricomplexskewY(transformWords): + "Get matrixSVG by transformWords." + skewY = math.tan(math.radians(float(transformWords[0]))) + return [complex(1.0, skewY), complex(0.0, 1.0), complex()] + +def getTricomplexTimesColumn(firstTricomplex, otherColumn): + "Get this matrix multiplied by the otherColumn." + dotProductX = firstTricomplex[0].real * otherColumn.real + firstTricomplex[1].real * otherColumn.imag + dotProductY = firstTricomplex[0].imag * otherColumn.real + firstTricomplex[1].imag * otherColumn.imag + return complex(dotProductX, dotProductY) + +def getTricomplexTimesOther(firstTricomplex, otherTricomplex): + "Get the first tricomplex multiplied by the other tricomplex." + #A down, B right from http://en.wikipedia.org/wiki/Matrix_multiplication + tricomplexTimesOther = [getTricomplexTimesColumn(firstTricomplex, otherTricomplex[0])] + tricomplexTimesOther.append(getTricomplexTimesColumn(firstTricomplex, otherTricomplex[1])) + tricomplexTimesOther.append(getTricomplexTimesColumn(firstTricomplex, otherTricomplex[2]) + firstTricomplex[2]) + return tricomplexTimesOther + +def getTricomplextranslate(transformWords): + "Get matrixSVG by transformWords." + translate = euclidean.getComplexByWords(transformWords) + return [complex(1.0, 0.0), complex(0.0, 1.0), translate] + +def processSVGElementcircle( elementNode, svgReader ): + "Process elementNode by svgReader." + attributes = elementNode.attributes + center = euclidean.getComplexDefaultByDictionaryKeys( complex(), attributes, 'cx', 'cy') + radius = euclidean.getFloatDefaultByDictionary( 0.0, attributes, 'r') + if radius == 0.0: + print('Warning, in processSVGElementcircle in svgReader radius is zero in:') + print(attributes) + return + global globalNumberOfCirclePoints + global globalSideAngle + loop = [] + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + for side in xrange( globalNumberOfCirclePoints ): + unitPolar = euclidean.getWiddershinsUnitPolar( float(side) * globalSideAngle ) + loop.append( center + radius * unitPolar ) + rotatedLoopLayer.loops += getTransformedFillOutline(elementNode, loop, svgReader.yAxisPointingUpward) + +def processSVGElementellipse( elementNode, svgReader ): + "Process elementNode by svgReader." + attributes = elementNode.attributes + center = euclidean.getComplexDefaultByDictionaryKeys( complex(), attributes, 'cx', 'cy') + radius = euclidean.getComplexDefaultByDictionaryKeys( complex(), attributes, 'rx', 'ry') + if radius.real == 0.0 or radius.imag == 0.0: + print('Warning, in processSVGElementellipse in svgReader radius is zero in:') + print(attributes) + return + global globalNumberOfCirclePoints + global globalSideAngle + loop = [] + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + for side in xrange( globalNumberOfCirclePoints ): + unitPolar = euclidean.getWiddershinsUnitPolar( float(side) * globalSideAngle ) + loop.append( center + complex( unitPolar.real * radius.real, unitPolar.imag * radius.imag ) ) + rotatedLoopLayer.loops += getTransformedFillOutline(elementNode, loop, svgReader.yAxisPointingUpward) + +def processSVGElementg(elementNode, svgReader): + 'Process elementNode by svgReader.' + if 'id' not in elementNode.attributes: + return + idString = elementNode.attributes['id'] + if 'beginningOfControlSection' in elementNode.attributes: + if elementNode.attributes['beginningOfControlSection'].lower()[: 1] == 't': + svgReader.stopProcessing = True + return + idStringLower = idString.lower() + zIndex = idStringLower.find('z:') + if zIndex < 0: + idStringLower = getLabelString(elementNode.attributes) + zIndex = idStringLower.find('z:') + if zIndex < 0: + return + floatFromValue = euclidean.getFloatFromValue(idStringLower[zIndex + len('z:') :].strip()) + if floatFromValue != None: + svgReader.z = floatFromValue + svgReader.bridgeRotation = euclidean.getComplexDefaultByDictionary( None, elementNode.attributes, 'bridgeRotation') + +def processSVGElementline(elementNode, svgReader): + "Process elementNode by svgReader." + begin = euclidean.getComplexDefaultByDictionaryKeys(complex(), elementNode.attributes, 'x1', 'y1') + end = euclidean.getComplexDefaultByDictionaryKeys(complex(), elementNode.attributes, 'x2', 'y2') + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + rotatedLoopLayer.loops += getTransformedOutlineByPath(elementNode, [begin, end], svgReader.yAxisPointingUpward) + +def processSVGElementpath( elementNode, svgReader ): + "Process elementNode by svgReader." + if 'd' not in elementNode.attributes: + print('Warning, in processSVGElementpath in svgReader can not get a value for d in:') + print(elementNode.attributes) + return + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + PathReader(elementNode, rotatedLoopLayer.loops, svgReader.yAxisPointingUpward) + +def processSVGElementpolygon( elementNode, svgReader ): + "Process elementNode by svgReader." + if 'points' not in elementNode.attributes: + print('Warning, in processSVGElementpolygon in svgReader can not get a value for d in:') + print(elementNode.attributes) + return + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + words = getRightStripMinusSplit(elementNode.attributes['points'].replace(',', ' ')) + loop = [] + for wordIndex in xrange( 0, len(words), 2 ): + loop.append(euclidean.getComplexByWords(words[wordIndex :])) + rotatedLoopLayer.loops += getTransformedFillOutline(elementNode, loop, svgReader.yAxisPointingUpward) + +def processSVGElementpolyline(elementNode, svgReader): + "Process elementNode by svgReader." + if 'points' not in elementNode.attributes: + print('Warning, in processSVGElementpolyline in svgReader can not get a value for d in:') + print(elementNode.attributes) + return + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + words = getRightStripMinusSplit(elementNode.attributes['points'].replace(',', ' ')) + path = [] + for wordIndex in xrange(0, len(words), 2): + path.append(euclidean.getComplexByWords(words[wordIndex :])) + rotatedLoopLayer.loops += getTransformedOutlineByPath(elementNode, path, svgReader.yAxisPointingUpward) + +def processSVGElementrect( elementNode, svgReader ): + "Process elementNode by svgReader." + attributes = elementNode.attributes + height = euclidean.getFloatDefaultByDictionary( 0.0, attributes, 'height') + if height == 0.0: + print('Warning, in processSVGElementrect in svgReader height is zero in:') + print(attributes) + return + width = euclidean.getFloatDefaultByDictionary( 0.0, attributes, 'width') + if width == 0.0: + print('Warning, in processSVGElementrect in svgReader width is zero in:') + print(attributes) + return + center = euclidean.getComplexDefaultByDictionaryKeys(complex(), attributes, 'x', 'y') + inradius = 0.5 * complex( width, height ) + cornerRadius = euclidean.getComplexDefaultByDictionaryKeys( complex(), attributes, 'rx', 'ry') + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + if cornerRadius.real == 0.0 and cornerRadius.imag == 0.0: + inradiusMinusX = complex( - inradius.real, inradius.imag ) + loop = [center + inradius, center + inradiusMinusX, center - inradius, center - inradiusMinusX] + rotatedLoopLayer.loops += getTransformedFillOutline(elementNode, loop, svgReader.yAxisPointingUpward) + return + if cornerRadius.real == 0.0: + cornerRadius = complex( cornerRadius.imag, cornerRadius.imag ) + elif cornerRadius.imag == 0.0: + cornerRadius = complex( cornerRadius.real, cornerRadius.real ) + cornerRadius = complex( min( cornerRadius.real, inradius.real ), min( cornerRadius.imag, inradius.imag ) ) + ellipsePath = [ complex( cornerRadius.real, 0.0 ) ] + inradiusMinusCorner = inradius - cornerRadius + loop = [] + global globalNumberOfCornerPoints + global globalSideAngle + for side in xrange( 1, globalNumberOfCornerPoints ): + unitPolar = euclidean.getWiddershinsUnitPolar( float(side) * globalSideAngle ) + ellipsePath.append( complex( unitPolar.real * cornerRadius.real, unitPolar.imag * cornerRadius.imag ) ) + ellipsePath.append( complex( 0.0, cornerRadius.imag ) ) + cornerPoints = [] + for point in ellipsePath: + cornerPoints.append( point + inradiusMinusCorner ) + cornerPointsReversed = cornerPoints[: : -1] + for cornerPoint in cornerPoints: + loop.append( center + cornerPoint ) + for cornerPoint in cornerPointsReversed: + loop.append( center + complex( - cornerPoint.real, cornerPoint.imag ) ) + for cornerPoint in cornerPoints: + loop.append( center - cornerPoint ) + for cornerPoint in cornerPointsReversed: + loop.append( center + complex( cornerPoint.real, - cornerPoint.imag ) ) + loop = euclidean.getLoopWithoutCloseSequentialPoints( 0.0001 * abs(inradius), loop ) + rotatedLoopLayer.loops += getTransformedFillOutline(elementNode, loop, svgReader.yAxisPointingUpward) + +def processSVGElementtext(elementNode, svgReader): + "Process elementNode by svgReader." + if svgReader.yAxisPointingUpward: + return + fontFamily = getStyleValue('Gentium Basic Regular', elementNode, 'font-family') + fontSize = getRightStripAlphabetPercent(getStyleValue('12.0', elementNode, 'font-size')) + matrixSVG = getChainMatrixSVGIfNecessary(elementNode, svgReader.yAxisPointingUpward) + rotatedLoopLayer = svgReader.getRotatedLoopLayer() + translate = euclidean.getComplexDefaultByDictionaryKeys(complex(), elementNode.attributes, 'x', 'y') + for textComplexLoop in getTextComplexLoops(fontFamily, fontSize, elementNode.getTextContent(), svgReader.yAxisPointingUpward): + translatedLoop = [] + for textComplexPoint in textComplexLoop: + translatedLoop.append(textComplexPoint + translate ) + rotatedLoopLayer.loops.append(matrixSVG.getTransformedPath(translatedLoop)) + + +class FontReader: + "Class to read a font in the fonts folder." + def __init__(self, fontFamily): + "Initialize." + self.fontFamily = fontFamily + self.glyphDictionary = {} + self.glyphElementNodeDictionary = {} + self.missingGlyph = None + fileName = os.path.join(getFontsDirectoryPath(), fontFamily + '.svg') + documentElement = DocumentNode(fileName, archive.getFileText(fileName)).getDocumentElement() + self.fontElementNode = documentElement.getFirstChildByLocalName('defs').getFirstChildByLocalName('font') + self.fontFaceElementNode = self.fontElementNode.getFirstChildByLocalName('font-face') + self.unitsPerEM = float(self.fontFaceElementNode.attributes['units-per-em']) + glyphElementNodes = self.fontElementNode.getChildNodesByLocalName('glyph') + for glyphElementNode in glyphElementNodes: + self.glyphElementNodeDictionary[glyphElementNode.attributes['unicode']] = glyphElementNode + + def getGlyph(self, character, yAxisPointingUpward): + "Get the glyph for the character." + if character not in self.glyphElementNodeDictionary: + if self.missingGlyph == None: + missingGlyphElementNode = self.fontElementNode.getFirstChildByLocalName('missing-glyph') + self.missingGlyph = Glyph(missingGlyphElementNode, self.unitsPerEM, yAxisPointingUpward) + return self.missingGlyph + if character not in self.glyphDictionary: + self.glyphDictionary[character] = Glyph(self.glyphElementNodeDictionary[character], self.unitsPerEM, yAxisPointingUpward) + return self.glyphDictionary[character] + + +class Glyph: + "Class to handle a glyph." + def __init__(self, elementNode, unitsPerEM, yAxisPointingUpward): + "Initialize." + self.horizontalAdvanceX = float(elementNode.attributes['horiz-adv-x']) + self.loops = [] + self.unitsPerEM = unitsPerEM + elementNode.attributes['fill'] = '' + if 'd' not in elementNode.attributes: + return + PathReader(elementNode, self.loops, yAxisPointingUpward) + + def getSizedAdvancedLoops(self, fontSize, horizontalAdvanceX, yAxisPointingUpward=True): + "Get loops for font size, advanced horizontally." + multiplierX = fontSize / self.unitsPerEM + multiplierY = multiplierX + if not yAxisPointingUpward: + multiplierY = -multiplierY + sizedLoops = [] + for loop in self.loops: + sizedLoop = [] + sizedLoops.append(sizedLoop) + for point in loop: + sizedLoop.append( complex(multiplierX * (point.real + horizontalAdvanceX), multiplierY * point.imag)) + return sizedLoops + + +class MatrixSVG: + "Two by three svg matrix." + def __init__(self, tricomplex=None): + "Initialize." + self.tricomplex = tricomplex + + def __repr__(self): + "Get the string representation of this two by three svg matrix." + return str(self.tricomplex) + + def getOtherTimesSelf(self, otherTricomplex): + "Get the other matrix multiplied by this matrix." + if otherTricomplex == None: + return MatrixSVG(self.tricomplex) + if self.tricomplex == None: + return MatrixSVG(otherTricomplex) + return MatrixSVG(getTricomplexTimesOther(otherTricomplex, self.tricomplex)) + + def getSelfTimesOther(self, otherTricomplex): + "Get this matrix multiplied by the other matrix." + if otherTricomplex == None: + return MatrixSVG(self.tricomplex) + if self.tricomplex == None: + return MatrixSVG(otherTricomplex) + return MatrixSVG(getTricomplexTimesOther(self.tricomplex, otherTricomplex)) + + def getTransformedPath(self, path): + "Get transformed path." + if self.tricomplex == None: + return path + complexX = self.tricomplex[0] + complexY = self.tricomplex[1] + complexTranslation = self.tricomplex[2] + transformedPath = [] + for point in path: + x = complexX.real * point.real + complexY.real * point.imag + y = complexX.imag * point.real + complexY.imag * point.imag + transformedPath.append(complex(x, y) + complexTranslation) + return transformedPath + + def getTransformedPaths(self, paths): + "Get transformed paths." + if self.tricomplex == None: + return paths + transformedPaths = [] + for path in paths: + transformedPaths.append(self.getTransformedPath(path)) + return transformedPaths + + +class PathReader: + "Class to read svg path." + def __init__(self, elementNode, loops, yAxisPointingUpward): + "Add to path string to loops." + self.controlPoints = None + self.elementNode = elementNode + self.loops = loops + self.oldPoint = None + self.outlinePaths = [] + self.path = [] + self.yAxisPointingUpward = yAxisPointingUpward + pathString = elementNode.attributes['d'].replace(',', ' ') + global globalProcessPathWordDictionary + processPathWordDictionaryKeys = globalProcessPathWordDictionary.keys() + for processPathWordDictionaryKey in processPathWordDictionaryKeys: + pathString = pathString.replace( processPathWordDictionaryKey, ' %s ' % processPathWordDictionaryKey ) + self.words = getRightStripMinusSplit(pathString) + for self.wordIndex in xrange( len( self.words ) ): + word = self.words[ self.wordIndex ] + if word in processPathWordDictionaryKeys: + globalProcessPathWordDictionary[word](self) + if len(self.path) > 0: + self.outlinePaths.append(self.path) + self.loops += getTransformedOutlineByPaths(elementNode, self.outlinePaths, yAxisPointingUpward) + + def addPathArc( self, end ): + "Add an arc to the path." + begin = self.getOldPoint() + self.controlPoints = None + radius = self.getComplexByExtraIndex(1) + xAxisRotation = math.radians(float(self.words[self.wordIndex + 3])) + largeArcFlag = euclidean.getBooleanFromValue(self.words[ self.wordIndex + 4 ]) + sweepFlag = euclidean.getBooleanFromValue(self.words[ self.wordIndex + 5 ]) + self.path += getArcComplexes(begin, end, largeArcFlag, radius, sweepFlag, xAxisRotation) + self.wordIndex += 8 + + def addPathCubic( self, controlPoints, end ): + "Add a cubic curve to the path." + begin = self.getOldPoint() + self.controlPoints = controlPoints + self.path += getCubicPoints( begin, controlPoints, end ) + self.wordIndex += 7 + + def addPathCubicReflected( self, controlPoint, end ): + "Add a cubic curve to the path from a reflected control point." + begin = self.getOldPoint() + controlPointBegin = begin + if self.controlPoints != None: + if len(self.controlPoints) == 2: + controlPointBegin = begin + begin - self.controlPoints[-1] + self.controlPoints = [controlPointBegin, controlPoint] + self.path += getCubicPoints(begin, self.controlPoints, end) + self.wordIndex += 5 + + def addPathLine(self, lineFunction, point): + "Add a line to the path." + self.controlPoints = None + self.path.append(point) + self.wordIndex += 3 + self.addPathLineByFunction(lineFunction) + + def addPathLineAxis(self, point): + "Add an axis line to the path." + self.controlPoints = None + self.path.append(point) + self.wordIndex += 2 + + def addPathLineByFunction( self, lineFunction ): + "Add a line to the path by line function." + while 1: + if self.getFloatByExtraIndex() == None: + return + self.path.append(lineFunction()) + self.wordIndex += 2 + + def addPathMove( self, lineFunction, point ): + "Add an axis line to the path." + self.controlPoints = None + if len(self.path) > 0: + self.outlinePaths.append(self.path) + self.oldPoint = self.path[-1] + self.path = [point] + self.wordIndex += 3 + self.addPathLineByFunction(lineFunction) + + def addPathQuadratic( self, controlPoint, end ): + "Add a quadratic curve to the path." + begin = self.getOldPoint() + self.controlPoints = [controlPoint] + self.path += getQuadraticPoints(begin, controlPoint, end) + self.wordIndex += 5 + + def addPathQuadraticReflected( self, end ): + "Add a quadratic curve to the path from a reflected control point." + begin = self.getOldPoint() + controlPoint = begin + if self.controlPoints != None: + if len( self.controlPoints ) == 1: + controlPoint = begin + begin - self.controlPoints[-1] + self.controlPoints = [ controlPoint ] + self.path += getQuadraticPoints(begin, controlPoint, end) + self.wordIndex += 3 + + def getComplexByExtraIndex( self, extraIndex=0 ): + 'Get complex from the extraIndex.' + return euclidean.getComplexByWords(self.words, self.wordIndex + extraIndex) + + def getComplexRelative(self): + "Get relative complex." + return self.getComplexByExtraIndex() + self.getOldPoint() + + def getFloatByExtraIndex( self, extraIndex=0 ): + 'Get float from the extraIndex.' + totalIndex = self.wordIndex + extraIndex + if totalIndex >= len(self.words): + return None + word = self.words[totalIndex] + if word[: 1].isalpha(): + return None + return euclidean.getFloatFromValue(word) + + def getOldPoint(self): + 'Get the old point.' + if len(self.path) > 0: + return self.path[-1] + return self.oldPoint + + def processPathWordA(self): + 'Process path word A.' + self.addPathArc( self.getComplexByExtraIndex( 6 ) ) + + def processPathWorda(self): + 'Process path word a.' + self.addPathArc(self.getComplexByExtraIndex(6) + self.getOldPoint()) + + def processPathWordC(self): + 'Process path word C.' + end = self.getComplexByExtraIndex( 5 ) + self.addPathCubic( [ self.getComplexByExtraIndex( 1 ), self.getComplexByExtraIndex(3) ], end ) + + def processPathWordc(self): + 'Process path word C.' + begin = self.getOldPoint() + end = self.getComplexByExtraIndex( 5 ) + self.addPathCubic( [ self.getComplexByExtraIndex( 1 ) + begin, self.getComplexByExtraIndex(3) + begin ], end + begin ) + + def processPathWordH(self): + "Process path word H." + beginY = self.getOldPoint().imag + self.addPathLineAxis(complex(float(self.words[self.wordIndex + 1]), beginY)) + while 1: + floatByExtraIndex = self.getFloatByExtraIndex() + if floatByExtraIndex == None: + return + self.path.append(complex(floatByExtraIndex, beginY)) + self.wordIndex += 1 + + def processPathWordh(self): + "Process path word h." + begin = self.getOldPoint() + self.addPathLineAxis(complex(float(self.words[self.wordIndex + 1]) + begin.real, begin.imag)) + while 1: + floatByExtraIndex = self.getFloatByExtraIndex() + if floatByExtraIndex == None: + return + self.path.append(complex(floatByExtraIndex + self.getOldPoint().real, begin.imag)) + self.wordIndex += 1 + + def processPathWordL(self): + "Process path word L." + self.addPathLine(self.getComplexByExtraIndex, self.getComplexByExtraIndex( 1 )) + + def processPathWordl(self): + "Process path word l." + self.addPathLine(self.getComplexRelative, self.getComplexByExtraIndex(1) + self.getOldPoint()) + + def processPathWordM(self): + "Process path word M." + self.addPathMove(self.getComplexByExtraIndex, self.getComplexByExtraIndex(1)) + + def processPathWordm(self): + "Process path word m." + self.addPathMove(self.getComplexRelative, self.getComplexByExtraIndex(1) + self.getOldPoint()) + + def processPathWordQ(self): + 'Process path word Q.' + self.addPathQuadratic( self.getComplexByExtraIndex( 1 ), self.getComplexByExtraIndex(3) ) + + def processPathWordq(self): + 'Process path word q.' + begin = self.getOldPoint() + self.addPathQuadratic(self.getComplexByExtraIndex(1) + begin, self.getComplexByExtraIndex(3) + begin) + + def processPathWordS(self): + 'Process path word S.' + self.addPathCubicReflected( self.getComplexByExtraIndex( 1 ), self.getComplexByExtraIndex(3) ) + + def processPathWords(self): + 'Process path word s.' + begin = self.getOldPoint() + self.addPathCubicReflected(self.getComplexByExtraIndex(1) + begin, self.getComplexByExtraIndex(3) + begin) + + def processPathWordT(self): + 'Process path word T.' + self.addPathQuadraticReflected( self.getComplexByExtraIndex( 1 ) ) + + def processPathWordt(self): + 'Process path word t.' + self.addPathQuadraticReflected(self.getComplexByExtraIndex(1) + self.getOldPoint()) + + def processPathWordV(self): + "Process path word V." + beginX = self.getOldPoint().real + self.addPathLineAxis(complex(beginX, float(self.words[self.wordIndex + 1]))) + while 1: + floatByExtraIndex = self.getFloatByExtraIndex() + if floatByExtraIndex == None: + return + self.path.append(complex(beginX, floatByExtraIndex)) + self.wordIndex += 1 + + def processPathWordv(self): + "Process path word v." + begin = self.getOldPoint() + self.addPathLineAxis(complex(begin.real, float(self.words[self.wordIndex + 1]) + begin.imag)) + while 1: + floatByExtraIndex = self.getFloatByExtraIndex() + if floatByExtraIndex == None: + return + self.path.append(complex(begin.real, floatByExtraIndex + self.getOldPoint().imag)) + self.wordIndex += 1 + + def processPathWordZ(self): + "Process path word Z." + self.controlPoints = None + if len(self.path) < 1: + return + self.loops.append(getChainMatrixSVGIfNecessary(self.elementNode, self.yAxisPointingUpward).getTransformedPath(self.path)) + self.oldPoint = self.path[0] + self.path = [] + + def processPathWordz(self): + "Process path word z." + self.processPathWordZ() + + +class SVGReader: + "An svg carving." + def __init__(self): + "Add empty lists." + self.bridgeRotation = None + self.rotatedLoopLayers = [] + self.sliceDictionary = None + self.stopProcessing = False + self.z = 0.0 + + def flipDirectLayer(self, rotatedLoopLayer): + "Flip the y coordinate of the layer and direct the loops." + for loop in rotatedLoopLayer.loops: + for pointIndex, point in enumerate(loop): + loop[pointIndex] = complex(point.real, -point.imag) + triangle_mesh.sortLoopsInOrderOfArea(True, rotatedLoopLayer.loops) + for loopIndex, loop in enumerate(rotatedLoopLayer.loops): + isInsideLoops = euclidean.getIsInFilledRegion(rotatedLoopLayer.loops[: loopIndex], euclidean.getLeftPoint(loop)) + intercircle.directLoop((not isInsideLoops), loop) + + def getRotatedLoopLayer(self): + "Return the rotated loop layer." + if self.z != None: + rotatedLoopLayer = euclidean.RotatedLoopLayer( self.z ) + self.rotatedLoopLayers.append( rotatedLoopLayer ) + rotatedLoopLayer.rotation = self.bridgeRotation + self.z = None + return self.rotatedLoopLayers[-1] + + def parseSVG(self, fileName, svgText): + "Parse SVG text and store the layers." + self.fileName = fileName + xmlParser = DocumentNode(fileName, svgText) + self.documentElement = xmlParser.getDocumentElement() + if self.documentElement == None: + print('Warning, documentElement was None in parseSVG in SVGReader, so nothing will be done for:') + print(fileName) + return + self.parseSVGByElementNode(self.documentElement) + + def parseSVGByElementNode(self, elementNode): + "Parse SVG by elementNode." + self.sliceDictionary = svg_writer.getSliceDictionary(elementNode) + self.yAxisPointingUpward = euclidean.getBooleanFromDictionary(False, self.sliceDictionary, 'yAxisPointingUpward') + self.processElementNode(elementNode) + if not self.yAxisPointingUpward: + for rotatedLoopLayer in self.rotatedLoopLayers: + self.flipDirectLayer(rotatedLoopLayer) + + def processElementNode(self, elementNode): + 'Process the xml element.' + if self.stopProcessing: + return + lowerLocalName = elementNode.getNodeName().lower() + global globalProcessSVGElementDictionary + if lowerLocalName in globalProcessSVGElementDictionary: + try: + globalProcessSVGElementDictionary[lowerLocalName](elementNode, self) + except: + print('Warning, in processElementNode in svg_reader, could not process:') + print(elementNode) + traceback.print_exc(file=sys.stdout) + for childNode in elementNode.childNodes: + self.processElementNode(childNode) + + +globalFontFileNames = None +globalFontReaderDictionary = {} +globalGetTricomplexDictionary = {} +globalGetTricomplexFunctions = [ + getTricomplexmatrix, + getTricomplexrotate, + getTricomplexscale, + getTricomplexskewX, + getTricomplexskewY, + getTricomplextranslate ] +globalProcessPathWordFunctions = [ + PathReader.processPathWordA, + PathReader.processPathWorda, + PathReader.processPathWordC, + PathReader.processPathWordc, + PathReader.processPathWordH, + PathReader.processPathWordh, + PathReader.processPathWordL, + PathReader.processPathWordl, + PathReader.processPathWordM, + PathReader.processPathWordm, + PathReader.processPathWordQ, + PathReader.processPathWordq, + PathReader.processPathWordS, + PathReader.processPathWords, + PathReader.processPathWordT, + PathReader.processPathWordt, + PathReader.processPathWordV, + PathReader.processPathWordv, + PathReader.processPathWordZ, + PathReader.processPathWordz ] +globalProcessPathWordDictionary = {} +globalProcessSVGElementDictionary = {} +globalProcessSVGElementFunctions = [ + processSVGElementcircle, + processSVGElementellipse, + processSVGElementg, + processSVGElementline, + processSVGElementpath, + processSVGElementpolygon, + processSVGElementpolyline, + processSVGElementrect, + processSVGElementtext ] +globalSideAngle = 0.5 * math.pi / float( globalNumberOfCornerPoints ) + + +addFunctionsToDictionary( globalGetTricomplexDictionary, globalGetTricomplexFunctions, 'getTricomplex') +addFunctionsToDictionary( globalProcessPathWordDictionary, globalProcessPathWordFunctions, 'processPathWord') +addFunctionsToDictionary( globalProcessSVGElementDictionary, globalProcessSVGElementFunctions, 'processSVGElement') diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/svg_writer.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/svg_writer.py new file mode 100644 index 0000000..7701c53 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/svg_writer.py @@ -0,0 +1,283 @@ +""" +Svg_writer is a class and collection of utilities to read from and write to an svg file. + +Svg_writer uses the layer_template.svg file in the templates folder in the same folder as svg_writer, to output an svg file. + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities.xml_simple_reader import DocumentNode +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import xml_simple_reader +from fabmetheus_utilities import xml_simple_writer +import io +import math +import os + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +globalOriginalTextString = '' in lineStripped: + isComment = False + xml_simple_reader.CommentNode(self.svgElement, '%s%s-->\n' % (globalOriginalTextString, commentNodeOutput.getvalue())).appendSelfToParent() + + def addRotatedLoopLayersToOutput(self, rotatedLoopLayers): + 'Add rotated boundary layers to the output.' + for rotatedLoopLayerIndex, rotatedLoopLayer in enumerate(rotatedLoopLayers): + self.addRotatedLoopLayerToOutput(rotatedLoopLayerIndex, rotatedLoopLayer) + + def addRotatedLoopLayerToOutput(self, layerIndex, rotatedLoopLayer): + 'Add rotated boundary layer to the output.' + self.addLayerBegin(layerIndex, rotatedLoopLayer) + if rotatedLoopLayer.rotation != None: + self.graphicsCopy.attributes['bridgeRotation'] = str(rotatedLoopLayer.rotation) + if self.addLayerTemplateToSVG: + self.pathDictionary['transform'] = self.getTransformString() + else: + del self.pathDictionary['transform'] + self.pathDictionary['d'] = self.getSVGStringForLoops(rotatedLoopLayer.loops) + + def getReplacedSVGTemplate(self, fileName, procedureName, rotatedLoopLayers, elementNode=None): + 'Get the lines of text from the layer_template.svg file.' + self.extent = self.cornerMaximum - self.cornerMinimum + svgTemplateText = archive.getFileText(archive.getTemplatesPath('layer_template.svg')) + documentNode = DocumentNode(fileName, svgTemplateText) + self.svgElement = documentNode.getDocumentElement() + svgElementDictionary = self.svgElement.attributes + self.sliceDictionary = getSliceDictionary(self.svgElement) + self.controlBoxHeight = float(self.sliceDictionary['controlBoxHeight']) + self.controlBoxWidth = float(self.sliceDictionary['controlBoxWidth']) + self.margin = float(self.sliceDictionary['margin']) + self.marginTop = float(self.sliceDictionary['marginTop']) + self.textHeight = float(self.sliceDictionary['textHeight']) + self.unitScale = float(self.sliceDictionary['unitScale']) + svgMinWidth = float(self.sliceDictionary['svgMinWidth']) + self.controlBoxHeightMargin = self.controlBoxHeight + self.marginTop + if not self.addLayerTemplateToSVG: + self.svgElement.getElementNodeByID('layerTextTemplate').removeFromIDNameParent() + del self.svgElement.getElementNodeByID('sliceElementTemplate').attributes['transform'] + self.graphicsElementNode = self.svgElement.getElementNodeByID('sliceElementTemplate') + self.graphicsElementNode.attributes['id'] = 'z:' + self.addRotatedLoopLayersToOutput(rotatedLoopLayers) + self.setMetadataNoscriptElement('layerThickness', 'Layer Thickness: ', self.layerThickness) + self.setMetadataNoscriptElement('maxX', 'X: ', self.cornerMaximum.x) + self.setMetadataNoscriptElement('minX', 'X: ', self.cornerMinimum.x) + self.setMetadataNoscriptElement('maxY', 'Y: ', self.cornerMaximum.y) + self.setMetadataNoscriptElement('minY', 'Y: ', self.cornerMinimum.y) + self.setMetadataNoscriptElement('maxZ', 'Z: ', self.cornerMaximum.z) + self.setMetadataNoscriptElement('minZ', 'Z: ', self.cornerMinimum.z) + self.textHeight = float( self.sliceDictionary['textHeight'] ) + controlTop = len(rotatedLoopLayers) * (self.margin + self.extent.y * self.unitScale + self.textHeight) + self.marginTop + self.textHeight + self.svgElement.getFirstChildByLocalName('title').setTextContent(os.path.basename(fileName) + ' - Slice Layers') + svgElementDictionary['height'] = '%spx' % self.getRounded(max(controlTop, self.controlBoxHeightMargin)) + width = max(self.extent.x * self.unitScale, svgMinWidth) + svgElementDictionary['width'] = '%spx' % self.getRounded( width ) + self.sliceDictionary['decimalPlacesCarried'] = str( self.decimalPlacesCarried ) + if self.perimeterWidth != None: + self.sliceDictionary['perimeterWidth'] = self.getRounded( self.perimeterWidth ) + self.sliceDictionary['yAxisPointingUpward'] = 'true' + self.sliceDictionary['procedureName'] = procedureName + self.setDimensionTexts('dimX', 'X: ' + self.getRounded(self.extent.x)) + self.setDimensionTexts('dimY', 'Y: ' + self.getRounded(self.extent.y)) + self.setDimensionTexts('dimZ', 'Z: ' + self.getRounded(self.extent.z)) + self.setTexts('numberOfLayers', 'Number of Layers: %s' % len(rotatedLoopLayers)) + volume = 0.0 + for rotatedLoopLayer in rotatedLoopLayers: + volume += euclidean.getAreaLoops(rotatedLoopLayer.loops) + volume *= 0.001 + self.setTexts('volume', 'Volume: %s cm3' % self.getRounded(volume)) + if not self.addLayerTemplateToSVG: + self.svgElement.getFirstChildByLocalName('script').removeFromIDNameParent() + self.svgElement.getElementNodeByID('isoControlBox').removeFromIDNameParent() + self.svgElement.getElementNodeByID('layerControlBox').removeFromIDNameParent() + self.svgElement.getElementNodeByID('scrollControlBox').removeFromIDNameParent() + self.graphicsElementNode.removeFromIDNameParent() + self.addOriginalAsComment(elementNode) + return documentNode.__repr__() + + def getRounded(self, number): + 'Get number rounded to the number of carried decimal places as a string.' + return euclidean.getRoundedToPlacesString(self.decimalPlacesCarried, number) + + def getRoundedComplexString(self, point): + 'Get the rounded complex string.' + return self.getRounded( point.real ) + ' ' + self.getRounded( point.imag ) + + def getSVGStringForLoop( self, loop ): + 'Get the svg loop string.' + if len(loop) < 1: + return '' + return self.getSVGStringForPath(loop) + ' z' + + def getSVGStringForLoops( self, loops ): + 'Get the svg loops string.' + loopString = '' + if len(loops) > 0: + loopString += self.getSVGStringForLoop( loops[0] ) + for loop in loops[1 :]: + loopString += ' ' + self.getSVGStringForLoop(loop) + return loopString + + def getSVGStringForPath( self, path ): + 'Get the svg path string.' + svgLoopString = '' + for point in path: + stringBeginning = 'M ' + if len( svgLoopString ) > 0: + stringBeginning = ' L ' + svgLoopString += stringBeginning + self.getRoundedComplexString(point) + return svgLoopString + + def getTransformString(self): + 'Get the svg transform string.' + cornerMinimumXString = self.getRounded(-self.cornerMinimum.x) + cornerMinimumYString = self.getRounded(-self.cornerMinimum.y) + return 'scale(%s, %s) translate(%s, %s)' % (self.unitScale, - self.unitScale, cornerMinimumXString, cornerMinimumYString) + + def setDimensionTexts(self, key, valueString): + 'Set the texts to the valueString followed by mm.' + self.setTexts(key, valueString + ' mm') + + def setMetadataNoscriptElement(self, key, prefix, value): + 'Set the metadata value and the text.' + valueString = self.getRounded(value) + self.sliceDictionary[key] = valueString + self.setDimensionTexts(key, prefix + valueString) + + def setTexts(self, key, valueString): + 'Set the texts to the valueString.' + self.svgElement.getElementNodeByID(key + 'Iso').setTextContent(valueString) + self.svgElement.getElementNodeByID(key + 'Layer').setTextContent(valueString) + self.svgElement.getElementNodeByID(key + 'Scroll').setTextContent(valueString) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/templates/canvas_template.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/templates/canvas_template.svg new file mode 100644 index 0000000..7baf264 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/templates/canvas_template.svg @@ -0,0 +1,16 @@ + + + + + +replaceLineWithTitle + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/templates/layer_template.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/templates/layer_template.svg new file mode 100644 index 0000000..a70b532 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/templates/layer_template.svg @@ -0,0 +1,519 @@ + + + + + + + + + replaceWith_Title + + + + + + + Layer 1, z:0.1 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + + + + + + Max + + + + + + Dimension + + + + + + Statistics + + + + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + + + + + + Max + + + + + + Dimension + + + + + + Statistics + + + + + + + + + + Y + X + Scale + : 1 + < + > + + Min + + + + + + Max + + + + + + Dimension + + + + + + Statistics + + + + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/vector3.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/vector3.py new file mode 100644 index 0000000..893aa4d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/vector3.py @@ -0,0 +1,336 @@ +""" +Vector3 is a three dimensional vector class. + +Below are examples of Vector3 use. + +>>> from vector3 import Vector3 +>>> origin = Vector3() +>>> origin +0.0, 0.0, 0.0 +>>> pythagoras = Vector3( 3, 4, 0 ) +>>> pythagoras +3.0, 4.0, 0.0 +>>> pythagoras.magnitude() +5.0 +>>> pythagoras.magnitudeSquared() +25 +>>> triplePythagoras = pythagoras * 3.0 +>>> triplePythagoras +9.0, 12.0, 0.0 +>>> plane = pythagoras.dropAxis() +>>> plane +(3+4j) +""" + +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 fabmetheus_utilities import xml_simple_writer +import math +import operator + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Nophead \nArt of Illusion ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +class Vector3: + 'A three dimensional vector class.' + __slots__ = ['x', 'y', 'z'] + + def __init__(self, x=0.0, y=0.0, z=0.0): + self.x = x + self.y = y + self.z = z + + def __abs__(self): + 'Get the magnitude of the Vector3.' + return math.sqrt( self.x * self.x + self.y * self.y + self.z * self.z ) + + magnitude = __abs__ + + def __add__(self, other): + 'Get the sum of this Vector3 and other one.' + return Vector3( self.x + other.x, self.y + other.y, self.z + other.z ) + + def __copy__(self): + 'Get the copy of this Vector3.' + return Vector3( self.x, self.y, self.z ) + + __pos__ = __copy__ + + copy = __copy__ + + def __div__(self, other): + 'Get a new Vector3 by dividing each component of this one.' + return Vector3( self.x / other, self.y / other, self.z / other ) + + def __eq__(self, other): + 'Determine whether this vector is identical to other one.' + if other == None: + return False + if other.__class__ != self.__class__: + return False + return self.x == other.x and self.y == other.y and self.z == other.z + + def __floordiv__(self, other): + 'Get a new Vector3 by floor dividing each component of this one.' + return Vector3( self.x // other, self.y // other, self.z // other ) + + def __hash__(self): + 'Determine whether this vector is identical to other one.' + return self.__repr__().__hash__() + + def __iadd__(self, other): + 'Add other Vector3 to this one.' + self.x += other.x + self.y += other.y + self.z += other.z + return self + + def __idiv__(self, other): + 'Divide each component of this Vector3.' + self.x /= other + self.y /= other + self.z /= other + return self + + def __ifloordiv__(self, other): + 'Floor divide each component of this Vector3.' + self.x //= other + self.y //= other + self.z //= other + return self + + def __imul__(self, other): + 'Multiply each component of this Vector3.' + self.x *= other + self.y *= other + self.z *= other + return self + + def __isub__(self, other): + 'Subtract other Vector3 from this one.' + self.x -= other.x + self.y -= other.y + self.z -= other.z + return self + + def __itruediv__(self, other): + 'True divide each component of this Vector3.' + self.x = operator.truediv( self.x, other ) + self.y = operator.truediv( self.y, other ) + self.z = operator.truediv( self.z, other ) + return self + + def __mul__(self, other): + 'Get a new Vector3 by multiplying each component of this one.' + return Vector3( self.x * other, self.y * other, self.z * other ) + + def __ne__(self, other): + 'Determine whether this vector is not identical to other one.' + return not self.__eq__(other) + + def __neg__(self): + return Vector3( - self.x, - self.y, - self.z ) + + def __nonzero__(self): + return self.x != 0 or self.y != 0 or self.z != 0 + + def __rdiv__(self, other): + 'Get a new Vector3 by dividing each component of this one.' + return Vector3( other / self.x, other / self.y, other / self.z ) + + def __repr__(self): + 'Get the string representation of this Vector3.' + return '(%s, %s, %s)' % ( self.x, self.y, self.z ) + + def __rfloordiv__(self, other): + 'Get a new Vector3 by floor dividing each component of this one.' + return Vector3( other // self.x, other // self.y, other // self.z ) + + def __rmul__(self, other): + 'Get a new Vector3 by multiplying each component of this one.' + return Vector3( self.x * other, self.y * other, self.z * other ) + + def __rtruediv__(self, other): + 'Get a new Vector3 by true dividing each component of this one.' + return Vector3( operator.truediv( other , self.x ), operator.truediv( other, self.y ), operator.truediv( other, self.z ) ) + + def __sub__(self, other): + 'Get the difference between the Vector3 and other one.' + return Vector3( self.x - other.x, self.y - other.y, self.z - other.z ) + + def __truediv__(self, other): + 'Get a new Vector3 by true dividing each component of this one.' + return Vector3( operator.truediv( self.x, other ), operator.truediv( self.y, other ), operator.truediv( self.z, other ) ) + + def _getAccessibleAttribute(self, attributeName): + 'Get the accessible attribute.' + if attributeName in globalGetAccessibleAttributeSet: + return getattr(self, attributeName, None) + return None + + def _setAccessibleAttribute(self, attributeName, value): + 'Set the accessible attribute.' + if attributeName in globalSetAccessibleAttributeSet: + setattr(self, attributeName, value) + + def cross(self, other): + 'Calculate the cross product of this vector with other one.' + return Vector3(self.y * other.z - self.z * other.y, -self.x * other.z + self.z * other.x, self.x * other.y - self.y * other.x) + + def distance(self, other): + 'Get the Euclidean distance between this vector and other one.' + return math.sqrt( self.distanceSquared(other) ) + + def distanceSquared(self, other): + 'Get the square of the Euclidean distance between this vector and other one.' + separationX = self.x - other.x + separationY = self.y - other.y + separationZ = self.z - other.z + return separationX * separationX + separationY * separationY + separationZ * separationZ + + def dot(self, other): + 'Calculate the dot product of this vector with other one.' + return self.x * other.x + self.y * other.y + self.z * other.z + + def dropAxis( self, which = 2 ): + 'Get a complex by removing one axis of the vector3.' + if which == 0: + return complex( self.y, self.z ) + if which == 1: + return complex( self.x, self.z ) + if which == 2: + return complex( self.x, self.y ) + + def getFloatList(self): + 'Get the vector as a list of floats.' + return [ float( self.x ), float( self.y ), float( self.z ) ] + + def getIsDefault(self): + 'Determine if this is the zero vector.' + if self.x != 0.0: + return False + if self.y != 0.0: + return False + return self.z == 0.0 + + def getNormalized(self): + 'Get the normalized Vector3.' + magnitude = abs(self) + if magnitude == 0.0: + return self.copy() + return self / magnitude + + def magnitudeSquared(self): + 'Get the square of the magnitude of the Vector3.' + return self.x * self.x + self.y * self.y + self.z * self.z + + def maximize(self, other): + 'Maximize the Vector3.' + self.x =max(other.x, self.x) + self.y =max(other.y, self.y) + self.z =max(other.z, self.z) + + def minimize(self, other): + 'Minimize the Vector3.' + self.x =min(other.x, self.x) + self.y =min(other.y, self.y) + self.z =min(other.z, self.z) + + def normalize(self): + 'Scale each component of this Vector3 so that it has a magnitude of 1. If this Vector3 has a magnitude of 0, this method has no effect.' + magnitude = abs(self) + if magnitude != 0.0: + self /= magnitude + + def reflect( self, normal ): + 'Reflect the Vector3 across the normal, which is assumed to be normalized.' + distance = 2 * ( self.x * normal.x + self.y * normal.y + self.z * normal.z ) + return Vector3( self.x - distance * normal.x, self.y - distance * normal.y, self.z - distance * normal.z ) + + def setToVector3(self, other): + 'Set this Vector3 to be identical to other one.' + self.x = other.x + self.y = other.y + self.z = other.z + + def setToXYZ( self, x, y, z ): + 'Set the x, y, and z components of this Vector3.' + self.x = x + self.y = y + self.z = z + + +globalGetAccessibleAttributeSet = 'x y z'.split() +globalSetAccessibleAttributeSet = globalGetAccessibleAttributeSet + +""" +class Vector3: + __slots__ = ['x', 'y', 'z'] + + + copy = __copy__ + + def __eq__(self, other): + if isinstance(other, Vector3): + return self.x == other.x and \ + self.y == other.y and \ + self.z == other.z + else: + assert hasattr(other, '__len__') and len(other) == 3 + return self.x == other[0] and \ + self.y == other[1] and \ + self.z == other[2] + + def __getattr__(self, name): + try: + return tuple([(self.x, self.y, self.z)['xyz'.index(c)] \ + for c in name]) + except ValueError: + raise AttributeError, name + + def __getitem__(self, key): + return (self.x, self.y, self.z)[key] + + def __iter__(self): + return iter((self.x, self.y, self.z)) + + def __len__(self): + return 3 + + def __repr__(self): + return 'Vector3(%.2f, %.2f, %.2f)' % (self.x, + self.y, + self.z) + + if _enable_swizzle_set: + # This has detrimental performance on ordinary setattr as well + # if enabled + def __setattr__(self, name, value): + if len(name) == 1: + object.__setattr__(self, name, value) + else: + try: + l = [self.x, self.y, self.z] + for c, v in map(None, name, value): + l['xyz'.index(c)] = v + self.x, self.y, self.z = l + except ValueError: + raise AttributeError, name + + def __setitem__(self, key, value): + l = [self.x, self.y, self.z] + l[key] = value + self.x, self.y, self.z = l + +""" diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/vector3index.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/vector3index.py new file mode 100644 index 0000000..64adf75 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/vector3index.py @@ -0,0 +1,277 @@ +""" +Vector3 is a three dimensional vector class. + +Below are examples of Vector3 use. + +>>> from vector3 import Vector3 +>>> origin = Vector3() +>>> origin +0.0, 0.0, 0.0 +>>> pythagoras = Vector3( 3, 4, 0 ) +>>> pythagoras +3.0, 4.0, 0.0 +>>> pythagoras.magnitude() +5.0 +>>> pythagoras.magnitudeSquared() +25 +>>> triplePythagoras = pythagoras * 3.0 +>>> triplePythagoras +9.0, 12.0, 0.0 +>>> plane = pythagoras.dropAxis() +>>> plane +(3+4j) +""" + +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 fabmetheus_utilities import xml_simple_writer +import math +import operator + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Nophead \nArt of Illusion ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +class Vector3Index: + 'A three dimensional vector index class.' + __slots__ = ['index', 'x', 'y', 'z'] + + def __init__( self, index, x = 0.0, y = 0.0, z = 0.0 ): + self.index = index + self.x = x + self.y = y + self.z = z + + def __abs__(self): + 'Get the magnitude of the Vector3.' + return math.sqrt( self.x * self.x + self.y * self.y + self.z * self.z ) + + magnitude = __abs__ + + def __add__(self, other): + 'Get the sum of this Vector3 and other one.' + return Vector3Index( self.index, self.x + other.x, self.y + other.y, self.z + other.z ) + + def __copy__(self): + 'Get the copy of this Vector3.' + return Vector3Index( self.index, self.x, self.y, self.z ) + + __pos__ = __copy__ + + copy = __copy__ + + def __div__(self, other): + 'Get a new Vector3 by dividing each component of this one.' + return Vector3Index( self.index, self.x / other, self.y / other, self.z / other ) + + def __eq__(self, other): + 'Determine whether this vector is identical to other one.' + if other == None: + return False + if other.__class__ != self.__class__: + return False + return self.x == other.x and self.y == other.y and self.z == other.z + + def __floordiv__(self, other): + 'Get a new Vector3 by floor dividing each component of this one.' + return Vector3Index( self.index, self.x // other, self.y // other, self.z // other ) + + def __hash__(self): + 'Determine whether this vector is identical to other one.' + return self.__repr__().__hash__() + + def __iadd__(self, other): + 'Add other Vector3 to this one.' + self.x += other.x + self.y += other.y + self.z += other.z + return self + + def __idiv__(self, other): + 'Divide each component of this Vector3.' + self.x /= other + self.y /= other + self.z /= other + return self + + def __ifloordiv__(self, other): + 'Floor divide each component of this Vector3.' + self.x //= other + self.y //= other + self.z //= other + return self + + def __imul__(self, other): + 'Multiply each component of this Vector3.' + self.x *= other + self.y *= other + self.z *= other + return self + + def __isub__(self, other): + 'Subtract other Vector3 from this one.' + self.x -= other.x + self.y -= other.y + self.z -= other.z + return self + + def __itruediv__(self, other): + 'True divide each component of this Vector3.' + self.x = operator.truediv( self.x, other ) + self.y = operator.truediv( self.y, other ) + self.z = operator.truediv( self.z, other ) + return self + + def __mul__(self, other): + 'Get a new Vector3 by multiplying each component of this one.' + return Vector3Index( self.index, self.x * other, self.y * other, self.z * other ) + + def __ne__(self, other): + 'Determine whether this vector is not identical to other one.' + return not self.__eq__(other) + + def __neg__(self): + return Vector3Index( self.index, - self.x, - self.y, - self.z ) + + def __nonzero__(self): + return self.x != 0 or self.y != 0 or self.z != 0 + + def __rdiv__(self, other): + 'Get a new Vector3 by dividing each component of this one.' + return Vector3Index( self.index, other / self.x, other / self.y, other / self.z ) + + def __repr__(self): + 'Get the string representation of this Vector3 index.' + return '(%s, %s, %s, %s)' % (self.index, self.x, self.y, self.z) + + def __rfloordiv__(self, other): + 'Get a new Vector3 by floor dividing each component of this one.' + return Vector3Index( self.index, other // self.x, other // self.y, other // self.z ) + + def __rmul__(self, other): + 'Get a new Vector3 by multiplying each component of this one.' + return Vector3Index( self.index, self.x * other, self.y * other, self.z * other ) + + def __rtruediv__(self, other): + 'Get a new Vector3 by true dividing each component of this one.' + return Vector3Index( self.index, operator.truediv( other , self.x ), operator.truediv( other, self.y ), operator.truediv( other, self.z ) ) + + def __sub__(self, other): + 'Get the difference between the Vector3 and other one.' + return Vector3Index( self.index, self.x - other.x, self.y - other.y, self.z - other.z ) + + def __truediv__(self, other): + 'Get a new Vector3 by true dividing each component of this one.' + return Vector3Index( self.index, operator.truediv( self.x, other ), operator.truediv( self.y, other ), operator.truediv( self.z, other ) ) + + def _getAccessibleAttribute(self, attributeName): + 'Get the accessible attribute.' + global globalGetAccessibleAttributeSet + if attributeName in globalGetAccessibleAttributeSet: + return getattr(self, attributeName, None) + return None + + def _setAccessibleAttribute(self, attributeName, value): + 'Set the accessible attribute.' + if attributeName in globalSetAccessibleAttributeSet: + setattr(self, attributeName, value) + + def cross(self, other): + 'Calculate the cross product of this vector with other one.' + return Vector3Index( self.index, self.y * other.z - self.z * other.y, - self.x * other.z + self.z * other.x, self.x * other.y - self.y * other.x ) + + def distance(self, other): + 'Get the Euclidean distance between this vector and other one.' + return math.sqrt( self.distanceSquared(other) ) + + def distanceSquared(self, other): + 'Get the square of the Euclidean distance between this vector and other one.' + separationX = self.x - other.x + separationY = self.y - other.y + separationZ = self.z - other.z + return separationX * separationX + separationY * separationY + separationZ * separationZ + + def dot(self, other): + 'Calculate the dot product of this vector with other one.' + return self.x * other.x + self.y * other.y + self.z * other.z + + def dropAxis( self, which = 2 ): + 'Get a complex by removing one axis of the vector3.' + if which == 0: + return complex( self.y, self.z ) + if which == 1: + return complex( self.x, self.z ) + if which == 2: + return complex( self.x, self.y ) + + def getFloatList(self): + 'Get the vector as a list of floats.' + return [ float( self.x ), float( self.y ), float( self.z ) ] + + def getIsDefault(self): + 'Determine if this is the zero vector.' + if self.x != 0.0: + return False + if self.y != 0.0: + return False + return self.z == 0.0 + + def getNormalized(self): + 'Get the normalized Vector3.' + magnitude = abs(self) + if magnitude == 0.0: + return self.copy() + return self / magnitude + + def magnitudeSquared(self): + 'Get the square of the magnitude of the Vector3.' + return self.x * self.x + self.y * self.y + self.z * self.z + + def maximize(self, other): + 'Maximize the Vector3.' + self.x =max(other.x, self.x) + self.y =max(other.y, self.y) + self.z =max(other.z, self.z) + + def minimize(self, other): + 'Minimize the Vector3.' + self.x =min(other.x, self.x) + self.y =min(other.y, self.y) + self.z =min(other.z, self.z) + + def normalize(self): + 'Scale each component of this Vector3 so that it has a magnitude of 1. If this Vector3 has a magnitude of 0, this method has no effect.' + magnitude = abs(self) + if magnitude != 0.0: + self /= magnitude + + def reflect( self, normal ): + 'Reflect the Vector3 across the normal, which is assumed to be normalized.' + distance = 2 * ( self.x * normal.x + self.y * normal.y + self.z * normal.z ) + return Vector3Index( self.index, self.x - distance * normal.x, self.y - distance * normal.y, self.z - distance * normal.z ) + + def setToVector3(self, other): + 'Set this Vector3 to be identical to other one.' + self.x = other.x + self.y = other.y + self.z = other.z + + def setToXYZ( self, x, y, z ): + 'Set the x, y, and z components of this Vector3.' + self.x = x + self.y = y + self.z = z + + +globalGetAccessibleAttributeSet = 'x y z'.split() +globalSetAccessibleAttributeSet = globalGetAccessibleAttributeSet diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/version.txt b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/version.txt new file mode 100644 index 0000000..6bf466b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/version.txt @@ -0,0 +1 @@ +11.10.07 \ No newline at end of file diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/xml_simple_reader.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/xml_simple_reader.py new file mode 100644 index 0000000..2838ae4 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/xml_simple_reader.py @@ -0,0 +1,836 @@ +""" +The xml_simple_reader.py script is an xml parser that can parse a line separated xml text. + +This xml parser will read a line seperated xml text and produce a tree of the xml with a document element. Each element can have an attribute table, childNodes, a class name, parentNode, text and a link to the document element. + +This example gets an xml tree for the xml file boolean.xml. This example is run in a terminal in the folder which contains boolean.xml and xml_simple_reader.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. +>>> fileName = 'boolean.xml' +>>> file = open(fileName, 'r') +>>> xmlText = file.read() +>>> file.close() +>>> from xml_simple_reader import DocumentNode +>>> xmlParser = DocumentNode(fileName, xmlText) +>>> print( xmlParser ) + ?xml, {'version': '1.0'} + ArtOfIllusion, {'xmlns:bf': '//babelfiche/codec', 'version': '2.0', 'fileversion': '3'} + Scene, {'bf:id': 'theScene'} + materials, {'bf:elem-type': 'java.lang.Object', 'bf:list': 'collection', 'bf:id': '1', 'bf:type': 'java.util.Vector'} +.. +many more lines of the xml tree +.. + +""" + + +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 fabmetheus_utilities.geometry.geometry_utilities import evaluate +from fabmetheus_utilities.geometry.geometry_utilities import matrix +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import xml_simple_writer +import io + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Nophead \nArt of Illusion ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +globalGetAccessibleAttributeSet = set('getPaths getPreviousVertex getPreviousElementNode getVertexes parentNode'.split()) + + +def createAppendByText(parentNode, xmlText): + 'Create and append the child nodes from the xmlText.' + monad = OpenMonad(parentNode) + for character in xmlText: + monad = monad.getNextMonad(character) + +def createAppendByTextb(parentNode, xmlText): + 'Create and append the child nodes from the xmlText.' + monad = OpenMonad(parentNode) + for character in xmlText: + monad = monad.getNextMonad(character) + +def getDocumentNode(fileName): + 'Get the document from the file name.' + xmlText = getFileText('test.xml') + return DocumentNode(fileName, xmlText) + +def getFileText(fileName, printWarning=True, readMode='r'): + 'Get the entire text of a file.' + try: + file = open(fileName, readMode) + fileText = file.read() + file.close() + return fileText + except IOError: + if printWarning: + print('The file ' + fileName + ' does not exist.') + return '' + + +class CDATASectionMonad: + 'A monad to handle a CDATASection node.' + def __init__(self, input, parentNode): + 'Initialize.' + self.input = input + self.parentNode = parentNode + + def getNextMonad(self, character): + 'Get the next monad.' + self.input.write(character) + if character == '>': + inputString = self.input.getvalue() + if inputString.endswith(']]>'): + textContent = '<%s\n' % inputString + self.parentNode.childNodes.append(CDATASectionNode(self.parentNode, textContent)) + return OpenMonad(self.parentNode) + return self + + +class CDATASectionNode: + 'A CDATASection node.' + def __init__(self, parentNode, textContent=''): + 'Initialize.' + self.parentNode = parentNode + self.textContent = textContent + + def __repr__(self): + 'Get the string representation of this CDATASection node.' + return self.textContent + + def addToIdentifierDictionaries(self): + 'Add the element to the owner document identifier dictionaries.' + pass + + def addXML(self, depth, output): + 'Add xml for this CDATASection node.' + output.write(self.textContent) + + def appendSelfToParent(self): + 'Append self to the parentNode.' + self.parentNode.appendChild(self) + + def copyXMLChildNodes(self, idSuffix, parentNode): + 'Copy the xml childNodes.' + pass + + def getAttributes(self): + 'Get the attributes.' + return {} + + def getChildNodes(self): + 'Get the empty set.' + return [] + + def getCopy(self, idSuffix, parentNode): + 'Copy the xml element, set its dictionary and add it to the parentNode.' + copy = self.getCopyShallow() + copy.parentNode = parentNode + copy.appendSelfToParent() + return copy + + def getCopyShallow(self, attributes=None): + 'Copy the node and set its parentNode.' + return CDATASectionNode(self.parentNode, self.textContent) + + def getNodeName(self): + 'Get the node name.' + return '#cdata-section' + + def getNodeType(self): + 'Get the node type.' + return 4 + + def getOwnerDocument(self): + 'Get the owner document.' + return self.parentNode.getOwnerDocument() + + def getTextContent(self): + 'Get the text content.' + return self.textContent + + def removeChildNodesFromIDNameParent(self): + 'Remove the childNodes from the id and name dictionaries and the childNodes.' + pass + + def removeFromIDNameParent(self): + 'Remove this from the id and name dictionaries and the childNodes of the parentNode.' + if self.parentNode != None: + self.parentNode.childNodes.remove(self) + + def setParentAddToChildNodes(self, parentNode): + 'Set the parentNode and add this to its childNodes.' + self.parentNode = parentNode + if self.parentNode != None: + self.parentNode.childNodes.append(self) + + attributes = property(getAttributes) + childNodes = property(getChildNodes) + nodeName = property(getNodeName) + nodeType = property(getNodeType) + ownerDocument = property(getOwnerDocument) + + +class CommentMonad(CDATASectionMonad): + 'A monad to handle a comment node.' + def getNextMonad(self, character): + 'Get the next monad.' + self.input.write(character) + if character == '>': + inputString = self.input.getvalue() + if inputString.endswith('-->'): + textContent = '<%s\n' % inputString + self.parentNode.childNodes.append(CommentNode(self.parentNode, textContent)) + return OpenMonad(self.parentNode) + return self + + +class CommentNode(CDATASectionNode): + 'A comment node.' + def getCopyShallow(self, attributes=None): + 'Copy the node and set its parentNode.' + return CommentNode(self.parentNode, self.textContent) + + def getNodeName(self): + 'Get the node name.' + return '#comment' + + def getNodeType(self): + 'Get the node type.' + return 8 + + nodeName = property(getNodeName) + nodeType = property(getNodeType) + + +class DocumentNode: + 'A class to parse an xml text and store the elements.' + def __init__(self, fileName, xmlText): + 'Initialize.' + self.childNodes = [] + self.fileName = fileName + self.idDictionary = {} + self.nameDictionary = {} + self.parentNode = None + self.tagDictionary = {} + self.xmlText = xmlText + createAppendByText(self, xmlText) + + def __repr__(self): + 'Get the string representation of this xml document.' + output = io.BytesIO() + for childNode in self.childNodes: + childNode.addXML(0, output) + return output.getvalue() + + def appendChild(self, elementNode): + 'Append child elementNode to the child nodes.' + self.childNodes.append(elementNode) + elementNode.addToIdentifierDictionaries() + return elementNode + + def getAttributes(self): + 'Get the attributes.' + return {} + + def getCascadeBoolean(self, defaultBoolean, key): + 'Get the cascade boolean.' + return defaultBoolean + + def getCascadeFloat(self, defaultFloat, key): + 'Get the cascade float.' + return defaultFloat + + def getDocumentElement(self): + 'Get the document element.' + if len(self.childNodes) == 0: + return None + return self.childNodes[-1] + + def getImportNameChain(self, suffix=''): + 'Get the import name chain with the suffix at the end.' + return suffix + + def getNodeName(self): + 'Get the node name.' + return '#document' + + def getNodeType(self): + 'Get the node type.' + return 9 + + def getOriginalRoot(self): + 'Get the original reparsed document element.' + if evaluate.getEvaluatedBoolean(True, self.documentElement, 'getOriginalRoot'): + return DocumentNode(self.fileName, self.xmlText).documentElement + return None + + def getOwnerDocument(self): + 'Get the owner document.' + return self + + attributes = property(getAttributes) + documentElement = property(getDocumentElement) + nodeName = property(getNodeName) + nodeType = property(getNodeType) + ownerDocument = property(getOwnerDocument) + + +class DocumentTypeMonad(CDATASectionMonad): + 'A monad to handle a document type node.' + def getNextMonad(self, character): + 'Get the next monad.' + self.input.write(character) + if character == '>': + inputString = self.input.getvalue() + if inputString.endswith('?>'): + textContent = '%s\n' % inputString + self.parentNode.childNodes.append(DocumentTypeNode(self.parentNode, textContent)) + return OpenMonad(self.parentNode) + return self + + +class DocumentTypeNode(CDATASectionNode): + 'A document type node.' + def getCopyShallow(self, attributes=None): + 'Copy the node and set its parentNode.' + return DocumentTypeNode(self.parentNode, self.textContent) + + def getNodeName(self): + 'Get the node name.' + return '#forNowDocumentType' + + def getNodeType(self): + 'Get the node type.' + return 10 + + nodeName = property(getNodeName) + nodeType = property(getNodeType) + + +class ElementEndMonad: + 'A monad to look for the end of an ElementNode tag.' + def __init__(self, parentNode): + 'Initialize.' + self.parentNode = parentNode + + def getNextMonad(self, character): + 'Get the next monad.' + if character == '>': + return TextMonad(self.parentNode) + return self + + +class ElementLocalNameMonad: + 'A monad to set the local name of an ElementNode.' + def __init__(self, character, parentNode): + 'Initialize.' + self.input = cStringIO.StringIO() + self.input.write(character) + self.parentNode = parentNode + + def getNextMonad(self, character): + 'Get the next monad.' + if character == '[': + if (self.input.getvalue() + character).startswith('![CDATA['): + self.input.write(character) + return CDATASectionMonad(self.input, self.parentNode) + if character == '-': + if (self.input.getvalue() + character).startswith('!--'): + self.input.write(character) + return CommentMonad(self.input, self.parentNode) + if character.isspace(): + self.setLocalName() + return ElementReadMonad(self.elementNode) + if character == '/': + self.setLocalName() + self.elementNode.appendSelfToParent() + return ElementEndMonad(self.elementNode.parentNode) + if character == '>': + self.setLocalName() + self.elementNode.appendSelfToParent() + return TextMonad(self.elementNode) + self.input.write(character) + return self + + def setLocalName(self): + 'Set the class name.' + self.elementNode = ElementNode(self.parentNode) + self.elementNode.localName = self.input.getvalue().lower().strip() + + +class ElementNode: + 'An xml element.' + def __init__(self, parentNode=None): + 'Initialize.' + self.attributes = {} + self.childNodes = [] + self.localName = '' + self.parentNode = parentNode + self.xmlObject = None + + def __repr__(self): + 'Get the string representation of this xml document.' + return '%s\n%s\n%s' % (self.localName, self.attributes, self.getTextContent()) + + def _getAccessibleAttribute(self, attributeName): + 'Get the accessible attribute.' + global globalGetAccessibleAttributeSet + if attributeName in globalGetAccessibleAttributeSet: + return getattr(self, attributeName, None) + return None + + def addSuffixToID(self, idSuffix): + 'Add the suffix to the id.' + if 'id' in self.attributes: + self.attributes['id'] += idSuffix + + def addToIdentifierDictionaries(self): + 'Add the element to the owner document identifier dictionaries.' + ownerDocument = self.getOwnerDocument() + importNameChain = self.getImportNameChain() + idKey = self.getStrippedAttributesValue('id') + if idKey != None: + ownerDocument.idDictionary[importNameChain + idKey] = self + nameKey = self.getStrippedAttributesValue('name') + if nameKey != None: + euclidean.addElementToListDictionaryIfNotThere(self, importNameChain + nameKey, ownerDocument.nameDictionary) + for tagKey in self.getTagKeys(): + euclidean.addElementToListDictionaryIfNotThere(self, tagKey, ownerDocument.tagDictionary) + + def addXML(self, depth, output): + 'Add xml for this elementNode.' + innerOutput = cStringIO.StringIO() + xml_simple_writer.addXMLFromObjects(depth + 1, self.childNodes, innerOutput) + innerText = innerOutput.getvalue() + xml_simple_writer.addBeginEndInnerXMLTag(self.attributes, depth, innerText, self.localName, output, self.getTextContent()) + + def appendChild(self, elementNode): + 'Append child elementNode to the child nodes.' + self.childNodes.append(elementNode) + elementNode.addToIdentifierDictionaries() + return elementNode + + def appendSelfToParent(self): + 'Append self to the parentNode.' + self.parentNode.appendChild(self) + + def copyXMLChildNodes(self, idSuffix, parentNode): + 'Copy the xml childNodes.' + for childNode in self.childNodes: + childNode.getCopy(idSuffix, parentNode) + + def getCascadeBoolean(self, defaultBoolean, key): + 'Get the cascade boolean.' + if key in self.attributes: + value = evaluate.getEvaluatedBoolean(None, self, key) + if value != None: + return value + return self.parentNode.getCascadeBoolean(defaultBoolean, key) + + def getCascadeFloat(self, defaultFloat, key): + 'Get the cascade float.' + if key in self.attributes: + value = evaluate.getEvaluatedFloat(None, self, key) + if value != None: + return value + return self.parentNode.getCascadeFloat(defaultFloat, key) + + def getChildNodesByLocalName(self, localName): + 'Get the childNodes which have the given class name.' + childNodesByLocalName = [] + for childNode in self.childNodes: + if localName.lower() == childNode.getNodeName(): + childNodesByLocalName.append(childNode) + return childNodesByLocalName + + def getChildNodesByLocalNameRecursively(self, localName): + 'Get the childNodes which have the given class name recursively.' + childNodesByLocalName = self.getChildNodesByLocalName(localName) + for childNode in self.childNodes: + childNodesByLocalName += childNode.getChildNodesByLocalNameRecursively(localName) + return childNodesByLocalName + + def getCopy(self, idSuffix, parentNode): + 'Copy the xml element, set its dictionary and add it to the parentNode.' + matrix4X4 = matrix.getBranchMatrixSetElementNode(self) + attributesCopy = self.attributes.copy() + attributesCopy.update(matrix4X4.getAttributes('matrix.')) + copy = self.getCopyShallow(attributesCopy) + copy.setParentAddToChildNodes(parentNode) + copy.addSuffixToID(idSuffix) + copy.addToIdentifierDictionaries() + self.copyXMLChildNodes(idSuffix, copy) + return copy + + def getCopyShallow(self, attributes=None): + 'Copy the xml element and set its dictionary and parentNode.' + if attributes == None: # to evade default initialization bug where a dictionary is initialized to the last dictionary + attributes = {} + copyShallow = ElementNode(self.parentNode) + copyShallow.attributes = attributes + copyShallow.localName = self.localName + return copyShallow + + def getDocumentElement(self): + 'Get the document element.' + return self.getOwnerDocument().getDocumentElement() + + def getElementNodeByID(self, idKey): + 'Get the xml element by id.' + idDictionary = self.getOwnerDocument().idDictionary + idKey = self.getImportNameChain() + idKey + if idKey in idDictionary: + return idDictionary[idKey] + return None + + def getElementNodesByName(self, nameKey): + 'Get the xml elements by name.' + nameDictionary = self.getOwnerDocument().nameDictionary + nameKey = self.getImportNameChain() + nameKey + if nameKey in nameDictionary: + return nameDictionary[nameKey] + return None + + def getElementNodesByTag(self, tagKey): + 'Get the xml elements by tag.' + tagDictionary = self.getOwnerDocument().tagDictionary + if tagKey in tagDictionary: + return tagDictionary[tagKey] + return None + + def getFirstChildByLocalName(self, localName): + 'Get the first childNode which has the given class name.' + for childNode in self.childNodes: + if localName.lower() == childNode.getNodeName(): + return childNode + return None + + def getIDSuffix(self, elementIndex=None): + 'Get the id suffix from the dictionary.' + suffix = self.localName + if 'id' in self.attributes: + suffix = self.attributes['id'] + if elementIndex == None: + return '_%s' % suffix + return '_%s_%s' % (suffix, elementIndex) + + def getImportNameChain(self, suffix=''): + 'Get the import name chain with the suffix at the end.' + importName = self.getStrippedAttributesValue('_importName') + if importName != None: + suffix = '%s.%s' % (importName, suffix) + return self.parentNode.getImportNameChain(suffix) + + def getNodeName(self): + 'Get the node name.' + return self.localName + + def getNodeType(self): + 'Get the node type.' + return 1 + + def getOwnerDocument(self): + 'Get the owner document.' + return self.parentNode.getOwnerDocument() + + def getParser(self): + 'Get the parser.' + return self.getOwnerDocument() + + def getPaths(self): + 'Get all paths.' + if self.xmlObject == None: + return [] + return self.xmlObject.getPaths() + + def getPreviousElementNode(self): + 'Get previous ElementNode if it exists.' + if self.parentNode == None: + return None + previousElementNodeIndex = self.parentNode.childNodes.index(self) - 1 + if previousElementNodeIndex < 0: + return None + return self.parentNode.childNodes[previousElementNodeIndex] + + def getPreviousVertex(self, defaultVector3=None): + 'Get previous vertex if it exists.' + if self.parentNode == None: + return defaultVector3 + if self.parentNode.xmlObject == None: + return defaultVector3 + if len(self.parentNode.xmlObject.vertexes) < 1: + return defaultVector3 + return self.parentNode.xmlObject.vertexes[-1] + + def getStrippedAttributesValue(self, keyString): + 'Get the stripped attribute value if the length is at least one, otherwise return None.' + if keyString in self.attributes: + strippedAttributesValue = self.attributes[keyString].strip() + if len(strippedAttributesValue) > 0: + return strippedAttributesValue + return None + + def getSubChildWithID( self, idReference ): + 'Get the childNode which has the idReference.' + for childNode in self.childNodes: + if 'bf:id' in childNode.attributes: + if childNode.attributes['bf:id'] == idReference: + return childNode + subChildWithID = childNode.getSubChildWithID( idReference ) + if subChildWithID != None: + return subChildWithID + return None + + def getTagKeys(self): + 'Get stripped tag keys.' + if 'tags' not in self.attributes: + return [] + tagKeys = [] + tagString = self.attributes['tags'] + if tagString.startswith('='): + tagString = tagString[1 :] + if tagString.startswith('['): + tagString = tagString[1 :] + if tagString.endswith(']'): + tagString = tagString[: -1] + for tagWord in tagString.split(','): + tagKey = tagWord.strip() + if tagKey != '': + tagKeys.append(tagKey) + return tagKeys + + def getTextContent(self): + 'Get the text from the child nodes.' + if len(self.childNodes) == 0: + return '' + firstNode = self.childNodes[0] + if firstNode.nodeType == 3: + return firstNode.textContent + return '' + + def getValueByKey( self, key ): + 'Get value by the key.' + if key in evaluate.globalElementValueDictionary: + return evaluate.globalElementValueDictionary[key](self) + if key in self.attributes: + return evaluate.getEvaluatedLinkValue(self, self.attributes[key]) + return None + + def getVertexes(self): + 'Get the vertexes.' + if self.xmlObject == None: + return [] + return self.xmlObject.getVertexes() + + def getXMLProcessor(self): + 'Get the xmlProcessor.' + return self.getDocumentElement().xmlProcessor + + def linkObject(self, xmlObject): + 'Link self to xmlObject and add xmlObject to archivableObjects.' + self.xmlObject = xmlObject + self.xmlObject.elementNode = self + self.parentNode.xmlObject.archivableObjects.append(self.xmlObject) + + def printAllVariables(self): + 'Print all variables.' + print('attributes') + print(self.attributes) + print('childNodes') + print(self.childNodes) + print('localName') + print(self.localName) + print('parentNode') + print(self.parentNode.getNodeName()) + print('text') + print(self.getTextContent()) + print('xmlObject') + print(self.xmlObject) + print('') + + def printAllVariablesRoot(self): + 'Print all variables and the document element variables.' + self.printAllVariables() + documentElement = self.getDocumentElement() + if documentElement != None: + print('') + print('Root variables:') + documentElement.printAllVariables() + + def removeChildNodesFromIDNameParent(self): + 'Remove the childNodes from the id and name dictionaries and the childNodes.' + childNodesCopy = self.childNodes[:] + for childNode in childNodesCopy: + childNode.removeFromIDNameParent() + + def removeFromIDNameParent(self): + 'Remove this from the id and name dictionaries and the childNodes of the parentNode.' + self.removeChildNodesFromIDNameParent() + idKey = self.getStrippedAttributesValue('id') + if idKey != None: + idDictionary = self.getOwnerDocument().idDictionary + idKey = self.getImportNameChain() + idKey + if idKey in idDictionary: + del idDictionary[idKey] + nameKey = self.getStrippedAttributesValue('name') + if nameKey != None: + euclidean.removeElementFromListTable(self, self.getImportNameChain() + nameKey, self.getOwnerDocument().nameDictionary) + for tagKey in self.getTagKeys(): + euclidean.removeElementFromListTable(self, tagKey, self.getOwnerDocument().tagDictionary) + if self.parentNode != None: + self.parentNode.childNodes.remove(self) + + def setParentAddToChildNodes(self, parentNode): + 'Set the parentNode and add this to its childNodes.' + self.parentNode = parentNode + if self.parentNode != None: + self.parentNode.childNodes.append(self) + + def setTextContent(self, textContent=''): + 'Get the text from the child nodes.' + if len(self.childNodes) == 0: + self.childNodes.append(TextNode(self, textContent)) + return + firstNode = self.childNodes[0] + if firstNode.nodeType == 3: + firstNode.textContent = textContent + self.childNodes.append(TextNode(self, textContent)) + + nodeName = property(getNodeName) + nodeType = property(getNodeType) + ownerDocument = property(getOwnerDocument) + textContent = property(getTextContent) + + +class ElementReadMonad: + 'A monad to read the attributes of the ElementNode tag.' + def __init__(self, elementNode): + 'Initialize.' + self.elementNode = elementNode + + def getNextMonad(self, character): + 'Get the next monad.' + if character.isspace(): + return self + if character == '/': + self.elementNode.appendSelfToParent() + return ElementEndMonad(self.elementNode.parentNode) + if character == '>': + self.elementNode.appendSelfToParent() + return TextMonad(self.elementNode) + return KeyMonad(character, self.elementNode) + + +class KeyMonad: + 'A monad to set the key of an attribute of an ElementNode.' + def __init__(self, character, elementNode): + 'Initialize.' + self.input = cStringIO.StringIO() + self.input.write(character) + self.elementNode = elementNode + + def getNextMonad(self, character): + 'Get the next monad.' + if character == '=': + return ValueMonad(self.elementNode, self.input.getvalue().strip()) + self.input.write(character) + return self + + +class OpenChooseMonad(ElementEndMonad): + 'A monad to choose the next monad.' + def getNextMonad(self, character): + 'Get the next monad.' + if character.isspace(): + return self + if character == '?': + input = cStringIO.StringIO() + input.write(' 0: + self.parentNode.childNodes.append(TextNode(self.parentNode, inputString)) + return OpenChooseMonad(self.parentNode) + self.input.write(character) + return self + + +class TextNode(CDATASectionNode): + 'A text node.' + def addXML(self, depth, output): + 'Add xml for this text node.' + pass + + def getCopyShallow(self, attributes=None): + 'Copy the node and set its parentNode.' + return TextNode(self.parentNode, self.textContent) + + def getNodeName(self): + 'Get the node name.' + return '#text' + + def getNodeType(self): + 'Get the node type.' + return 3 + + nodeName = property(getNodeName) + nodeType = property(getNodeType) + + +class ValueMonad: + 'A monad to set the value of an attribute of an ElementNode.' + def __init__(self, elementNode, key): + 'Initialize.' + self.elementNode = elementNode + self.input = cStringIO.StringIO() + self.key = key + self.quoteCharacter = None + + def getNextMonad(self, character): + 'Get the next monad.' + if self.quoteCharacter == None: + if character == '"' or character == "'": + self.quoteCharacter = character + return self + if self.quoteCharacter == character: + self.elementNode.attributes[self.key] = self.input.getvalue() + return ElementReadMonad(self.elementNode) + self.input.write(character) + return self + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/xml_simple_writer.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/xml_simple_writer.py new file mode 100644 index 0000000..9cca9e2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/fabmetheus_utilities/xml_simple_writer.py @@ -0,0 +1,132 @@ +""" +XML tag writer utilities. + +""" + + +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__ + +import io + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Nophead \nArt of Illusion ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addBeginEndInnerXMLTag(attributes, depth, innerText, localName, output, text=''): + 'Add the begin and end xml tag and the inner text if any.' + if len( innerText ) > 0: + addBeginXMLTag(attributes, depth, localName, output, text) + output.write( innerText ) + addEndXMLTag(depth, localName, output) + else: + addClosedXMLTag(attributes, depth, localName, output, text) + +def addBeginXMLTag(attributes, depth, localName, output, text=''): + 'Add the begin xml tag.' + depthStart = '\t' * depth + output.write('%s<%s%s>%s\n' % (depthStart, localName, getAttributesString(attributes), text)) + +def addClosedXMLTag(attributes, depth, localName, output, text=''): + 'Add the closed xml tag.' + depthStart = '\t' * depth + attributesString = getAttributesString(attributes) + if len(text) > 0: + output.write('%s<%s%s >%s\n' % (depthStart, localName, attributesString, text, localName)) + else: + output.write('%s<%s%s />\n' % (depthStart, localName, attributesString)) + +def addEndXMLTag(depth, localName, output): + 'Add the end xml tag.' + depthStart = '\t' * depth + output.write('%s\n' % (depthStart, localName)) + +def addXMLFromLoopComplexZ(attributes, depth, loop, output, z): + 'Add xml from loop.' + addBeginXMLTag(attributes, depth, 'path', output) + for pointComplexIndex in xrange(len(loop)): + pointComplex = loop[pointComplexIndex] + addXMLFromXYZ(depth + 1, pointComplexIndex, output, pointComplex.real, pointComplex.imag, z) + addEndXMLTag(depth, 'path', output) + +def addXMLFromObjects(depth, objects, output): + 'Add xml from objects.' + for object in objects: + object.addXML(depth, output) + +def addXMLFromVertexes(depth, output, vertexes): + 'Add xml from loop.' + for vertexIndex in xrange(len(vertexes)): + vertex = vertexes[vertexIndex] + addXMLFromXYZ(depth + 1, vertexIndex, output, vertex.x, vertex.y, vertex.z) + +def addXMLFromXYZ(depth, index, output, x, y, z): + 'Add xml from x, y & z.' + attributes = {'index' : str(index)} + if x != 0.0: + attributes['x'] = str(x) + if y != 0.0: + attributes['y'] = str(y) + if z != 0.0: + attributes['z'] = str(z) + addClosedXMLTag(attributes, depth, 'vertex', output) + +def compareAttributeKeyAscending(key, otherKey): + 'Get comparison in order to sort attribute keys in ascending order, with the id key first and name second.' + if key == 'id': + return - 1 + if otherKey == 'id': + return 1 + if key == 'name': + return - 1 + if otherKey == 'name': + return 1 + if key < otherKey: + return - 1 + return int(key > otherKey) + +def getAttributesString(attributes): + 'Add the closed xml tag.' + attributesString = '' + attributesKeys = attributes.keys() + attributesKeys.sort(compareAttributeKeyAscending) + for attributesKey in attributesKeys: + valueString = str(attributes[attributesKey]) + if "'" in valueString: + attributesString += ' %s="%s"' % (attributesKey, valueString) + else: + attributesString += " %s='%s'" % (attributesKey, valueString) + return attributesString + +def getBeginGeometryXMLOutput(elementNode=None): + 'Get the beginning of the string representation of this boolean geometry object info.' + output = getBeginXMLOutput() + attributes = {} + if elementNode != None: + documentElement = elementNode.getDocumentElement() + attributes = documentElement.attributes + addBeginXMLTag(attributes, 0, 'fabmetheus', output) + return output + +def getBeginXMLOutput(): + 'Get the beginning of the string representation of this object info.' + output = io.BytesIO() + output.write("\n") + return output + +def getDictionaryWithoutList(dictionary, withoutList): + 'Get the dictionary without the keys in the list.' + dictionaryWithoutList = {} + for key in dictionary: + if key not in withoutList: + dictionaryWithoutList[key] = dictionary[key] + return dictionaryWithoutList + +def getEndGeometryXMLString(output): + 'Get the string representation of this object info.' + addEndXMLTag(0, 'fabmetheus', output) + return output.getvalue() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/Screw Holder Bottom.stl b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/Screw Holder Bottom.stl new file mode 100644 index 0000000..f372a18 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/Screw Holder Bottom.stl @@ -0,0 +1,2886 @@ +solid "Screw_Holder_Bottom"; Produced by Art of Illusion 2.4, Fri Oct 16 16:42:04 PDT 2009 +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 24.730643081307 0 + vertex 14.883210818105 25.830303993361 0 + vertex 15.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 23 0 + vertex 54.002309837942 24.730643081307 0 + vertex 60 40 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 48.011309837942 15.269356918694 0 + vertex 54.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 15.830303993361 11.883210818105 0 + vertex 16.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 43.737436867076 27.737436867076 0 + vertex 43.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 43.169696006639 15.116789181895 0 + vertex 42.5 15.25 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 54.002309837942 24.730643081307 0 + vertex 48.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 43.169696006639 28.116789181895 0 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 40 0 + vertex 52 30 0 + vertex 52 40 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 14.169696006639 0 + vertex 14.75 13.5 0 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 27.169696006639 0 + vertex 14.042553191489 30 0 + vertex 15.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 16.5 11.75 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 17.169696006639 28.116789181895 0 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 14.75 13.5 0 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 17 0 + vertex 60 17 0 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 42.5 11.75 0 + vertex 43.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 15.262563132924 14.737436867076 0 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 14.464705848856 10 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 15.830303993361 28.116789181895 0 + vertex 15.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 15.262563132924 12.262563132924 0 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 16.5 28.25 0 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 60 23 0 + vertex 54.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 23 0 + vertex 16.5 24.75 0 + vertex 17.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.75 26.5 0 + vertex 12.002309837942 24.730643081307 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 60 40 0 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.422110817733 17 0 + vertex 48.011309837942 17 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 13.5 0 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 6.011309837942 17 0 + vertex 6.011309837942 15.269356918694 0 + vertex 0 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.422110817733 17 0 + vertex 41.830303993361 15.116789181895 0 + vertex 41.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 17.737436867076 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 0 10 0 + vertex 0 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 25.830303993361 0 + vertex 12.002309837942 24.730643081307 0 + vertex 14.75 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 52 30 0 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 17 0 + vertex 43.737436867076 14.737436867076 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 15.25 0 + vertex 41.830303993361 15.116789181895 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 14.883210818105 12.830303993361 0 + vertex 6.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 23 0 + vertex 0 30 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 6.011309837942 15.269356918694 0 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 60 17 0 + vertex 52 10 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 23 0 + vertex 0 23 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 48.011309837942 15.269356918694 0 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 27.169696006639 0 + vertex 41.262563132924 25.262563132924 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 25.830303993361 0 + vertex 18.25 26.5 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 14.737436867076 0 + vertex 41.262563132924 14.737436867076 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 25.262563132924 0 + vertex 18.116789181895 25.830303993361 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 18.116789181895 12.830303993361 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 41.262563132924 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0 + vertex 41.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 11.75 0 + vertex 14.464705848856 10 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.25 26.5 0 + vertex 44.116789181895 27.169696006639 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 12.830303993361 0 + vertex 41.262563132924 12.262563132924 0 + vertex 17.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 17.737436867076 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 12.830303993361 0 + vertex 44.25 13.5 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 12.830303993361 0 + vertex 40.75 13.5 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.25 13.5 0 + vertex 18.116789181895 14.169696006639 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 14.737436867076 0 + vertex 17.737436867076 14.737436867076 0 + vertex 17.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 14.169696006639 0 + vertex 17.737436867076 14.737436867076 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 44.25 26.5 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 14.75 13.5 0.77775 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.75 13.5 0.77775 + vertex 14.75 13.5 0 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 41.830303993361 28.116789181895 0 + vertex 42.5 28.25 0.77775 + vertex 41.830303993361 28.116789181895 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.830303993361 24.883210818105 0.77775 + vertex 15.830303993361 24.883210818105 0 + vertex 15.262563132924 25.262563132924 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 28.25 0 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 16.5 28.25 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 43.169696006639 24.883210818105 0 + vertex 42.5 24.75 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 28.25 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 15.830303993361 28.116789181895 0.77775 + vertex 15.830303993361 28.116789181895 0 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 23 0 + vertex 6.011309837942 23 0.77775 + vertex 0 23 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 60 0 0.77775 + vertex 52 10 0.77775 + vertex 52 0 0.77775 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.75 26.5 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.169696006639 24.883210818105 0 + vertex 16.5 24.75 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 0 0 + vertex 52 0 0.77775 + vertex 52 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.883210818105 12.830303993361 0.77775 + vertex 40.75 13.5 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 24.75 0 + vertex 41.830303993361 24.883210818105 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 0 0 + vertex 60 0 0.77775 + vertex 52 0 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 28.116789181895 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.262563132924 27.737436867076 0 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 17 0 + vertex 0 17 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 17 0 + vertex 48.011309837942 17 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 18.25 26.5 0 + vertex 18.25 26.5 0.77775 + vertex 18.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.455907969142 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 44.25 26.5 0 + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 10 0 + vertex 15.306548743796 10 0.77775 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 25.830303993361 0 + vertex 40.75 26.5 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 43.737436867076 27.737436867076 0.77775 + vertex 44.116789181895 27.169696006639 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 43.737436867076 27.737436867076 0 + vertex 44.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 10 0 + vertex 52 10 0.77775 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 23 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 26.5 0 + vertex 14.883210818105 25.830303993361 0.77775 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 6.011309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 18.116789181895 14.169696006639 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 17.737436867076 14.737436867076 0 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 42.5 15.25 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 41.830303993361 15.116789181895 0.77775 + vertex 41.830303993361 15.116789181895 0 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 14.883210818105 14.169696006639 0.77775 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 14.883210818105 14.169696006639 0 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 43.169696006639 15.116789181895 0 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 13.5 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.75 13.5 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 11.75 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 43.169696006639 11.883210818105 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 17.169696006639 15.116789181895 0 + vertex 17.737436867076 14.737436867076 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.730643081307 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 0 23 0 + vertex 6.011309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 48.011309837942 23 0 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 10 0 + vertex 6.011309837942 15.269356918694 0 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 -0 + outer loop + vertex 17.169696006639 28.116789181895 0.77775 + vertex 16.5 28.25 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 44.116789181895 27.169696006639 0 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.25 26.5 0 + vertex 44.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.75 26.5 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 40.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 17.169696006639 11.883210818105 0 + vertex 16.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 52 30 0.77775 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 15.063011877768 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.75 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 24.883210818105 0.77775 + vertex 42.5 24.75 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 24.730643081307 0 + vertex 14.883210818105 27.169696006639 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.169696006639 15.116789181895 0 + vertex 43.737436867076 14.737436867076 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 43.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 42.5 15.25 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 23 0.77775 + vertex 0 30 0 + vertex 0 23 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 30 0 + vertex 0 23 0.77775 + vertex 0 30 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 10 0 + vertex 52 0 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 17.169696006639 11.883210818105 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.169696006639 28.116789181895 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 42.5 28.25 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 14.042553191489 30 0 + vertex 41.866228156844 30 0.77775 + vertex 52 30 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 42.5 11.75 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.830303993361 11.883210818105 0 + vertex 15.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 27.169696006639 0 + vertex 40.883210818105 25.830303993361 0 + vertex 41.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 17.169696006639 28.116789181895 0 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 25.830303993361 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 15.262563132924 25.262563132924 0.77775 + vertex 15.262563132924 25.262563132924 0 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 43.737436867076 27.737436867076 0 + vertex 52 30 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 25.830303993361 0 + vertex 18.116789181895 25.830303993361 0.77775 + vertex 18.25 26.5 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 15.063011877768 0.77775 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 15.116789181895 0 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 43.169696006639 28.116789181895 0.77775 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.169696006639 28.116789181895 0.77775 + vertex 43.169696006639 28.116789181895 0 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 42.5 11.75 0.77775 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 41.262563132924 14.737436867076 0 + vertex 41.830303993361 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 17 0 + vertex 60 0 0 + vertex 52 0 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 23 0 + vertex 17.379510917074 23 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 41.830303993361 11.883210818105 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 14.042553191489 30 0 + vertex 52 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 18.116789181895 27.169696006639 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.75 26.5 0 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.75 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 0 30 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 11.75 0.77775 + vertex 43.169696006639 11.883210818105 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + vertex 16.5 28.25 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 30 0.77775 + vertex 52 30 0 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 17 0 + vertex 52 0 0 + vertex 52 10 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 0 + outer loop + vertex 44.116789181895 14.169696006639 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.737436867076 14.737436867076 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 17 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 16.5 24.75 0 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 0 17 0 + vertex 0 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 16.5 28.25 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 17.737436867076 25.262563132924 0 + vertex 17.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 24.75 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 17.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 44.116789181895 27.169696006639 0 + vertex 44.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.75 13.5 0 + vertex 18.25 13.5 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 48.011309837942 24.730643081307 0 + vertex 48.011309837942 23 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 10 0.77775 + vertex 0 10 0 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.306548743796 10 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 28.116789181895 0 + vertex 43.169696006639 28.116789181895 0.77775 + vertex 42.5 28.25 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 16.5 11.75 0 + vertex 16.5 11.75 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.737436867076 25.262563132924 0 + vertex 17.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 10 0.77775 + vertex 14.464705848856 10 0 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 17.737436867076 14.737436867076 0 + vertex 17.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.830303993361 11.883210818105 0 + vertex 15.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.75 26.5 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 44.116789181895 14.169696006639 0.77775 + vertex 43.737436867076 14.737436867076 0 + vertex 44.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 60 17 0.77775 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.830303993361 24.883210818105 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.25 26.5 0.77775 + vertex 18.25 26.5 0 + vertex 18.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 25.262563132924 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 17.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 15.455907969142 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.306548743796 10 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.737436867076 25.262563132924 0.77775 + vertex 17.737436867076 25.262563132924 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 42.5 28.25 0.77775 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.25 13.5 0.77775 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 60 17 0.77775 + vertex 60 17 0 + vertex 54.002309837942 17 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 12.002309837942 17 0 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 11.883210818105 0 + vertex 43.737436867076 12.262563132924 0.77775 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 11.883210818105 0 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 14.169696006639 0 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 41.830303993361 28.116789181895 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 23 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 16.5 15.25 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 17.737436867076 12.262563132924 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 40 0.77775 + vertex 60 23 0.77775 + vertex 60 40 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.75 13.5 0 + vertex 18.116789181895 12.830303993361 0 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 28.116789181895 0 + vertex 42.5 28.25 0.77775 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 12.002309837942 23 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 23 0.77775 + vertex 60 23 0.77775 + vertex 54.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 24.730643081307 0 + vertex 6.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 17.169696006639 15.116789181895 0 + vertex 16.5 15.25 0.77775 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 17 0.77775 + vertex 60 0 0 + vertex 60 17 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 0 0.77775 + vertex 60 0 0 + vertex 60 17 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 17.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 42.5 28.25 0.77775 + vertex 41.830303993361 28.116789181895 0 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 17 0 + vertex 6.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 25.830303993361 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 41.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.25 13.5 0 + vertex 18.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 25.262563132924 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 18.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 30 0.77775 + vertex 6.011309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 37.474084379442 23 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 40.883210818105 14.169696006639 0 + vertex 41.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 43.169696006639 24.883210818105 0 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 25.830303993361 0 + vertex 44.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 60 17 0.77775 + vertex 54.002309837942 17 0 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 42.5 24.75 0 + vertex 43.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 44.116789181895 27.169696006639 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 18.116789181895 25.830303993361 0 + vertex 17.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 17 0.77775 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.75 26.5 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 0 0.77775 + vertex 52 0 0 + vertex 60 0 0.77775 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.75 26.5 0.77775 + vertex 14.75 26.5 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 54.002309837942 17 0.77775 + vertex 54.002309837942 17 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 17.169696006639 11.883210818105 0.77775 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 17.169696006639 15.116789181895 0 + vertex 17.169696006639 15.116789181895 0.77775 + vertex 16.5 15.25 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 16.5 11.75 0.77775 + vertex 16.5 11.75 0 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.269356918694 0 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 52 30 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 24.75 0.77775 + vertex 43.169696006639 24.883210818105 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 26.5 0 + vertex 14.75 26.5 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 43.737436867076 14.737436867076 0 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 48.011309837942 17 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 41.830303993361 24.883210818105 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 42.5 24.75 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 40 0 + vertex 52 40 0.77775 + vertex 60 40 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 40 0 + vertex 60 40 0.77775 + vertex 60 40 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 15.830303993361 24.883210818105 0.77775 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 16.5 24.75 0.77775 + vertex 16.5 24.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 24.936988122232 0.77775 + vertex 12.002309837942 23 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 24.936988122232 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 40 0.77775 + vertex 60 23 0.77775 + vertex 60 23 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 40 0.77775 + vertex 60 23 0 + vertex 60 40 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 27.737436867076 0 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 27.737436867076 0 + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 37.474084379442 23 0.77775 + vertex 48.011309837942 23 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 37.474084379442 23 0.77775 + vertex 42.5 24.75 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 14.737436867076 0 + vertex 12.002309837942 17 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 15.116789181895 0.77775 + vertex 42.5 15.25 0.77775 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 -0 + outer loop + vertex 43.169696006639 15.116789181895 0.77775 + vertex 42.5 15.25 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 52 10 0.77775 + vertex 60 0 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 60 0 0.77775 + vertex 60 17 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 12.830303993361 0.77775 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 12.830303993361 0 + vertex 40.75 13.5 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.737436867076 27.737436867076 0 + vertex 17.737436867076 27.737436867076 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.737436867076 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 0 30 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 14.75 26.5 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 12.262563132924 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 12.262563132924 0.77775 + vertex 44.116789181895 12.830303993361 0 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 48.011309837942 23 0.77775 + vertex 37.474084379442 23 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.830303993361 15.116789181895 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.830303993361 15.116789181895 0 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 41.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 41.262563132924 12.262563132924 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 16.5 15.25 0 + vertex 15.830303993361 15.116789181895 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 25.262563132924 0 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 44.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 25.262563132924 0 + vertex 44.116789181895 25.830303993361 0.77775 + vertex 44.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.75 13.5 0.77775 + vertex 40.75 13.5 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.75 13.5 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 23 0 + vertex 60 23 0.77775 + vertex 54.002309837942 23 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 23 0 + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 30 0 + vertex 14.042553191489 30 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 30 0 + vertex 14.883210818105 27.169696006639 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.262563132924 25.262563132924 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0.77775 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + vertex 41.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.262563132924 27.737436867076 0 + vertex 41.830303993361 28.116789181895 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 24.883210818105 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 24.883210818105 0.77775 + vertex 43.737436867076 25.262563132924 0 + vertex 43.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 43.169696006639 11.883210818105 0 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 43.737436867076 12.262563132924 0 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 60 23 0.77775 + vertex 52 40 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 52 40 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 41.422110817733 17 0 + vertex 12.002309837942 17 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.730643081307 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 12.002309837942 17 0.77775 + vertex 14.883210818105 14.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 25.830303993361 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 17 0.77775 + vertex 0 10 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 17 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + vertex 6.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 42.5 15.25 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 42.5 15.25 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 14.75 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 0 30 0.77775 + vertex 0 23 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 0 23 0.77775 + vertex 6.011309837942 23 0.77775 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 40.75 26.5 0 + vertex 40.883210818105 25.830303993361 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 44.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 14.169696006639 0 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 17.737436867076 12.262563132924 0.77775 + vertex 18.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 10 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 54.002309837942 24.936988122232 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 48.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 43.737436867076 12.262563132924 0 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 44.116789181895 12.830303993361 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 0 30 0 + vertex 0 30 0.77775 + vertex 14.607403236621 30 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 0 30 0 + vertex 14.607403236621 30 0.77775 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 12.262563132924 0 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 41.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0.77775 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 10 0 + vertex 0 10 0.77775 + vertex 0 17 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 10 0 + vertex 0 17 0.77775 + vertex 0 17 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.25 13.5 0.77775 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.25 13.5 0 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 41.422110817733 17 0 + vertex 34.416922535211 17 0.77775 + vertex 48.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 41.422110817733 17 0 + vertex 48.011309837942 17 0.77775 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 30 0.77775 + vertex 52 40 0.77775 + vertex 52 40 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 30 0.77775 + vertex 52 40 0 + vertex 52 30 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 16.5 24.75 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 40.883210818105 27.169696006639 0 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 17.737436867076 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 0 10 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 15.830303993361 24.883210818105 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 12.002309837942 23 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 25.830303993361 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 40.75 26.5 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 18.116789181895 27.169696006639 0 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 41.262563132924 14.737436867076 0 + vertex 17.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 17.169696006639 15.116789181895 0 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 15.116789181895 0 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 15.116789181895 0 + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0 + vertex 41.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 37.474084379442 23 0.77775 + vertex 17.379510917074 23 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 17.379510917074 23 0.77775 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 15.830303993361 15.116789181895 0 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 15.262563132924 14.737436867076 0 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 40.883210818105 25.830303993361 0.77775 + vertex 41.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 41.262563132924 25.262563132924 0.77775 + vertex 41.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 15.262563132924 12.262563132924 0 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 14.464705848856 10 0 + vertex 0 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 44.25 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 44.25 26.5 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 24.936988122232 0.77775 + vertex 54.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 14.607403236621 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 14.607403236621 30 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 14.169696006639 0.77775 + vertex 18.25 13.5 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.25 26.5 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 18.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 54.002309837942 23 0 + vertex 54.002309837942 23 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 18.25 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 42.5 11.75 0.77775 + vertex 41.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 52 10 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.25 26.5 0.77775 + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 40.75 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 40.75 26.5 0.77775 + vertex 18.25 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + endloop +endfacet +endsolid diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/Screw Holder.gts b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/Screw Holder.gts new file mode 100644 index 0000000..6399a12 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/Screw Holder.gts @@ -0,0 +1,4493 @@ +737 2253 1502 Number of Vertices,Number of Edges,Number of Faces +-6.859863212247494 0.22628773741583247 9.642249999999999 Vertex Coordinates XYZ +-6.649863212247495 0.946287737415833 9.642249999999999 +-6.319863212247495 1.396287737415833 9.642249999999999 +-5.809863212247494 1.726287737415833 9.642249999999999 +-5.2998632122474945 1.8462877374158326 9.642249999999999 +-4.519863212247495 1.8462877374158326 9.642249999999999 +-4.009863212247495 1.636287737415833 9.642249999999999 +-3.6798632122474944 1.2762877374158328 9.642249999999999 +-3.4698632122474935 0.7962877374158329 9.642249999999999 +-3.3498632122474934 0.016287737415832892 9.642249999999999 +-3.3498632122474934 -0.37371226258416745 9.642249999999999 +-5.689863212247494 -0.4037122625841675 9.642249999999999 +-5.509863212247495 -0.9437122625841673 9.642249999999999 +-5.179863212247494 -1.2437122625841672 9.642249999999999 +-4.699863212247494 -1.3937122625841676 9.642249999999999 +-3.949863212247494 -1.3637122625841673 9.642249999999999 +-3.319863212247494 -1.1837122625841672 9.642249999999999 +-3.3498632122474934 -1.9637122625841674 9.642249999999999 +-4.279863212247495 -2.143712262584168 9.642249999999999 +-5.209863212247494 -2.143712262584168 9.642249999999999 +-5.929863212247494 -1.9037122625841678 9.642249999999999 +-6.409863212247495 -1.4837122625841674 9.642249999999999 +-6.679863212247494 -1.0337122625841673 9.642249999999999 +-6.829863212247495 -0.4337122625841675 9.642249999999999 +-5.4473632122474935 0.8687877374158329 9.642249999999999 +-4.457363212247493 0.8387877374158327 9.642249999999999 +-4.367363212247493 0.26878773741583245 9.642249999999999 +-5.627363212247492 0.3887877374158325 9.642249999999999 +-4.667363212247494 1.1087877374158324 9.642249999999999 +-5.627363212247492 0.2987877374158325 9.642249999999999 +-5.177363212247494 1.1087877374158324 9.642249999999999 +-4.009863212247495 1.636287737415833 11.322250000000002 +-4.519863212247496 1.8462877374158326 11.322250000000002 +-3.6798632122474944 1.276287737415834 11.32225 +-3.3498632122474934 -0.37371226258416734 11.32225 +-3.3498632122474934 0.016287737415832892 11.32225 +-5.689863212247495 -0.4037122625841676 11.32225 +-3.9498632122474935 -1.3637122625841673 11.32225 +-3.319863212247494 -1.1837122625841672 11.32225 +-3.3498632122474943 -1.9637122625841679 11.32225 +-6.859863212247496 0.2262877374158324 11.322249999999999 +-6.829863212247496 -0.4337122625841676 11.32225 +-6.319863212247493 1.396287737415832 11.322249999999999 +-5.809863212247494 1.726287737415833 11.32225 +-6.649863212247495 0.9462877374158329 11.32225 +-5.209863212247495 -2.143712262584168 11.32225 +-5.929863212247496 -1.9037122625841687 11.32225 +-5.179863212247494 -1.2437122625841672 11.32225 +-4.699863212247494 -1.3937122625841676 11.32225 +-4.279863212247495 -2.1437122625841676 11.32225 +-6.4098632122474966 -1.483712262584167 11.32225 +-6.679863212247495 -1.0337122625841677 11.32225 +-5.299863212247494 1.846287737415833 11.32225 +-3.4698632122474944 0.796287737415833 11.32225 +-5.509863212247496 -0.9437122625841675 11.32225 +-4.667363212247494 1.1087877374158326 11.32225 +-5.177363212247494 1.1087877374158317 11.32225 +-4.457363212247494 0.8387877374158329 11.32225 +-5.627363212247493 0.38878773741583256 11.32225 +-4.367363212247493 0.2687877374158326 11.32225 +-5.627363212247492 0.2987877374158324 11.32225 +-5.4473632122474935 0.8687877374158326 11.32225 +11.759863212247497 1.8856484886916096 9.64225 +12.899863212247496 1.8556484886916098 9.64225 +12.929863212247495 1.22564848869161 9.64225 +13.439863212247495 1.6756484886916105 9.64225 +13.889863212247496 1.8556484886916098 9.64225 +14.519863212247497 1.8556484886916098 9.64225 +14.999863212247497 1.5856484886916102 9.64225 +15.359863212247497 1.0756484886916096 9.64225 +15.539863212247496 0.3556484886916095 9.64225 +15.539863212247496 -0.60435151130839 9.64225 +15.329863212247497 -1.23435151130839 9.64225 +14.999863212247497 -1.6843515113083907 9.64225 +14.609863212247497 -1.9543515113083907 9.64225 +14.039863212247496 -2.1343515113083904 9.64225 +12.899863212247496 -2.194351511308391 9.64225 +12.869863212247497 -3.5143515113083907 9.64225 +11.759863212247497 -3.484351511308391 9.64225 +12.899863212247496 -1.3843515113083904 9.64225 +13.079863212247497 -1.4443515113083905 9.64225 +14.279863212247497 -0.9043515113083903 9.64225 +12.899863212247496 0.4456484886916098 9.64225 +13.379863212247496 0.8956484886916104 9.64225 +13.769863212247497 1.0156484886916095 9.64225 +14.369863212247497 -0.21435151130839014 9.64225 +14.279863212247497 0.5056484886916098 9.64225 +14.009863212247497 -1.2943515113083905 9.64225 +14.099863212247497 0.8656484886916099 9.64225 +13.649863212247496 -1.4443515113083905 9.64225 +11.759863212247497 1.8856484886916096 11.32225 +12.899863212247498 1.8556484886916098 11.32225 +12.929863212247488 1.2256484886916095 11.32225 +13.439863212247495 1.6756484886916105 11.32225 +13.889863212247494 1.8556484886916107 11.32225 +14.519863212247497 1.8556484886916098 11.32225 +14.999863212247497 1.5856484886916107 11.32225 +15.359863212247493 1.0756484886916098 11.32225 +15.5398632122475 0.35564848869160914 11.32225 +15.539863212247498 -0.6043515113083899 11.32225 +15.329863212247494 -1.234351511308391 11.32225 +14.999863212247503 -1.684351511308392 11.32225 +14.609863212247497 -1.9543515113083898 11.32225 +14.039863212247498 -2.1343515113083895 11.32225 +12.899863212247496 -2.194351511308391 11.32225 +12.869863212247498 -3.514351511308391 11.32225 +11.759863212247494 -3.4843515113083914 11.32225 +14.279863212247493 -0.9043515113083888 11.322250000000002 +14.009863212247494 -1.2943515113083883 11.322250000000002 +13.379863212247498 0.8956484886916118 11.32225 +13.769863212247497 1.0156484886916093 11.322249999999997 +12.899863212247496 0.4456484886916098 11.32225 +12.899863212247496 -1.38435151130839 11.32225 +14.36986321224749 -0.2143515113083907 11.32225 +14.279863212247497 0.5056484886916095 11.32225 +14.099863212247497 0.8656484886916107 11.32225 +13.649863212247496 -1.4443515113083905 11.32225 +13.0798632122475 -1.4443515113083896 11.32225 +2.270136787752506 3.2862877374158317 9.64225 +5.210136787752507 3.256287737415831 9.64225 +5.7801367877525065 3.0462877374158315 9.64225 +6.110136787752507 2.716287737415832 9.64225 +6.260136787752507 2.356287737415831 9.64225 +6.320136787752506 1.6662877374158316 9.64225 +6.140136787752507 1.0962877374158313 9.64225 +5.600136787752507 0.5562877374158314 9.64225 +5.270136787752507 0.3462877374158312 9.64225 +7.040136787752506 -2.1737122625841687 9.64225 +5.720136787752507 -2.143712262584169 9.64225 +4.220136787752507 0.04628773741583159 9.64225 +3.380136787752506 0.01628773741583156 9.64225 +3.350136787752507 -2.1737122625841687 9.64225 +2.270136787752506 -2.143712262584169 9.64225 +3.3801367877525057 2.5062877374158314 9.64225 +3.3801367877525057 0.8562877374158319 9.64225 +5.120136787752506 1.9962877374158312 9.64225 +4.520136787752507 0.9162877374158317 9.64225 +5.120136787752506 1.4562877374158316 9.64225 +3.920136787752506 0.8262877374158316 9.64225 +4.580136787752507 2.476287737415832 9.64225 +4.940136787752506 2.296287737415832 9.64225 +4.880136787752506 1.0962877374158313 9.64225 +2.2701367877525054 3.286287737415832 11.32225 +5.210136787752507 3.256287737415833 11.322250000000004 +5.780136787752506 3.046287737415832 11.32225 +6.1101367877525075 2.7162877374158323 11.32225 +6.260136787752506 2.356287737415831 11.32225 +6.320136787752505 1.6662877374158316 11.32225 +6.140136787752509 1.0962877374158313 11.32225 +5.600136787752508 0.5562877374158319 11.32225 +5.270136787752508 0.3462877374158302 11.32225 +7.040136787752505 -2.1737122625841687 11.32225 +5.7201367877525096 -2.143712262584169 11.32225 +4.220136787752508 0.046287737415831476 11.32225 +3.3801367877525066 0.01628773741583056 11.32225 +3.3501367877525063 -2.1737122625841683 11.32225 +2.2701367877525063 -2.143712262584169 11.322250000000002 +3.9201367877525066 0.8262877374158334 11.32225 +4.520136787752508 0.9162877374158318 11.32225 +4.880136787752507 1.096287737415831 11.32225 +5.120136787752507 1.9962877374158317 11.32225 +4.940136787752505 2.296287737415833 11.32225 +5.120136787752507 1.4562877374158316 11.32225 +3.380136787752506 0.8562877374158319 11.32225 +4.580136787752508 2.476287737415833 11.32225 +3.3801367877525057 2.506287737415832 11.32225 +-2.4198632122474937 1.876287737415832 9.64225 +-1.279863212247494 1.8462877374158322 9.64225 +-1.2498632122474946 1.2162877374158323 9.64225 +-0.7398632122474949 1.666287737415833 9.64225 +-0.2898632122474938 1.8462877374158322 9.64225 +0.3401367877525061 1.8462877374158322 9.64225 +0.8201367877525065 1.5762877374158326 9.64225 +1.1801367877525069 1.066287737415832 9.64225 +1.3601367877525057 0.34628773741583185 9.64225 +1.3601367877525057 -0.6137122625841677 9.64225 +1.1501367877525075 -1.2437122625841677 9.64225 +0.8201367877525065 -1.6937122625841683 9.64225 +0.43013678775250686 -1.9637122625841683 9.64225 +-0.13986321224749437 -2.143712262584168 9.64225 +-1.279863212247494 -2.2037122625841685 9.64225 +-1.3098632122474934 -3.5237122625841684 9.64225 +-2.4198632122474937 -3.4937122625841686 9.64225 +-1.0998632122474925 -1.453712262584168 9.64225 +0.10013678775250578 -0.9137122625841679 9.64225 +-1.279863212247494 0.43628773741583216 9.64225 +-0.7998632122474936 0.8862877374158328 9.64225 +-0.40986321224749395 1.0062877374158319 9.64225 +-1.279863212247494 -1.393712262584168 9.64225 +0.19013678775250686 -0.22371226258416776 9.64225 +0.10013678775250612 0.4962877374158322 9.64225 +-0.16986321224749384 -1.3037122625841682 9.64225 +-0.07986321224749288 0.8562877374158323 9.64225 +-0.5298632122474941 -1.453712262584168 9.64225 +-2.4198632122474937 1.876287737415832 11.32225 +-1.2798632122474942 1.8462877374158313 11.32225 +-1.2498632122474944 1.2162877374158318 11.32225 +-0.7398632122474951 1.6662877374158342 11.322249999999999 +-0.28986321224749373 1.8462877374158322 11.32225 +0.340136787752506 1.8462877374158322 11.32225 +0.8201367877525063 1.5762877374158322 11.32225 +1.180136787752507 1.0662877374158315 11.32225 +1.3601367877525052 0.34628773741583185 11.32225 +1.3601367877525052 -0.6137122625841679 11.32225 +1.1501367877525073 -1.2437122625841677 11.32225 +0.8201367877525064 -1.6937122625841687 11.322250000000002 +0.43013678775250686 -1.9637122625841683 11.32225 +-0.13986321224749487 -2.143712262584167 11.32225 +-1.2798632122474942 -2.203712262584169 11.32225 +-1.3098632122474934 -3.5237122625841684 11.32225 +-2.4198632122474937 -3.493712262584169 11.32225 +0.10013678775250634 -0.9137122625841673 11.32225 +-0.16986321224749368 -1.3037122625841677 11.32225 +-0.40986321224749384 1.0062877374158323 11.32225 +-1.2798632122474942 0.43628773741583216 11.32225 +-1.2798632122474942 -1.393712262584168 11.32225 +0.19013678775250709 -0.22371226258416776 11.32225 +0.10013678775250609 0.4962877374158318 11.32225 +-0.07986321224749288 0.8562877374158324 11.32225 +-0.5298632122474942 -1.453712262584168 11.32225 +-1.0998632122474927 -1.453712262584168 11.32225 +-0.7998632122474936 0.8862877374158331 11.32225 +-11.929863212247497 3.2862877374158317 9.64225 +-8.989863212247496 3.256287737415831 9.64225 +-8.419863212247495 3.0462877374158315 9.64225 +-8.089863212247495 2.716287737415832 9.64225 +-7.939863212247495 2.356287737415831 9.64225 +-7.879863212247496 1.6662877374158316 9.64225 +-8.059863212247494 1.0962877374158313 9.64225 +-8.599863212247495 0.5562877374158314 9.64225 +-8.929863212247495 0.3462877374158312 9.64225 +-7.159863212247496 -2.1737122625841687 9.64225 +-8.479863212247496 -2.143712262584169 9.64225 +-9.979863212247496 0.04628773741583159 9.64225 +-10.819863212247496 0.01628773741583156 9.64225 +-10.849863212247495 -2.1737122625841687 9.64225 +-11.929863212247497 -2.143712262584169 9.64225 +-10.819863212247496 2.5062877374158314 9.64225 +-10.819863212247496 0.8562877374158319 9.64225 +-9.079863212247496 1.9962877374158312 9.64225 +-9.679863212247495 0.9162877374158317 9.64225 +-9.079863212247496 1.4562877374158316 9.64225 +-10.279863212247495 0.8262877374158316 9.64225 +-9.619863212247495 2.476287737415832 9.64225 +-9.259863212247495 2.296287737415832 9.64225 +-9.319863212247496 1.0962877374158313 9.64225 +-11.9298632122475 3.2862877374158317 11.32225 +-8.989863212247498 3.2562877374158314 11.32225 +-8.419863212247495 3.046287737415831 11.32225 +-8.089863212247495 2.7162877374158314 11.32225 +-7.939863212247496 2.3562877374158306 11.322250000000002 +-7.879863212247495 1.666287737415833 11.32225 +-8.059863212247494 1.096287737415831 11.32225 +-8.599863212247495 0.5562877374158306 11.32225 +-8.929863212247497 0.3462877374158324 11.32225 +-7.159863212247495 -2.1737122625841683 11.32225 +-8.479863212247496 -2.143712262584169 11.32225 +-9.979863212247498 0.04628773741582992 11.32225 +-10.819863212247498 0.016287737415831227 11.32225 +-10.849863212247497 -2.1737122625841687 11.32225 +-11.929863212247499 -2.1437122625841694 11.32225 +-9.679863212247495 0.9162877374158314 11.32225 +-9.319863212247498 1.096287737415831 11.322250000000002 +-9.079863212247496 1.4562877374158316 11.32225 +-9.079863212247496 1.996287737415832 11.322250000000002 +-9.259863212247495 2.2962877374158324 11.32225 +-10.819863212247496 0.8562877374158329 11.322250000000002 +-9.619863212247497 2.476287737415832 11.32225 +-10.279863212247498 0.8262877374158322 11.32225 +-10.819863212247494 2.5062877374158314 11.32225 +30.0 15.073000000000004 7.822250000000002 +30.0 15.206210818105248 8.491946006638905 +30.0 15.585563132923546 9.059686867076463 +30.0 16.153303993361096 9.43903918189475 +30.0 16.823 9.572249999999997 +30.0 17.49269600663891 9.43903918189475 +30.0 18.06043686707646 9.059686867076458 +30.0 18.439789181894753 8.49194600663891 +30.0 18.573000000000004 7.822250000000006 +30.0 18.439789181894753 7.152553993361098 +22.000000000000007 18.43978918189476 7.152553993361091 +30.0 18.06043686707646 6.5848131329235455 +30.0 17.492696006638916 6.205460818105249 +30.0 16.823 6.072249999999999 +30.0 16.153303993361092 6.205460818105249 +30.0 15.585563132923546 6.584813132923542 +30.0 15.206210818105244 7.152553993361091 +22.000000000000007 15.073000000000006 7.822250000000001 +22.000000000000007 15.206210818105252 8.491946006638905 +22.000000000000007 15.585563132923546 9.05968686707646 +22.000000000000007 16.823000000000008 9.572249999999997 +22.000000000000007 16.153303993361096 9.439039181894755 +22.000000000000014 17.492696006638912 9.439039181894753 +22.000000000000007 18.060436867076454 9.059686867076454 +22.000000000000007 18.439789181894753 8.491946006638907 +22.0 18.57300000000001 7.822250000000001 +22.000000000000007 18.060436867076465 6.584813132923542 +22.000000000000007 17.492696006638912 6.20546081810525 +22.000000000000007 16.823 6.0722499999999995 +22.000000000000007 16.1533039933611 6.205460818105244 +22.000000000000007 15.585563132923546 6.584813132923544 +22.000000000000007 15.206210818105255 7.152553993361091 +22.000000000000007 15.073000000000002 -0.17774999999999785 +22.000000000000007 15.585563132923546 1.0596868670764614 +22.000000000000007 15.206210818105255 0.49194600663890586 +22.000000000000007 16.153303993361096 1.439039181894751 +22.000000000000007 16.823000000000004 1.5722499999999995 +22.000000000000007 17.492696006638912 1.4390391818947483 +22.000000000000007 18.06043686707646 1.059686867076457 +22.000000000000014 18.573000000000004 -0.1777500000000014 +22.000000000000007 18.43978918189476 0.49194600663890853 +22.000000000000007 18.060436867076458 -1.4151868670764545 +22.000000000000007 18.43978918189476 -0.8474460066389078 +22.000000000000007 17.492696006638912 -1.7945391818947485 +22.000000000000007 16.153303993361092 -1.7945391818947503 +22.000000000000007 16.823000000000004 -1.9277499999999996 +22.000000000000007 15.585563132923546 -1.4151868670764598 +22.000000000000007 15.206210818105253 -0.8474460066389087 +30.0 15.072999999999999 -0.17774999999999785 +30.0 15.206210818105257 0.49194600663890586 +30.0 15.58556313292355 1.0596868670764596 +30.0 16.153303993361096 1.4390391818947554 +30.0 16.823000000000004 1.5722499999999995 +30.0 18.060436867076465 1.0596868670764579 +30.0 17.492696006638912 1.4390391818947492 +30.0 18.439789181894753 0.49194600663890586 +30.0 18.573 -0.1777500000000014 +30.0 18.43978918189476 -0.8474460066389105 +30.0 17.492696006638912 -1.7945391818947511 +30.0 18.06043686707646 -1.4151868670764562 +30.0 16.823000000000004 -1.9277499999999996 +30.0 16.153303993361096 -1.7945391818947494 +30.0 15.585563132923548 -1.4151868670764598 +30.0 15.20621081810525 -0.8474460066389096 +29.999999999999993 -17.927 -0.1777500000000014 +22.000000000000007 -17.793789181894752 0.491946006638905 +30.0 -17.414436867076454 1.0596868670764552 +30.0 -16.846696006638904 1.4390391818947492 +30.0 -16.176999999999996 1.5722499999999995 +30.0 -15.507303993361093 1.4390391818947545 +30.0 -14.939563132923539 1.059686867076457 +29.999999999999993 -14.560210818105249 0.4919460066389041 +29.999999999999993 -14.427 -0.17774999999999963 +30.0 -14.560210818105247 -0.8474460066389069 +30.0 -14.93956313292354 -1.4151868670764562 +30.0 -15.507303993361088 -1.794539181894752 +30.0 -16.177 -1.9277500000000023 +30.0 -16.846696006638904 -1.7945391818947556 +30.0 -17.414436867076454 -1.4151868670764527 +29.999999999999993 -17.793789181894756 -0.8474460066389087 +30.0 -17.793789181894756 0.4919460066389023 +22.000000000000007 -17.927000000000003 -0.17774999999999785 +22.000000000000007 -17.414436867076454 1.059686867076456 +22.000000000000007 -16.846696006638904 1.4390391818947519 +22.000000000000007 -16.176999999999996 1.5722499999999995 +22.000000000000007 -15.507303993361091 1.4390391818947519 +22.000000000000007 -14.939563132923539 1.0596868670764579 +22.000000000000007 -14.560210818105244 0.49194600663890764 +22.000000000000007 -14.427000000000001 -0.1777500000000023 +22.000000000000007 -14.560210818105245 -0.8474460066389105 +22.000000000000007 -14.939563132923539 -1.4151868670764625 +22.000000000000007 -15.507303993361091 -1.7945391818947538 +22.000000000000007 -16.177 -1.9277500000000014 +22.000000000000007 -16.846696006638904 -1.79453918189476 +22.000000000000007 -17.414436867076454 -1.415186867076459 +22.000000000000007 -17.79378918189475 -0.8474460066389069 +22.0 -17.92699999999999 7.822249999999998 +22.0 -17.793789181894745 8.491946006638901 +22.0 -17.414436867076454 9.059686867076454 +22.000000000000007 -16.8466960066389 9.43903918189475 +22.000000000000007 -16.177 9.572249999999999 +22.000000000000007 -15.507303993361091 9.439039181894753 +22.000000000000007 -14.939563132923539 9.059686867076458 +22.000000000000007 -14.560210818105242 8.491946006638909 +22.0 -14.426999999999989 7.822249999999997 +22.0 -14.560210818105247 7.152553993361094 +22.000000000000007 -14.939563132923539 6.584813132923543 +22.000000000000007 -15.50730399336109 6.205460818105245 +22.000000000000007 -16.177 6.072249999999999 +22.000000000000007 -16.846696006638904 6.205460818105244 +22.000000000000007 -17.414436867076454 6.584813132923531 +22.0 -17.793789181894745 7.15255399336109 +30.0 -17.92699999999999 7.822249999999999 +29.999999999999993 -17.79378918189475 8.491946006638901 +30.0 -16.8466960066389 9.439039181894747 +29.999999999999993 -17.41443686707645 9.059686867076447 +30.0 -16.177000000000003 9.572249999999999 +30.0 -15.507303993361093 9.439039181894755 +30.0 -14.939563132923542 9.05968686707646 +29.999999999999993 -14.560210818105244 8.49194600663891 +30.0 -14.426999999999994 7.822249999999999 +30.0 -14.560210818105247 7.15255399336109 +30.0 -15.507303993361091 6.205460818105246 +30.0 -14.939563132923539 6.58481313292354 +30.0 -16.846696006638908 6.20546081810525 +30.0 -16.177000000000003 6.072249999999999 +30.0 -17.414436867076454 6.5848131329235375 +29.999999999999993 -17.793789181894738 7.152553993361091 +22.000000000000007 20.323 11.32225 +-15.957446808510642 10.323 -3.6777500000000014 +22.000000000000007 10.323 -3.677749999999998 +22.000000000000007 20.323 -3.6777499999999996 +-30.0 10.323 11.32225 +22.000000000000007 10.323 11.32225 +18.512888012183033 10.323 -3.6777500000000014 +3.649215653894089 10.323 11.32225 +-30.0 10.323 -3.6777500000000014 +22.000000000000007 -19.677 -3.677750000000003 +-15.535294151144047 -9.677 -3.677749999999998 +-15.551298997002412 -9.677 11.32225 +-30.0 -9.677 11.32225 +22.000000000000007 -9.677 -3.677749999999998 +22.000000000000007 -9.677 11.32225 +14.771385376467595 -9.677000000000001 11.322249999999997 +-30.0 -9.677 -3.6777500000000014 +22.000000000000007 -19.677 11.32225 +14.25 -6.1770000000000005 11.32225 +14.116789181894752 -6.846696006638907 11.32225 +13.737436867076458 -7.414436867076454 11.32225 +13.169696006638908 -7.793789181894753 11.32225 +12.5 -7.927000000000002 11.32225 +11.830303993361095 -7.793789181894753 -3.677749999999998 +10.883210818105248 -6.846696006638907 11.32225 +10.750000000000002 -6.177000000000002 11.32225 +10.883210818105248 -5.507303993361092 11.32225 +11.262563132923546 -4.939563132923541 11.32225 +11.830303993361092 -4.56021081810525 11.32225 +12.5 -4.4270000000000005 11.32225 +13.169696006638912 -4.560210818105252 11.32225 +13.737436867076458 -4.939563132923545 11.32225 +14.116789181894745 -5.507303993361094 11.32225 +11.262563132923546 -7.414436867076459 -3.677749999999998 +14.116789181894752 -6.846696006638906 -3.677749999999998 +14.250000000000004 -6.177000000000001 -3.677749999999998 +13.737436867076454 -7.414436867076457 -3.677749999999998 +12.5 -7.9270000000000005 -3.677749999999998 +13.169696006638908 -7.793789181894753 -3.677749999999998 +11.262563132923546 -7.4144368670764615 11.322250000000004 +11.830303993361099 -7.793789181894749 11.322249999999997 +10.883210818105246 -6.846696006638908 -3.6777500000000014 +10.749999999999998 -6.177000000000003 -3.6777500000000014 +10.883210818105246 -5.50730399336109 -3.677749999999998 +11.262563132923546 -4.939563132923544 -3.677749999999998 +11.830303993361092 -4.560210818105249 -3.677749999999998 +12.5 -4.427 -3.6777500000000014 +13.169696006638912 -4.560210818105251 -3.6777500000000014 +13.737436867076458 -4.939563132923547 -3.6777500000000014 +14.116789181894745 -5.507303993361091 -3.677749999999998 +14.25 6.823000000000001 11.32225 +14.116789181894752 6.153303993361095 11.32225 +13.737436867076458 5.585563132923542 11.32225 +13.169696006638908 5.206210818105249 11.32225 +12.5 5.0729999999999995 11.32225 +11.830303993361092 5.206210818105249 11.32225 +11.262563132923542 5.58556313292354 11.32225 +10.88321081810525 6.153303993361093 11.32225 +10.75 6.823000000000001 11.32225 +10.88321081810525 7.4926960066389094 11.32225 +11.262563132923542 8.060436867076458 11.32225 +11.830303993361092 8.439789181894751 11.32225 +12.500000000000004 8.572999999999997 11.32225 +13.169696006638908 8.43978918189475 11.32225 +13.737436867076454 8.060436867076458 11.32225 +14.116789181894745 7.492696006638908 11.32225 +14.116789181894756 6.153303993361094 -3.677749999999998 +14.250000000000004 6.822999999999999 -3.677749999999998 +13.169696006638908 5.206210818105248 -3.677749999999998 +13.737436867076454 5.585563132923541 -3.6777500000000014 +11.830303993361092 5.206210818105244 -3.677749999999998 +12.500000000000007 5.073 -3.677749999999998 +11.262563132923539 5.585563132923539 -3.6777500000000014 +10.883210818105248 6.153303993361094 -3.677749999999998 +10.75 6.823000000000002 -3.677749999999998 +10.88321081810525 7.49269600663891 -3.677749999999998 +11.262563132923542 8.060436867076458 -3.677749999999998 +11.830303993361092 8.439789181894751 -3.677749999999998 +13.169696006638908 8.439789181894747 -3.677749999999998 +12.500000000000007 8.572999999999999 -3.677749999999998 +13.73743686707645 8.060436867076456 -3.677749999999998 +14.116789181894752 7.492696006638909 -3.677749999999998 +-11.75 6.8229999999999995 11.32225 +-11.883210818105248 6.153303993361091 11.32225 +-12.262563132923546 5.585563132923542 11.32225 +-12.830303993361092 5.206210818105249 11.32225 +-13.5 5.0729999999999995 11.32225 +-14.169696006638908 5.206210818105247 11.32225 +-14.737436867076461 5.585563132923542 11.32225 +-15.116789181894752 6.153303993361095 11.32225 +-15.25 6.8229999999999995 11.32225 +-15.116789181894749 7.492696006638904 11.32225 +-14.737436867076454 8.060436867076458 11.32225 +-14.169696006638908 8.439789181894753 11.32225 +-13.500000000000007 8.573 11.32225 +-12.830303993361099 8.439789181894755 11.32225 +-12.262563132923542 8.060436867076463 11.32225 +-11.883210818105244 7.492696006638908 11.32225 +-11.749999999999996 6.823 -3.6777500000000014 +-11.883210818105255 6.153303993361096 -3.677749999999998 +-12.830303993361095 5.2062108181052515 -3.677750000000005 +-12.262563132923542 5.5855631329235464 -3.677749999999998 +-13.5 5.073 -3.6777500000000014 +-14.169696006638908 5.20621081810525 -3.677749999999998 +-15.116789181894756 6.153303993361094 -3.6777500000000014 +-14.737436867076461 5.5855631329235464 -3.6777500000000014 +-15.25 6.823000000000004 -3.6777500000000014 +-15.116789181894749 7.492696006638907 -3.677749999999998 +-14.169696006638908 8.439789181894753 -3.6777500000000014 +-14.737436867076454 8.06043686707646 -3.677749999999998 +-13.500000000000007 8.573 -3.6777500000000014 +-12.830303993361099 8.439789181894756 -3.677749999999998 +-12.262563132923546 8.060436867076461 -3.677749999999998 +-11.883210818105248 7.492696006638909 -3.6777500000000014 +-11.75 -6.177000000000002 11.32225 +-11.883210818105248 -6.846696006638909 11.32225 +-12.262563132923546 -7.4144368670764615 11.32225 +-12.830303993361095 -7.793789181894753 11.32225 +-13.5 -7.927000000000004 11.32225 +-14.169696006638912 -7.793789181894753 11.32225 +-14.737436867076458 -7.414436867076458 11.32225 +-15.116789181894752 -6.846696006638909 11.32225 +-15.25 -6.177000000000002 11.32225 +-15.116789181894752 -5.507303993361099 11.32225 +-14.737436867076461 -4.9395631329235465 11.32225 +-14.169696006638908 -4.56021081810525 11.32225 +-13.5 -4.4270000000000005 11.32225 +-12.830303993361095 -4.56021081810525 11.32225 +-12.262563132923539 -4.939563132923539 11.32225 +-11.88321081810524 -5.507303993361094 11.32225 +-11.883210818105248 -6.846696006638911 -3.677749999999998 +-11.750000000000004 -6.177 -3.6777500000000014 +-12.262563132923546 -7.414436867076457 -3.677749999999998 +-12.830303993361095 -7.7937891818947564 -3.677749999999998 +-14.169696006638908 -7.793789181894753 -3.6777500000000014 +-13.5 -7.927000000000008 -3.677749999999998 +-14.737436867076454 -7.414436867076457 -3.677749999999998 +-15.116789181894752 -6.846696006638908 -3.677749999999998 +-15.250000000000004 -6.177 -3.6777500000000014 +-15.116789181894749 -5.507303993361097 -3.6777500000000014 +-14.737436867076461 -4.939563132923546 -3.677749999999998 +-14.169696006638908 -4.560210818105251 -3.677749999999998 +-13.5 -4.427 -3.6777500000000014 +-12.830303993361095 -4.560210818105254 -3.6777500000000014 +-12.262563132923546 -4.93956313292354 -3.677749999999998 +-11.88321081810524 -5.507303993361091 -3.677749999999998 +-17.997690162057708 -2.677 2.3222500000000004 +-17.997690162057708 3.323 2.3222500000000004 +30.0 3.323 2.3222500000000004 +30.0 3.323 -3.6777500000000014 +-23.988690162057708 3.323 2.3222500000000004 +-23.988690162057708 -2.677 2.3222500000000004 +30.0 -2.677 -3.6777500000000014 +18.011309837942285 -2.677 2.3222500000000004 +30.0 -2.677 2.3222500000000004 +18.011309837942285 3.323 -3.677749999999998 +-30.0 3.323 -3.6777500000000014 +-17.997690162057708 3.323 -3.6777500000000014 +-23.988690162057708 3.323 -3.677749999999998 +11.422110817733461 -2.677 -3.677749999999998 +-17.997690162057708 -2.677 -3.6777500000000014 +-30.0 -2.677 2.3222500000000004 +-23.988690162057708 -2.677 -3.677749999999998 +-30.0 3.323 2.3222500000000004 +24.002309837942285 -2.677 2.3222500000000004 +18.011309837942285 3.323 2.3222500000000004 +24.002309837942285 3.323 -3.6777500000000014 +-30.0 -2.677 -3.6777500000000014 +24.002309837942285 -2.677 -3.6777500000000014 +24.002309837942285 3.323 2.3222500000000004 +18.011309837942285 -2.677 -3.677749999999998 +-17.997690162057708 -4.876999999999995 -1.5777500000000053 +-17.997690162057708 -4.481173569058687 0.41220384829846246 +-17.997690162057708 -3.3539552621700417 2.099205262170041 +-17.997690162057708 -1.6669538482984616 3.226423569058687 +-17.997690162057708 0.3230000000000051 3.6222499999999958 +-17.997690162057708 2.312953848298472 3.226423569058687 +-17.997690162057708 3.9999552621700523 2.099205262170044 +-17.997690162057708 5.127173569058697 0.41220384829846424 +-17.997690162057708 5.523000000000007 -1.5777500000000053 +-17.997690162057708 5.127173569058698 -3.5677038482984695 +-17.997690162057708 -4.481173569058685 -3.5677038482984766 +-23.988690162057708 -4.876999999999992 -1.5777500000000053 +-23.988690162057708 -4.481173569058684 0.41220384829846246 +-23.988690162057708 -3.35395526217004 2.099205262170041 +-23.988690162057708 -1.6669538482984607 3.226423569058687 +-23.988690162057708 0.323000000000006 3.6222499999999958 +-23.988690162057708 2.312953848298473 3.226423569058687 +-23.988690162057708 3.999955262170054 2.099205262170044 +-23.988690162057708 5.127173569058697 0.41220384829846246 +-23.988690162057708 5.523000000000007 -1.5777500000000053 +-23.988690162057708 5.1271735690587 -3.567703848298473 +-23.988690162057708 -4.481173569058683 -3.5677038482984766 +-17.997690162057708 5.053643081306509 -3.6777500000000014 +-17.997690162057708 -4.4076430813064995 -3.6777500000000014 +-23.988690162057708 5.0536430813065145 -3.677749999999998 +-23.988690162057708 -4.4076430813064995 -3.677749999999998 +30.0 20.323 -3.6777499999999996 +30.0 20.323 11.32225 +30.0 -19.677 -3.677750000000003 +30.0 -19.677 11.32225 +24.002309837942285 5.053643081306509 -3.6777500000000014 +18.011309837942285 5.053643081306513 -3.677749999999998 +24.002309837942285 -4.4076430813064995 -3.6777500000000014 +18.011309837942285 -4.407643081306494 -3.677749999999998 +24.002309837942285 -4.876999999999995 -1.5777500000000053 +24.002309837942285 -4.481173569058687 0.41220384829846246 +24.002309837942285 -3.3539552621700417 2.099205262170041 +24.002309837942285 -1.6669538482984616 3.226423569058687 +24.002309837942285 0.3230000000000051 3.6222499999999958 +24.002309837942285 2.312953848298472 3.226423569058687 +24.002309837942285 3.9999552621700523 2.099205262170044 +24.002309837942285 5.127173569058697 0.41220384829846424 +24.002309837942285 5.523000000000007 -1.5777500000000053 +24.002309837942285 5.127173569058698 -3.5677038482984695 +24.002309837942285 -4.481173569058685 -3.5677038482984766 +18.011309837942285 -4.876999999999992 -1.5777500000000053 +18.011309837942285 -4.481173569058684 0.41220384829846246 +18.011309837942285 -3.35395526217004 2.099205262170041 +18.011309837942285 -1.6669538482984607 3.226423569058687 +18.011309837942285 0.323000000000006 3.6222499999999958 +18.011309837942285 2.312953848298473 3.226423569058687 +18.011309837942285 3.999955262170054 2.099205262170044 +18.011309837942285 5.127173569058697 0.41220384829846246 +18.011309837942285 5.523000000000007 -1.5777500000000053 +18.011309837942285 5.1271735690587 -3.567703848298473 +18.011309837942285 -4.481173569058683 -3.5677038482984766 +-12.919863212247494 1.006287737415828 11.322250000000007 +-13.189863212247493 1.4862877374158323 11.32225 +-15.109863212247499 3.4362877374158303 11.32225 +-16.999863212247483 1.5762877374158215 11.32225 +-17.53986321224749 0.19628773741582983 11.322249999999999 +-12.739863212247494 -0.3737122625841701 11.322250000000006 +-12.739863212247498 0.34628773741582886 11.322250000000004 +-12.979863212247494 -1.0937122625841718 11.322250000000004 +-13.999863212247496 -2.08371226258417 11.32225 +-14.689863212247495 -2.3237122625841695 11.32225 +-13.459863212247495 -1.7237122625841699 11.32225 +-16.939863212247495 -1.57371226258417 11.32225 +-17.35986321224749 0.9762877374158305 11.32225 +-16.3398632122475 -2.05371226258417 11.322250000000002 +-15.649863212247492 -2.3237122625841677 11.32225 +-17.329863212247496 -0.9137122625841699 11.32224999999999 +-17.509863212247502 -0.25371226258417345 11.322249999999986 +-17.539863212247496 0.1962877374158304 9.64225 +-17.359863212247497 0.9762877374158304 9.64225 +-16.999863212247497 1.5762877374158304 9.64225 +-15.109863212247495 3.43628773741583 9.64225 +-13.189863212247493 1.48628773741583 9.64225 +-12.919863212247494 1.0062877374158297 9.64225 +-12.739863212247494 0.34628773741582985 9.64225 +-12.739863212247494 -0.3737122625841701 9.64225 +-12.979863212247494 -1.09371226258417 9.64225 +-13.459863212247495 -1.7237122625841703 9.64225 +-13.999863212247494 -2.08371226258417 9.64225 +-14.689863212247495 -2.32371226258417 9.64225 +-15.649863212247494 -2.32371226258417 9.64225 +-16.339863212247494 -2.05371226258417 9.64225 +-16.939863212247495 -1.57371226258417 9.64225 +-17.329863212247496 -0.9137122625841699 9.64225 +-17.509863212247495 -0.25371226258417 9.64225 +7.756738351254477 -1.9418924731182776 11.32225 +7.60673835125448 -0.38189247311828 11.32225 +7.996738351254475 -0.05189247311827905 11.322249999999997 +8.14673835125448 -2.18189247311828 11.32225 +10.906738351254479 -1.4618924731182803 11.32225 +8.746738351254475 -2.2418924731182805 11.32225 +9.226738351254475 -2.0918924731182775 11.322249999999997 +7.786738351254477 0.7881075268817213 11.32225 +7.426738351254476 -0.891892473118279 11.32225 +7.426738351254478 -1.1618924731182783 11.322249999999993 +11.146738351254479 -1.4918924731182788 11.32225 +11.146738351254477 -2.1518924731182794 11.32225 +8.56673835125448 1.7481075268817183 11.322249999999999 +7.816738351254481 1.5381075268817215 11.32225 +8.05673835125448 0.9081075268817214 11.322249999999999 +8.776738351254474 -1.4318924731182783 11.32225 +8.536738351254476 0.12810752688172422 11.322249999999997 +9.61673835125448 -1.7018924731182792 11.322250000000002 +8.83673835125448 1.1181075268817215 11.322249999999997 +7.546738351254474 -1.6418924731182787 11.322249999999997 +8.536738351254476 -1.1618924731182818 11.32225 +9.316738351254479 1.0581075268817208 11.32225 +9.256738351254473 -1.4318924731182792 11.322250000000002 +10.36673835125448 -2.2418924731182828 11.322249999999997 +10.096738351254476 1.6581075268817225 11.322249999999997 +8.686738351254476 -0.5618924731182797 11.322249999999997 +8.506738351254475 -0.8618924731182792 11.32225 +9.946738351254476 -2.091892473118282 11.322249999999997 +9.496738351254475 1.8081075268817197 11.32225 +9.616738351254476 0.24810752688172077 11.322250000000004 +9.586738351254477 -1.1918924731182794 11.322249999999993 +10.726738351254475 -1.3118924731182808 11.322249999999993 +10.666738351254477 0.8781075268817216 11.32225 +9.586738351254478 0.7881075268817216 11.32225 +9.706738351254476 -1.7918924731182786 11.32225 +9.166738351254473 -0.41189247311827915 11.322249999999997 +10.486738351254473 1.3281075268817206 11.32225 +9.496738351254475 0.21810752688172008 11.322250000000002 +9.61673835125448 -0.44189247311827906 11.322249999999997 +7.4267383512544765 -0.891892473118279 9.67725 +7.606738351254478 -0.3818924731182791 9.67725 +7.996738351254475 -0.05189247311827877 9.67725 +8.536738351254474 0.12810752688172145 9.67725 +9.496738351254475 0.21810752688172086 9.67725 +9.616738351254478 0.24810752688172089 9.67725 +9.586738351254478 0.7881075268817215 9.67725 +9.316738351254479 1.058107526881721 9.67725 +8.836738351254478 1.118107526881721 9.67725 +8.056738351254479 0.9081075268817216 9.67725 +7.786738351254474 0.7881075268817215 9.67725 +7.816738351254479 1.5381075268817215 9.67725 +8.566738351254479 1.748107526881721 9.67725 +9.496738351254475 1.8081075268817215 9.67725 +10.096738351254478 1.6581075268817216 9.67725 +10.486738351254475 1.3281075268817215 9.67725 +10.666738351254477 0.8781075268817216 9.67725 +10.726738351254475 -1.311892473118279 9.67725 +10.906738351254477 -1.461892473118279 9.67725 +11.146738351254477 -1.4918924731182792 9.67725 +11.146738351254477 -2.15189247311828 9.67725 +10.366738351254478 -2.241892473118279 9.67725 +9.946738351254476 -2.0918924731182797 9.67725 +9.706738351254476 -1.7918924731182795 9.67725 +9.616738351254478 -1.7018924731182796 9.67725 +9.226738351254475 -2.0918924731182797 9.67725 +8.746738351254475 -2.241892473118279 9.67725 +8.146738351254477 -2.1818924731182796 9.67725 +7.756738351254475 -1.9418924731182798 9.67725 +7.546738351254474 -1.6418924731182791 9.67725 +7.4267383512544765 -1.1618924731182791 9.67725 +8.536738351254474 -1.1618924731182791 9.67725 +8.686738351254476 -0.5618924731182792 9.67725 +8.506738351254475 -0.861892473118279 9.67725 +9.586738351254478 -1.1918924731182794 9.67725 +9.256738351254475 -1.4318924731182792 9.67725 +9.616738351254478 -0.44189247311827906 9.67725 +9.166738351254477 -0.41189247311827915 9.67725 +8.776738351254474 -1.4318924731182792 9.67725 +671 426 Edge Vertex Indices Starting from 1 +426 107 +647 646 +646 645 +633 261 +672 455 +431 417 +417 101 +193 174 +174 172 +80 63 +627 247 +190 176 +176 175 +191 190 +190 175 +188 172 +172 171 +481 143 +83 63 +18 17 +17 16 +142 137 +137 127 +85 67 +67 66 +85 68 +68 67 +736 731 +731 685 +671 107 +667 148 +661 148 +193 191 +191 174 +20 19 +19 14 +190 177 +177 176 +19 15 +15 14 +448 434 +434 431 +481 249 +249 33 +19 18 +18 16 +19 16 +16 15 +484 247 +665 425 +708 674 +24 23 +23 12 +188 171 +171 170 +694 677 +677 666 +191 175 +175 174 +193 172 +153 128 +142 127 +127 126 +627 626 +626 247 +20 14 +14 13 +30 12 +710 673 +673 667 +366 352 +352 335 +32 6 +597 276 +34 7 +470 453 +34 32 +32 7 +33 32 +195 33 +280 279 +296 280 +300 285 +187 170 +170 169 +295 278 +314 312 +402 314 +639 637 +637 522 +474 458 +389 373 +358 342 +40 17 +646 627 +194 181 +181 180 +328 310 +44 43 +43 3 +44 3 +92 63 +111 84 +401 317 +317 315 +404 289 +289 288 +43 2 +624 600 +45 2 +562 549 +46 20 +510 494 +731 702 +702 701 +38 35 +49 38 +643 630 +348 347 +363 348 +679 152 +44 4 +222 219 +219 214 +402 313 +313 310 +38 15 +683 665 +665 426 +49 15 +363 362 +408 363 +42 23 +323 322 +322 306 +481 195 +195 143 +52 23 +569 558 +558 552 +55 12 +724 665 +55 37 +37 12 +614 604 +604 567 +153 152 +152 128 +434 417 +735 733 +733 716 +673 146 +53 5 +620 564 +621 620 +366 365 +408 366 +494 493 +509 494 +596 328 +251 43 +57 56 +56 29 +57 29 +293 291 +399 293 +287 286 +301 287 +56 26 +30 27 +60 30 +339 338 +354 339 +61 59 +59 28 +61 28 +467 453 +453 452 +509 493 +210 209 +209 182 +615 605 +605 604 +391 271 +357 341 +597 274 +413 404 +404 99 +417 100 +562 555 +555 549 +512 497 +497 496 +569 552 +616 569 +253 229 +254 253 +505 489 +402 312 +658 641 +326 309 +596 327 +292 291 +291 274 +328 312 +330 328 +598 349 +365 349 +610 568 +253 41 +325 323 +323 307 +640 639 +639 522 +324 308 +625 615 +615 604 +412 361 +361 360 +501 485 +659 643 +643 642 +592 503 +399 296 +296 295 +325 307 +408 362 +412 408 +401 318 +318 317 +399 281 +291 275 +275 274 +459 458 +475 459 +295 294 +399 295 +195 34 +325 308 +53 6 +621 611 +611 610 +256 51 +470 454 +454 453 +350 349 +365 350 +323 306 +596 329 +362 346 +607 563 +281 280 +296 281 +326 324 +324 309 +597 275 +332 315 +333 332 +506 490 +278 277 +294 278 +327 310 +328 327 +566 560 +399 294 +294 293 +39 35 +282 280 +485 484 +499 485 +341 340 +356 341 +616 615 +615 569 +497 481 +401 305 +305 303 +554 467 +508 491 +597 278 +412 360 +360 359 +252 43 +638 629 +629 488 +211 39 +554 470 +470 467 +320 286 +299 284 +251 53 +46 21 +47 46 +576 546 +620 609 +642 411 +282 281 +297 282 +623 613 +613 612 +596 330 +330 329 +585 574 +618 608 +608 607 +503 489 +489 488 +582 571 +466 449 +408 336 +366 335 +622 611 +619 608 +36 35 +195 36 +554 469 +61 30 +647 626 +408 365 +365 364 +302 287 +195 54 +54 36 +256 47 +623 612 +55 48 +48 37 +597 277 +479 464 +464 463 +480 464 +597 279 +331 314 +401 303 +346 345 +361 346 +404 290 +290 289 +540 524 +251 44 +598 335 +329 312 +331 329 +329 314 +408 352 +328 313 +313 312 +285 284 +299 285 +330 312 +333 315 +404 292 +292 290 +614 602 +284 283 +298 284 +58 26 +638 488 +483 247 +669 150 +246 231 +231 230 +78 77 +79 78 +736 685 +84 65 +86 71 +87 86 +80 77 +81 80 +561 560 +560 550 +534 409 +264 262 +93 92 +92 64 +93 64 +363 347 +430 104 +479 477 +477 405 +93 65 +417 414 +414 413 +94 93 +93 66 +431 101 +96 67 +616 605 +97 68 +446 445 +558 446 +98 97 +97 69 +98 69 +100 71 +445 428 +101 72 +102 101 +101 73 +165 163 +163 162 +362 347 +347 346 +103 74 +451 94 +104 75 +718 670 +670 664 +452 94 +518 410 +105 77 +429 428 +445 429 +451 95 +583 550 +584 583 +79 63 +107 79 +107 63 +446 429 +539 523 +601 600 +624 601 +352 336 +412 362 +362 361 +598 348 +242 229 +229 228 +50 20 +101 100 +100 72 +514 210 +394 377 +102 73 +439 410 +562 411 +411 403 +605 567 +106 78 +108 88 +88 82 +364 349 +349 348 +478 405 +113 80 +413 375 +375 374 +364 348 +109 90 +90 88 +611 568 +608 563 +596 401 +591 570 +592 579 +594 592 +624 613 +599 385 +421 420 +437 421 +374 373 +413 374 +573 546 +546 545 +350 335 +598 350 +463 404 +450 95 +453 92 +605 563 +557 549 +517 410 +599 408 +538 537 +593 538 +582 572 +572 571 +520 410 +505 490 +490 489 +621 610 +598 408 +462 404 +618 552 +619 618 +437 420 +402 399 +596 402 +572 545 +461 406 +117 90 +461 404 +188 170 +113 81 +118 113 +506 400 +508 506 +196 167 +584 574 +574 573 +414 412 +597 399 +494 406 +460 406 +413 99 +534 532 +532 409 +614 567 +515 514 +529 515 +396 378 +438 422 +368 367 +416 368 +588 577 +420 414 +625 604 +414 410 +410 409 +531 515 +591 581 +581 570 +625 614 +614 603 +106 79 +107 106 +419 418 +433 419 +387 385 +385 370 +562 560 +560 411 +406 403 +493 406 +510 509 +509 400 +352 351 +351 335 +382 367 +383 382 +416 370 +370 369 +192 180 +180 179 +427 107 +593 537 +537 536 +567 551 +602 567 +715 692 +437 436 +436 421 +439 414 +586 549 +587 586 +418 414 +453 91 +357 342 +342 341 +476 400 +532 517 +517 516 +491 403 +109 88 +435 419 +599 387 +396 379 +464 404 +366 350 +396 393 +393 378 +524 523 +539 524 +493 403 +534 517 +599 384 +617 606 +437 412 +428 107 +622 612 +612 611 +373 372 +413 373 +491 490 +506 491 +421 414 +439 422 +593 539 +539 538 +490 403 +599 386 +386 385 +553 547 +547 391 +581 571 +571 570 +525 524 +540 525 +420 419 +435 420 +416 369 +369 368 +599 416 +416 408 +412 409 +436 412 +386 384 +384 368 +508 400 +598 347 +387 370 +450 96 +386 368 +606 563 +599 413 +535 533 +533 409 +449 98 +408 364 +364 363 +538 523 +523 522 +398 382 +541 525 +613 600 +600 565 +562 550 +394 392 +392 376 +622 554 +623 622 +618 607 +507 493 +493 492 +573 545 +431 102 +464 449 +449 404 +428 427 +444 428 +562 407 +384 367 +478 476 +476 405 +509 507 +507 400 +429 106 +492 403 +114 109 +109 108 +395 379 +394 376 +519 410 +384 383 +383 367 +428 106 +419 414 +562 403 +587 577 +577 576 +619 609 +609 608 +596 399 +597 596 +355 339 +617 552 +618 617 +480 479 +479 405 +393 377 +599 383 +412 359 +359 358 +594 579 +114 110 +110 109 +115 110 +30 24 +24 12 +632 247 +26 8 +8 7 +129 128 +128 127 +115 111 +111 110 +134 120 +120 119 +135 134 +134 119 +139 130 +140 120 +141 136 +136 123 +144 143 +143 119 +144 119 +334 303 +203 175 +298 283 +145 120 +532 516 +516 515 +502 501 +556 502 +392 341 +600 548 +147 122 +460 459 +475 460 +585 584 +586 585 +418 417 +434 418 +584 550 +550 549 +592 400 +533 518 +534 533 +495 458 +556 501 +501 499 +415 409 +416 367 +154 129 +407 400 +592 407 +399 291 +638 489 +489 403 +351 336 +353 351 +583 572 +592 556 +157 133 +133 119 +260 259 +259 236 +145 144 +144 120 +80 79 +79 77 +147 146 +146 122 +148 124 +616 606 +606 605 +542 526 +526 525 +149 125 +587 575 +162 136 +164 135 +166 134 +479 463 +463 462 +578 576 +166 140 +140 134 +587 576 +576 575 +597 388 +388 274 +548 332 +559 540 +540 539 +570 559 +593 570 +590 579 +519 518 +533 519 +595 591 +591 580 +321 304 +296 279 +279 278 +592 506 +506 505 +598 398 +599 598 +575 546 +389 274 +569 446 +564 554 +622 564 +518 517 +534 518 +612 565 +359 343 +343 342 +516 439 +439 438 +609 568 +621 564 +622 621 +164 139 +354 337 +559 541 +541 540 +322 321 +321 306 +571 559 +118 117 +117 113 +495 459 +402 315 +579 556 +402 310 +160 158 +504 486 +206 157 +594 407 +535 519 +401 315 +402 401 +558 542 +559 558 +201 143 +563 553 +567 563 +334 318 +318 303 +292 273 +296 278 +354 338 +338 337 +316 314 +402 316 +620 610 +610 609 +542 525 +566 415 +595 566 +566 561 +157 119 +583 582 +582 550 +565 548 +548 547 +620 619 +619 564 +398 383 +599 398 +558 444 +444 443 +372 371 +416 372 +613 565 +532 515 +571 545 +475 458 +448 430 +459 406 +494 459 +573 572 +583 573 +479 462 +415 411 +560 415 +611 565 +617 607 +607 606 +520 519 +535 520 +292 274 +274 273 +568 565 +565 547 +412 358 +413 412 +301 300 +304 301 +589 578 +578 577 +556 546 +578 556 +586 584 +584 549 +413 372 +416 413 +165 140 +166 165 +556 499 +205 157 +595 415 +319 303 +153 129 +154 153 +542 541 +559 542 +592 505 +505 503 +575 573 +340 339 +355 340 +457 143 +578 546 +359 342 +584 573 +388 387 +387 372 +588 549 +456 144 +504 487 +487 486 +536 535 +535 409 +569 447 +447 446 +594 590 +590 557 +371 370 +416 371 +595 561 +200 143 +580 570 +593 580 +568 563 +608 568 +445 444 +558 445 +579 578 +589 579 +455 454 +469 455 +555 407 +594 555 +619 552 +590 589 +589 557 +360 344 +344 343 +404 399 +399 292 +589 577 +551 345 +499 484 +500 499 +283 282 +297 283 +356 340 +405 400 +406 405 +202 143 +166 135 +448 431 +431 430 +471 455 +484 483 +500 484 +552 545 +564 552 +595 580 +415 410 +598 412 +457 144 +593 559 +559 539 +564 545 +553 551 +567 553 +302 271 +591 561 +516 410 +288 271 +302 288 +425 152 +476 460 +161 136 +162 161 +599 388 +602 551 +551 412 +404 302 +433 418 +434 433 +458 457 +473 458 +360 343 +353 337 +334 333 +333 318 +557 555 +594 557 +589 588 +588 557 +480 466 +466 464 +603 434 +387 371 +404 288 +320 319 +319 305 +617 616 +616 552 +333 317 +203 143 +587 549 +588 587 +536 520 +470 469 +469 454 +512 474 +474 473 +683 666 +666 665 +174 173 +173 172 +221 184 +183 182 +182 181 +673 148 +187 169 +194 180 +323 284 +270 269 +269 262 +393 339 +389 273 +197 168 +355 354 +379 355 +504 502 +556 504 +196 195 +195 167 +199 170 +354 353 +380 354 +598 351 +673 147 +672 456 +456 146 +510 400 +396 395 +395 338 +404 98 +204 203 +203 176 +597 280 +496 458 +514 423 +423 210 +553 342 +378 355 +379 378 +218 190 +496 481 +481 457 +211 210 +210 182 +211 182 +543 443 +443 442 +302 301 +305 302 +561 550 +582 561 +200 199 +199 171 +200 171 +379 354 +380 379 +670 107 +107 91 +210 208 +438 423 +515 438 +496 457 +298 297 +309 298 +325 324 +324 282 +380 353 +381 380 +322 286 +358 357 +376 358 +392 342 +553 392 +208 207 +207 179 +208 179 +394 393 +393 340 +320 287 +547 320 +297 281 +311 297 +213 192 +192 185 +212 192 +602 435 +435 433 +215 187 +187 186 +390 273 +548 333 +215 186 +397 337 +198 196 +402 311 +311 281 +217 212 +212 185 +217 185 +219 193 +193 188 +214 193 +480 405 +601 480 +376 375 +375 358 +596 280 +599 597 +597 413 +548 334 +334 319 +500 498 +498 469 +597 404 +396 338 +627 484 +353 336 +381 353 +531 432 +432 422 +357 356 +377 357 +325 282 +382 381 +381 336 +398 351 +351 337 +510 476 +476 475 +325 283 +548 319 +322 284 +416 336 +652 633 +436 409 +532 436 +601 466 +531 422 +500 469 +398 337 +327 280 +603 433 +553 391 +323 283 +547 319 +602 433 +603 602 +551 344 +592 504 +322 285 +215 189 +216 215 +377 356 +378 377 +326 280 +356 355 +378 356 +516 438 +598 346 +326 282 +543 542 +542 443 +309 297 +311 309 +222 214 +214 187 +396 339 +222 187 +413 358 +544 543 +543 442 +601 465 +551 346 +598 551 +394 340 +497 473 +473 472 +515 423 +305 301 +581 561 +582 581 +397 338 +558 443 +510 475 +475 474 +304 300 +306 304 +321 286 +416 382 +382 336 +532 531 +531 436 +394 341 +401 302 +554 499 +499 469 +402 281 +210 207 +376 357 +377 376 +308 298 +309 308 +512 473 +472 457 +457 456 +190 185 +185 177 +699 668 +241 234 +234 231 +239 238 +238 223 +243 234 +241 231 +246 241 +220 184 +249 248 +248 225 +712 688 +250 249 +249 225 +250 225 +251 250 +250 227 +90 77 +77 76 +252 227 +253 228 +473 457 +255 230 +234 233 +233 231 +648 626 +257 232 +663 660 +660 152 +258 233 +720 719 +719 716 +259 235 +189 181 +261 237 +237 223 +247 237 +634 524 +635 524 +248 224 +250 226 +252 251 +251 227 +253 252 +252 228 +719 717 +717 716 +254 229 +655 639 +257 256 +256 232 +697 689 +260 236 +630 411 +642 630 +263 262 +262 241 +263 241 +267 238 +243 241 +262 243 +635 634 +654 635 +629 628 +628 488 +257 233 +258 257 +260 258 +628 487 +656 639 +654 634 +647 627 +530 441 +441 440 +111 85 +85 84 +636 634 +634 525 +652 636 +636 633 +270 238 +269 243 +711 688 +688 672 +641 411 +156 132 +209 181 +692 670 +670 91 +113 109 +665 663 +663 425 +711 672 +498 472 +472 471 +710 667 +25 3 +3 2 +704 693 +693 689 +482 249 +668 661 +661 149 +714 692 +718 717 +719 718 +674 667 +667 662 +705 693 +702 662 +720 687 +687 683 +112 84 +84 83 +729 669 +705 681 +202 173 +709 708 +710 709 +245 224 +736 735 +735 703 +707 681 +150 149 +149 126 +62 57 +57 31 +679 669 +669 152 +90 76 +648 632 +632 626 +649 632 +708 678 +669 151 +511 510 +510 474 +736 702 +707 678 +712 707 +707 706 +240 228 +228 227 +165 160 +149 148 +148 125 +544 441 +210 157 +92 91 +91 63 +688 684 +684 455 +691 664 +711 707 +712 711 +136 124 +124 123 +735 704 +704 703 +233 232 +232 231 +713 712 +712 706 +112 110 +110 84 +717 664 +696 684 +714 696 +86 82 +82 72 +498 497 +497 472 +710 708 +711 710 +390 389 +389 374 +737 725 +725 724 +50 19 +714 684 +726 663 +725 663 +717 691 +688 455 +710 672 +692 691 +691 670 +449 97 +729 699 +699 669 +694 666 +698 695 +695 690 +737 724 +736 703 +703 702 +450 97 +711 708 +708 707 +62 31 +31 25 +721 687 +706 681 +242 228 +725 665 +117 109 +514 211 +211 46 +514 46 +25 4 +4 3 +27 10 +10 9 +156 155 +155 132 +214 188 +188 187 +512 511 +511 474 +31 4 +696 692 +692 91 +31 5 +5 4 +33 6 +36 11 +36 10 +40 39 +39 17 +211 50 +50 46 +478 477 +477 461 +477 462 +462 461 +49 48 +48 15 +48 14 +52 51 +51 22 +52 22 +53 44 +44 5 +163 161 +54 34 +34 8 +54 8 +103 102 +102 74 +478 460 +478 461 +461 460 +50 40 +40 18 +50 18 +253 45 +252 45 +45 43 +704 689 +211 40 +528 257 +260 257 +650 632 +650 631 +61 60 +60 59 +60 58 +544 442 +442 441 +195 32 +211 195 +195 39 +195 35 +600 401 +548 401 +596 548 +116 111 +687 666 +290 272 +290 273 +273 272 +294 276 +294 277 +277 276 +361 344 +361 345 +345 344 +327 326 +326 310 +326 311 +311 310 +657 641 +641 637 +289 271 +289 272 +272 271 +301 285 +301 286 +286 285 +500 482 +500 483 +483 482 +332 331 +331 316 +332 316 +316 315 +51 47 +47 21 +51 21 +512 495 +512 496 +496 495 +511 494 +511 495 +495 494 +663 152 +49 37 +49 35 +83 65 +65 63 +218 217 +217 190 +65 64 +64 63 +90 81 +81 77 +96 95 +95 67 +508 507 +507 491 +507 492 +492 491 +105 104 +104 76 +105 76 +106 105 +105 78 +268 264 +386 370 +386 369 +97 96 +96 68 +100 99 +99 71 +202 201 +201 173 +104 103 +103 75 +113 112 +112 80 +112 83 +83 80 +114 108 +108 86 +108 82 +439 421 +422 421 +436 422 +538 521 +538 522 +522 521 +389 388 +388 373 +388 372 +431 103 +430 103 +452 92 +94 92 +397 395 +395 381 +395 380 +521 410 +521 411 +411 410 +398 397 +397 382 +397 381 +543 526 +543 527 +527 526 +414 409 +89 70 +70 69 +544 527 +544 528 +528 527 +586 574 +586 575 +575 574 +443 426 +442 426 +426 425 +537 520 +537 521 +521 520 +417 413 +413 100 +118 81 +117 81 +429 104 +106 104 +133 132 +132 131 +139 135 +135 131 +139 131 +131 130 +456 145 +504 503 +503 487 +503 488 +488 487 +152 151 +151 128 +151 127 +593 536 +536 409 +155 131 +625 603 +615 603 +603 569 +146 145 +145 122 +145 121 +559 545 +558 545 +466 465 +465 449 +465 450 +450 449 +159 158 +158 139 +159 139 +139 137 +160 159 +159 142 +159 137 +441 423 +441 424 +424 423 +624 623 +623 601 +623 554 +637 521 +637 411 +468 451 +465 451 +451 450 +425 153 +444 427 +443 427 +427 426 +407 403 +403 400 +406 400 +442 424 +442 425 +425 424 +293 276 +291 276 +276 275 +596 332 +596 331 +472 456 +471 456 +456 455 +498 482 +497 482 +482 481 +199 196 +199 143 +196 143 +468 467 +467 452 +468 452 +452 451 +204 157 +203 157 +157 143 +321 320 +320 304 +320 305 +305 304 +156 154 +156 153 +603 448 +569 448 +448 447 +194 184 +184 181 +632 631 +631 261 +218 216 +628 486 +498 471 +471 469 +632 261 +261 247 +211 167 +211 183 +183 167 +199 198 +198 170 +203 202 +202 175 +202 174 +659 653 +653 643 +219 218 +218 191 +219 191 +308 307 +307 299 +308 299 +299 298 +197 196 +196 168 +30 28 +28 24 +307 306 +306 300 +307 300 +300 299 +207 157 +481 33 +553 343 +551 343 +391 272 +390 272 +667 661 +86 72 +72 71 +237 236 +236 235 +270 267 +630 403 +256 255 +255 232 +255 231 +636 525 +659 658 +658 657 +157 156 +156 133 +88 76 +76 75 +268 265 +255 254 +254 230 +261 260 +260 237 +718 664 +530 440 +654 653 +656 654 +656 655 +655 654 +653 652 +652 650 +652 651 +651 650 +254 41 +640 522 +26 9 +9 8 +58 56 +683 426 +669 668 +668 150 +668 149 +734 723 +734 724 +724 723 +729 679 +700 668 +700 661 +113 110 +27 9 +673 672 +672 146 +638 403 +702 676 +676 662 +678 674 +676 674 +674 662 +703 689 +721 694 +694 687 +23 22 +22 13 +23 13 +13 12 +636 261 +22 21 +21 13 +21 20 +20 13 +736 698 +736 695 +42 1 +42 24 +24 1 +27 12 +12 11 +27 11 +11 10 +568 553 +568 547 +250 33 +250 53 +53 33 +37 35 +35 11 +37 11 +649 648 +648 644 +245 240 +240 226 +240 227 +227 226 +246 229 +246 230 +230 229 +85 66 +84 66 +66 65 +595 593 +593 415 +593 409 +640 523 +635 523 +95 94 +94 67 +94 66 +45 41 +41 1 +45 1 +447 429 +447 430 +430 429 +116 115 +115 89 +115 87 +115 114 +114 87 +114 86 +116 85 +116 89 +89 85 +644 630 +644 638 +638 630 +696 453 +696 91 +89 87 +87 70 +87 71 +71 70 +148 147 +147 124 +147 123 +728 679 +727 679 +679 660 +99 98 +98 70 +99 70 +163 136 +163 138 +138 136 +502 486 +501 486 +486 485 +544 530 +530 528 +530 513 +406 401 +406 404 +404 401 +438 432 +440 438 +440 423 +601 405 +600 405 +405 401 +28 25 +25 2 +183 181 +189 183 +201 200 +200 173 +200 172 +221 216 +216 189 +221 189 +189 184 +531 529 +529 432 +529 440 +440 432 +601 554 +554 468 +601 468 +468 465 +530 529 +529 513 +529 514 +514 513 +547 271 +547 287 +287 271 +29 26 +26 7 +29 7 +7 6 +697 678 +678 676 +653 634 +652 634 +88 74 +88 75 +75 74 +264 263 +263 242 +263 246 +246 242 +266 265 +265 245 +265 240 +265 264 +264 240 +264 242 +242 240 +268 266 +266 244 +266 245 +245 244 +528 260 +527 260 +735 716 +716 715 +735 715 +715 704 +138 124 +138 125 +125 124 +31 29 +29 5 +29 6 +6 5 +255 41 +255 42 +42 41 +645 638 +645 629 +727 660 +726 660 +723 677 +735 698 +733 698 +698 690 +715 714 +714 705 +715 705 +705 704 +185 178 +178 177 +732 730 +730 686 +730 680 +483 249 +483 248 +142 125 +142 126 +126 125 +89 68 +89 69 +69 68 +724 666 +723 666 +186 169 +169 167 +169 168 +168 167 +734 733 +733 690 +734 690 +690 682 +733 723 +723 722 +733 722 +722 716 +714 713 +713 705 +713 706 +706 705 +716 691 +715 691 +720 683 +719 683 +683 671 +165 158 +82 74 +74 73 +82 73 +73 72 +719 671 +718 671 +671 670 +701 662 +700 662 +662 661 +737 726 +726 725 +155 154 +154 130 +155 130 +696 454 +684 454 +732 686 +731 686 +686 685 +209 208 +208 180 +209 180 +722 721 +721 720 +722 720 +720 716 +39 38 +38 17 +38 16 +54 9 +36 9 +222 218 +392 391 +391 375 +392 375 +602 412 +435 412 +437 435 +133 131 +135 133 +135 119 +137 130 +130 127 +130 129 +129 127 +151 150 +150 126 +151 126 +163 160 +160 138 +160 142 +142 138 +556 554 +564 556 +564 546 +391 390 +390 375 +390 374 +198 197 +197 169 +198 169 +628 627 +627 485 +628 485 +703 676 +703 697 +697 676 +205 204 +204 176 +205 176 +207 206 +206 178 +207 178 +220 194 +213 194 +194 192 +709 674 +709 667 +248 247 +247 223 +248 223 +651 631 +651 633 +633 631 +259 258 +258 235 +258 234 +659 657 +657 656 +659 656 +656 653 +649 644 +644 643 +659 642 +658 642 +642 641 +646 629 +646 628 +210 156 +657 639 +657 637 +713 688 +713 684 +141 121 +140 121 +121 120 +423 156 +528 513 +513 257 +513 256 +732 728 +730 728 +728 727 +28 1 +28 2 +2 1 +722 677 +721 677 +729 728 +732 729 +732 699 +141 123 +123 121 +123 122 +122 121 +636 526 +636 527 +527 261 +62 59 +59 58 +62 58 +58 57 +55 14 +55 13 +62 25 +59 25 +513 46 +256 46 +648 647 +647 645 +648 645 +645 644 +655 640 +654 640 +640 635 +165 162 +162 141 +165 141 +141 140 +189 186 +186 183 +186 167 +206 205 +205 177 +206 177 +256 52 +255 52 +52 42 +697 693 +693 681 +697 681 +681 678 +244 224 +238 224 +224 223 +732 731 +731 701 +737 675 +730 675 +270 262 +268 262 +192 178 +192 179 +179 178 +166 158 +166 164 +164 158 +686 682 +695 685 +690 685 +685 682 +737 730 +730 727 +737 727 +727 726 +60 26 +60 27 +27 26 +222 215 +218 215 +270 268 +268 244 +270 244 +244 238 +237 235 +239 237 +239 223 +243 239 +239 235 +243 235 +235 234 +653 650 +650 643 +650 649 +649 643 +732 701 +701 699 +701 700 +700 699 +221 217 +217 216 +220 213 +213 212 +424 153 +423 153 +737 734 +734 675 +734 682 +682 675 +686 680 +682 680 +680 675 +245 226 +226 225 +245 225 +225 224 +269 267 +267 239 +269 239 +221 220 +220 212 +221 212 +1 2 31 Face Edge Indices Starting from 1 +2161 3 4 +1709 2105 5 +6 1683 1035 +388 7 8 +9 10 61 +11 419 744 +12 50 1126 +16 13 14 +59 15 16 +17 18 55 +899 1052 19 +11 1569 20 +21 22 47 +63 23 24 +25 26 1842 +27 28 25 +29 30 366 +2027 31 1067 +1747 32 33 +33 1362 1320 +9 34 35 +36 37 67 +13 38 39 +40 41 37 +949 42 43 +44 45 1742 +46 47 48 +48 49 40 +50 360 952 +130 51 1609 +52 1801 1351 +53 54 682 +55 56 496 +57 58 1408 +35 59 60 +17 1111 61 +62 686 890 +1992 63 64 +65 66 12 +67 68 1815 +1821 171 69 +1313 70 71 +72 73 312 +1933 79 74 +1501 329 75 +1463 76 685 +289 77 178 +78 79 76 +80 1487 81 +82 778 83 +84 350 1740 +85 86 1016 +87 262 237 +88 200 89 +90 91 215 +92 981 1007 +1393 93 464 +561 1080 94 +21 1471 95 +96 2083 2119 +97 98 1017 +347 99 127 +102 100 101 +1428 123 102 +103 1541 377 +1382 689 104 +105 106 817 +994 107 108 +1315 101 109 +460 110 628 +1475 111 109 +719 630 112 +1814 293 113 +160 538 114 +115 116 2188 +117 1535 118 +1272 223 119 +120 379 121 +1246 1882 122 +1441 1460 123 +124 125 1175 +126 127 811 +49 2050 128 +1784 129 130 +118 131 128 +132 228 133 +53 1819 134 +249 135 136 +19 137 138 +2179 139 134 +195 140 141 +1810 2155 142 +143 1009 1997 +144 145 142 +511 146 147 +148 149 62 +43 150 7 +151 152 1958 +1034 153 746 +1968 241 154 +155 797 156 +157 320 158 +159 180 160 +161 207 302 +100 341 162 +165 163 164 +1965 1344 165 +166 731 167 +168 1515 169 +1930 164 170 +171 2208 172 +173 828 174 +177 175 176 +1735 318 177 +1691 178 179 +180 636 648 +1054 181 182 +183 184 218 +1513 1745 185 +1131 186 273 +234 257 187 +508 188 189 +8 190 433 +112 191 192 +1528 193 194 +195 998 196 +197 1265 198 +307 895 199 +200 348 126 +1759 201 1509 +1174 1507 202 +203 264 161 +868 204 205 +206 351 207 +247 469 208 +321 209 445 +210 796 833 +1853 1473 211 +227 212 213 +214 215 1780 +1212 256 216 +217 218 520 +282 219 220 +271 725 221 +222 223 2115 +224 1626 1159 +238 225 226 +1729 240 227 +228 427 229 +230 231 105 +232 254 225 +205 233 234 +235 854 236 +237 266 238 +1462 323 239 +1075 240 216 +241 1442 1829 +242 243 484 +1456 2177 244 +77 245 246 +247 209 248 +1737 213 249 +344 1680 250 +428 251 337 +252 617 865 +253 83 254 +202 255 256 +257 1678 75 +258 352 259 +781 260 482 +261 1500 262 +263 99 264 +265 372 837 +167 266 267 +2048 268 117 +253 298 269 +270 940 271 +272 944 273 +196 274 275 +1051 194 276 +277 278 335 +1690 1920 279 +500 280 588 +779 333 281 +675 282 283 +284 162 1259 +285 286 359 +1445 1477 287 +279 288 289 +168 1089 290 +291 357 1732 +292 1828 1233 +293 1525 294 +295 784 764 +843 296 664 +2117 297 1302 +298 1091 299 +300 301 326 +302 303 250 +714 304 502 +305 306 635 +1628 307 308 +1191 309 598 +640 991 310 +426 346 311 +468 572 312 +798 313 242 +488 314 305 +315 1490 316 +1004 288 317 +318 172 1482 +319 65 1289 +622 320 321 +1058 322 169 +323 324 316 +1524 244 325 +634 326 583 +327 328 144 +261 281 329 +758 330 331 +671 332 330 +82 1043 333 +830 1521 334 +825 230 335 +336 1503 337 +107 338 339 +576 769 340 +1459 292 341 +342 541 1033 +345 343 88 +334 344 345 +158 346 72 +206 347 348 +349 291 350 +303 351 343 +106 999 352 +338 353 354 +1157 527 355 +356 703 357 +358 170 1783 +359 308 732 +1990 360 2100 +1352 361 2067 +362 363 1840 +364 745 365 +366 2200 1817 +367 1536 1331 +368 1875 369 +370 1543 371 +1060 372 373 +620 722 374 +375 1273 1941 +378 376 377 +1540 383 378 +379 404 132 +380 1617 1858 +672 381 382 +387 383 1844 +1613 384 385 +1852 386 387 +400 639 388 +28 1559 389 +274 390 183 +1996 395 391 +392 924 393 +396 394 395 +1600 1884 396 +1749 434 397 +643 923 398 +2024 401 399 +400 401 437 +2167 402 403 +251 404 405 +1940 1565 406 +1850 416 407 +1551 408 1763 +1769 409 410 +407 1693 411 +475 789 412 +364 1554 413 +414 398 415 +416 471 1665 +417 718 418 +419 421 420 +1068 421 1367 +422 415 392 +423 624 592 +424 110 425 +734 540 426 +219 427 428 +446 208 429 +430 431 1421 +113 1448 432 +399 433 434 +1424 435 1053 +1087 436 673 +2022 1466 437 +521 556 438 +661 439 440 +441 147 184 +528 442 365 +1572 443 444 +451 445 446 +382 1449 447 +371 497 448 +449 450 465 +451 121 623 +567 452 453 +210 243 454 +455 252 306 +456 818 491 +457 919 776 +458 677 459 +1658 460 300 +461 532 569 +462 489 463 +464 586 465 +466 467 638 +468 342 469 +486 759 470 +1544 615 471 +472 1584 179 +473 823 441 +192 986 474 +967 565 475 +476 485 783 +477 549 478 +479 480 309 +656 866 481 +199 482 483 +156 484 832 +229 958 485 +495 1452 486 +487 931 488 +2059 489 603 +490 666 491 +853 480 492 +507 1469 493 +494 452 1423 +1896 493 495 +1434 496 85 +497 1615 498 +499 612 500 +501 2002 1734 +502 503 902 +873 385 504 +936 1124 505 +537 159 506 +856 712 507 +1614 508 1560 +374 509 510 +552 355 511 +512 1925 513 +570 514 1049 +1130 1898 515 +516 727 517 +1002 518 662 +660 602 519 +520 146 526 +521 522 1598 +1915 523 513 +524 525 457 +526 527 1636 +528 420 529 +530 978 531 +532 533 614 +534 535 439 +536 577 537 +1037 538 539 +73 540 541 +542 658 543 +544 545 604 +546 547 2194 +548 2 1669 +549 550 1633 +551 975 552 +1980 553 1321 +463 554 555 +589 1573 556 +557 1001 558 +559 384 716 +560 1366 472 +186 561 562 +563 945 647 +705 564 565 +593 587 566 +567 443 653 +531 1097 568 +569 903 974 +1038 570 654 +470 331 571 +572 248 157 +514 573 574 +575 423 576 +651 637 577 +578 564 509 +610 594 579 +997 580 749 +609 554 581 +582 548 642 +583 584 313 +585 882 586 +587 260 588 +519 462 589 +795 590 515 +591 592 478 +733 483 593 +594 595 461 +596 597 1153 +598 599 525 +600 340 601 +602 568 603 +604 605 517 +606 607 476 +608 1145 609 +616 610 611 +649 1546 612 +120 429 613 +915 993 614 +1414 615 1558 +605 1557 616 +617 473 750 +618 883 606 +910 619 620 +621 1040 641 +622 623 133 +1577 624 625 +626 543 845 +601 802 627 +851 628 629 +630 373 534 +655 631 632 +633 1660 634 +670 635 864 +1548 636 637 +638 492 858 +1465 1582 639 +571 640 641 +642 1667 643 +929 191 644 +516 611 645 +447 646 647 +539 648 649 +650 659 414 +566 1549 651 +652 653 1570 +1066 1588 654 +1210 436 655 +412 773 656 +645 657 658 +529 582 659 +559 530 660 +1670 644 661 +662 663 763 +664 665 314 +666 505 667 +668 174 1024 +669 487 670 +1113 671 672 +574 673 1164 +657 579 674 +675 676 872 +772 913 677 +678 679 652 +678 1862 680 +681 682 69 +1349 683 66 +1931 684 685 +686 687 2066 +680 688 689 +693 690 691 +692 693 2062 +2063 1651 694 +762 695 690 +2143 696 697 +698 699 700 +691 743 700 +1121 701 889 +1042 702 14 +703 943 1073 +1641 704 2127 +705 706 852 +707 724 708 +709 562 1082 +710 841 629 +2145 1879 711 +712 236 713 +714 880 715 +716 150 717 +718 719 881 +720 499 780 +721 790 722 +235 808 723 +724 725 886 +726 522 957 +727 542 1199 +2065 2034 728 +729 720 730 +731 204 937 +732 733 1798 +734 1127 735 +839 736 479 +737 810 458 +838 738 739 +740 741 1270 +704 742 743 +744 745 370 +711 746 747 +1964 1363 748 +749 750 390 +751 752 834 +1993 1342 753 +558 754 1605 +696 2168 755 +1621 799 756 +692 948 757 +758 759 860 +877 760 663 +757 761 762 +763 764 754 +187 765 766 +767 259 1101 +768 769 961 +770 960 771 +772 926 932 +773 721 774 +775 776 956 +777 1197 804 +778 779 827 +894 780 781 +782 846 783 +784 466 896 +766 1579 785 +140 786 393 +787 633 788 +789 578 790 +791 863 584 +792 793 901 +1168 794 795 +796 922 665 +797 788 798 +799 1649 2198 +1031 800 983 +801 802 768 +803 804 136 +599 805 770 +498 806 807 +857 1532 808 +1523 831 809 +810 879 925 +811 1508 1105 +1648 1652 812 +1026 813 1889 +814 887 2174 +815 730 459 +816 774 619 +817 809 818 +819 893 820 +918 1908 821 +822 964 823 +824 825 701 +354 826 1497 +226 827 87 +828 829 800 +830 89 831 +832 833 296 +892 834 627 +835 862 265 +917 836 837 +838 699 1696 +839 840 417 +841 842 871 +843 844 155 +845 674 846 +847 848 1193 +849 916 850 +851 791 301 +1201 852 523 +853 1642 805 +92 1195 854 +1705 855 1857 +856 506 857 +858 736 859 +381 860 1451 +861 535 862 +870 454 863 +864 865 580 +866 816 867 +868 869 826 +870 871 1826 +872 1179 873 +874 1196 875 +876 877 938 +878 900 879 +880 881 557 +882 850 883 +884 761 885 +2074 886 1205 +1694 2089 887 +888 835 836 +889 278 996 +890 728 891 +892 801 893 +224 894 895 +1606 896 503 +897 668 898 +698 959 899 +900 295 760 +676 901 94 +902 859 418 +903 904 1581 +905 474 989 +906 742 1625 +907 908 813 +909 910 1634 +911 912 786 +913 914 987 +915 544 916 +917 966 775 +1688 1062 918 +919 771 920 +921 455 922 +923 847 924 +925 876 926 +927 1005 928 +929 815 930 +931 955 844 +932 933 914 +934 935 982 +936 937 353 +988 938 518 +336 1183 939 +940 953 941 +942 299 943 +944 898 1166 +945 1672 946 +821 1562 947 +948 756 2197 +949 950 855 +951 928 1713 +952 1518 953 +954 962 955 +1845 956 920 +861 957 1591 +1184 958 976 +906 1215 959 +960 961 591 +467 2076 962 +963 551 964 +1929 322 965 +966 1190 524 +967 438 794 +968 965 969 +1666 970 148 +713 1139 971 +972 755 973 +1118 974 765 +975 976 2057 +1897 977 1204 +978 717 979 +980 1239 981 +283 982 792 +1137 735 983 +984 985 824 +986 930 987 +988 989 933 +332 990 991 +1703 992 42 +993 849 904 +994 969 977 +995 996 1699 +669 997 998 +999 231 985 +1000 947 1721 +1001 905 1002 +1003 867 909 +245 1004 1005 +1006 1007 1213 +1008 1009 129 +1010 1011 10 +2251 1012 1226 +1906 1013 1014 +32 71 1015 +1016 1999 1099 +1017 546 2097 +135 1018 1142 +1019 1020 2191 +1021 897 1088 +869 785 1022 +2001 2081 1023 +1024 1065 1025 +1026 708 1027 +1028 1029 501 +56 1063 1030 +1031 1077 1032 +1033 1136 782 +1015 1034 1877 +1035 1036 1797 +1037 563 1138 +1038 1039 1125 +189 1040 1883 +2090 1041 1042 +1043 1117 667 +723 1529 1044 +435 1045 1046 +793 1743 1047 +1048 1025 1049 +1050 15 1727 +1072 1051 1052 +1055 1053 1054 +1013 1717 1055 +1056 1057 1181 +1058 1189 1059 +1060 840 1061 +1064 1062 1063 +18 1910 1064 +1065 1032 1066 +1067 1068 1306 +1069 2041 181 +1070 1188 1071 +980 1044 1072 +1073 1173 1074 +1075 1076 1133 +1077 1128 1078 +803 1079 1198 +1080 1209 1081 +1082 1047 1083 +1086 1084 1085 +547 2042 1086 +1087 1088 1185 +1089 1928 1090 +1091 1106 1092 +1095 2234 1093 +1094 1108 1095 +1156 1096 1097 +1102 1098 1099 +1022 1392 1100 +1101 984 1120 +1161 1102 2171 +1103 829 1192 +2080 1104 1733 +1105 1106 1207 +1109 1107 1108 +1216 1539 1109 +1112 125 1110 +1111 1433 1112 +1113 1901 1114 +1081 1115 1116 +1117 1151 203 +1118 1119 618 +1120 1121 1141 +1122 1123 1149 +1124 188 1119 +1125 173 1177 +2084 1126 270 +1127 1135 1128 +1129 1130 1148 +1131 1163 1132 +1133 942 1140 +1134 1135 1200 +1136 1137 1150 +1194 1138 1139 +212 1140 1154 +842 1141 1155 +1142 349 1160 +607 1143 311 +1144 2104 1777 +1145 510 1146 +990 1114 1147 +1148 1575 1202 +941 1149 1206 +1592 1150 1103 +1165 1505 1151 +979 992 1152 +2054 1083 1153 +1154 356 1018 +995 1090 1155 +1156 1152 1157 +1504 939 1158 +1159 1027 737 +1160 1516 1079 +1161 1912 1162 +1163 1167 1164 +1165 269 1170 +1166 1048 1167 +1168 1071 706 +405 613 1169 +255 1170 1076 +1056 1171 1172 +1173 1092 1174 +1178 1175 1176 +573 1177 1021 +1178 1098 2210 +1179 1116 449 +1180 1181 1485 +1644 1147 1182 +1183 1169 1184 +1185 272 1203 +1186 1187 1389 +512 1188 1045 +875 1700 1189 +1190 1061 1191 +1586 1192 1039 +1193 1172 819 +1354 1194 1195 +1196 1738 1197 +1697 1198 290 +1199 1200 1143 +1201 1202 1146 +631 1203 709 +1204 1059 277 +1205 1206 317 +490 1207 232 +1069 1208 1084 +1209 1132 1210 +1211 1074 1212 +193 1213 1186 +1214 1215 1681 +1216 1217 38 +1218 1785 1407 +1224 1219 1220 +1221 1222 2218 +1219 1277 1223 +1224 362 1225 +1226 1706 2095 +1231 1227 1228 +1372 1229 1300 +1232 1230 1231 +2245 1258 1232 +1260 1233 1234 +1235 1236 1347 +1360 1262 1237 +431 197 1238 +1187 1239 1214 +363 1756 1240 +1220 1241 1242 +2160 1243 319 +1377 1283 1244 +1245 1246 1533 +1241 2108 1247 +2047 1248 1249 +1751 741 1250 +1914 1251 1707 +1715 1252 1254 +1253 2101 1254 +1295 1255 600 +1279 1256 1255 +2247 1228 1257 +1838 1234 1258 +1237 1259 1260 +1238 1261 1262 +1249 1263 1264 +1841 1766 1265 +214 2164 1266 +1244 1267 1268 +1269 1317 2180 +1750 1768 1270 +1271 297 1272 +1275 1273 1274 +1225 1943 1275 +1221 2249 1276 +1277 1274 1278 +1279 1288 1280 +1281 1282 286 +1283 1247 1284 +740 1285 2106 +1282 1286 1629 +1287 1266 1773 +1288 1936 1771 +1289 96 3 +1770 1290 1291 +104 1292 1293 +1294 1295 1757 +1296 1297 1144 +1298 1276 1752 +1299 1278 1020 +1300 1301 1310 +1510 1302 1662 +1761 1303 1619 +182 1304 1014 +1305 1306 1439 +1794 1307 679 +1308 1309 51 +1391 1310 1402 +1311 1312 1712 +2099 1336 1313 +1905 1314 1315 +1316 1317 1476 +44 1686 1318 +1319 1320 1787 +1321 1438 1385 +1322 1263 1323 +1324 1325 1803 +1983 1326 1316 +116 1327 2028 +1328 1329 2017 +1330 1331 1568 +1791 1332 1345 +1333 2181 1326 +1334 1010 1723 +1335 1390 1336 +2184 1955 1337 +1338 1339 1412 +1340 1420 1358 +1341 1342 2068 +1343 1344 1417 +122 1345 1346 +453 1347 1762 +1348 1349 1243 +1833 1350 1348 +1416 1351 1356 +1346 1352 1630 +1353 1354 1436 +115 29 1355 +1356 2183 1340 +1380 1357 1358 +1359 1360 1837 +1361 2070 402 +1362 1363 753 +1290 1892 1364 +1365 1741 1208 +1366 1367 103 +1368 1369 1401 +1404 1370 410 +1371 1357 1372 +1373 1374 697 +1339 1375 1376 +1242 1377 1378 +1379 1380 2013 +1381 1382 1330 +1370 1400 1383 +1384 1397 1385 +1386 1387 1748 +1388 1389 1311 +1390 1415 1391 +2079 1392 1393 +1411 1394 1395 +432 1396 36 +2011 1397 2124 +2032 1398 1399 +1422 1399 1308 +1264 1400 2015 +6 1301 1401 +1402 1796 70 +1305 1403 1404 +1405 394 621 +1406 1407 1332 +1806 1408 1495 +1409 1410 1979 +1789 2237 1411 +1355 1412 1413 +1647 1414 1405 +1371 1415 1416 +1417 1418 2156 +2045 1419 1328 +2014 1420 1333 +1359 1951 1421 +1395 1422 143 +807 1423 1307 +1426 1424 1425 +2158 1926 1426 +1314 1427 1428 +1429 1430 1795 +1303 1431 1432 +1176 1433 1434 +1435 1436 1006 +1418 1437 1427 +1438 1439 1872 +1440 1441 1437 +80 1442 74 +1831 315 1443 +1443 1444 1824 +1445 1446 95 +1425 1447 1448 +1468 1449 1450 +1450 1451 1452 +131 1453 1454 +1454 1455 41 +1456 1457 1458 +1458 1807 139 +154 1459 1460 +403 1461 973 +1462 1463 1464 +1464 1782 2051 +406 1465 1466 +971 646 1467 +1467 1468 1469 +1470 1471 1472 +1472 46 1396 +1261 1473 1474 +1474 1475 284 +1376 1476 1804 +1447 1477 1470 +1956 1478 1479 +1479 1284 1285 +1350 2225 1480 +1480 1481 1708 +175 1482 1483 +1483 1484 2151 +1364 1485 1486 +239 1487 78 +287 1488 1489 +1489 1490 268 +710 1491 1492 +1492 456 1493 +1859 1494 688 +1329 1495 1008 +1512 339 1496 +1496 1497 1498 +1676 267 1499 +1499 1500 1501 +934 220 1502 +1502 1503 1504 +263 1505 1506 +1506 1507 1508 +1509 1510 2122 +968 108 1511 +1511 1512 1513 +84 874 1514 +1514 1515 1516 +1684 1122 1517 +1517 1518 1519 +1520 1521 1522 +1522 1523 258 +1524 1525 1526 +1526 1812 1457 +1531 1435 1527 +1527 1528 1529 +114 1353 1530 +1530 1531 1532 +1533 970 1309 +328 1453 1534 +1534 1535 1830 +20 1536 1537 +1538 1539 1050 +1537 1540 1541 +1542 1543 1235 +1544 1545 389 +280 1546 1547 +1547 1548 1549 +1550 1551 1552 +1552 1236 413 +442 1553 1554 +1948 1764 1555 +533 595 1556 +1556 1557 545 +391 1558 1559 +397 1560 1561 +1562 1563 1334 +408 1564 1565 +448 1566 1567 +1567 1568 1569 +1864 1570 1571 +1571 1572 1386 +590 1573 1574 +1574 555 1575 +1611 477 1576 +1576 1577 1578 +93 1579 1580 +1580 1581 585 +950 1582 1583 +1583 1564 380 +411 1584 1585 +1585 376 386 +1594 1586 1587 +1587 1588 1078 +481 1612 1589 +1589 1590 1591 +626 1592 1593 +1593 1594 1134 +751 1171 1595 +1595 1596 1597 +504 1598 608 +1599 1600 1995 +1596 1180 1601 +1601 1602 1603 +304 715 1604 +1604 1605 1606 +1057 1607 1608 +1608 1609 1674 +1003 550 1610 +1610 1611 1612 +190 1613 1614 +806 1615 1616 +1616 1542 494 +650 1617 1618 +1618 1550 1553 +2060 1619 1620 +1621 1622 1623 +1623 1624 694 +1036 1625 1639 +907 1626 1627 +1627 1628 1629 +149 1630 1631 +1631 1632 687 +1847 1633 1634 +1432 1635 1620 +217 1636 1637 +1637 1638 275 +747 1639 1640 +1640 1641 2146 +820 1642 1643 +1643 954 141 +310 1644 1645 +1645 1646 1647 +1648 1649 1650 +1650 1651 1654 +2072 1652 1653 +1653 1654 23 +1900 1291 1655 +1655 1656 1657 +425 1658 1659 +1659 1660 1919 +1578 91 1661 +1661 1662 1590 +1922 1663 1664 +1664 1665 1646 +1675 1666 2235 +848 1667 1668 +1668 1669 1607 +729 1670 1671 +1671 536 1672 +1656 1486 1673 +1673 1674 1675 +166 1676 1677 +1677 1678 233 +767 1493 1679 +1679 1680 1520 +1312 1681 1682 +1682 1683 951 +1388 1684 1685 +1685 1686 276 +1104 1719 1687 +1687 1688 1689 +138 1028 1689 +1690 1691 1692 +1692 1693 1663 +1041 1694 1695 +1695 1696 1000 +777 1697 1698 +1698 1699 1700 +2033 1431 1701 +1701 1702 891 +1638 1703 1704 +1704 1705 911 +1706 1707 97 +1708 1709 1714 +1538 1710 2232 +1711 908 1286 +1712 1713 1123 +1714 1715 683 +1029 1488 1716 +1716 1717 1718 +1030 1719 1720 +702 1721 1722 +1722 1723 60 +1724 1725 222 +1726 1727 1728 +1728 34 1110 +1729 1730 1731 +1731 1732 1211 +1733 1734 1023 +681 1735 1736 +1737 1738 1739 +1739 1740 1730 +1741 814 2092 +1742 81 137 +963 1743 1744 +1744 935 1158 +2077 1745 1746 +1746 1498 1100 +2030 1325 1747 +1748 1749 368 +2216 1750 1751 +1019 1752 2248 +1753 440 1271 +1268 1754 1755 +1755 1756 1378 +2147 1757 752 +2109 1758 1759 +738 1760 1761 +1762 1763 1939 +1945 1952 1764 +1765 1766 1240 +1767 1768 1252 +1383 1322 1769 +1917 1923 1770 +1771 2112 1772 +1772 1773 1774 +2223 1775 1776 +1776 1777 1778 +1779 211 198 +1848 1780 625 +684 1781 1782 +2153 1783 163 +1 2019 1784 +361 1785 1786 +1786 1787 1341 +2007 2003 1788 +1788 1789 1790 +1880 2140 1791 +1218 2230 1792 +1792 1793 1319 +1381 1566 1794 +2209 1795 1781 +153 1796 1797 +1870 1798 1753 +1799 1800 1327 +1935 1801 1802 +1802 1803 1800 +1804 1269 2087 +1805 1806 1419 +1807 1808 1809 +1809 1810 54 +5 1297 1811 +1808 1812 1813 +1813 1814 1815 +1977 1338 1816 +1816 1817 1409 +1854 1971 1818 +1818 1819 1820 +1821 1822 1823 +1823 1824 1429 +822 921 1825 +1825 1826 596 +45 1230 1827 +1827 1828 1829 +1830 1831 1832 +1832 1822 145 +2113 1833 1834 +2244 1835 1836 +1836 1837 1838 +430 1944 1839 +1839 1840 1841 +1293 1842 1843 +1843 1844 367 +888 1845 1846 +1846 1847 726 +2166 1848 1849 +1849 575 1256 +1545 1850 1851 +1851 1852 26 +1853 1854 1855 +1855 2137 111 +422 912 1856 +1856 1857 1858 +1866 1859 1860 +1860 1861 1873 +1861 1862 1863 +1863 1864 369 +1292 1494 1865 +1865 1866 1867 +119 2114 1868 +1868 1869 1870 +246 2036 1871 +1871 1872 560 +1599 1873 1874 +1874 1875 1876 +748 1877 1878 +1878 1879 1374 +2134 1880 1881 +1881 1882 1974 +1883 1884 1885 +1885 1876 1561 +972 1461 1886 +1886 1887 1888 +707 1889 1890 +1890 1891 221 +1602 1892 1893 +1893 1894 2129 +1903 946 1895 +1895 1896 1897 +1898 1918 1899 +1899 1900 1070 +424 1901 1902 +1902 1903 1491 +1904 1905 2136 +1906 1251 1907 +1563 1908 1909 +1909 1910 1011 +1911 1912 1913 +1913 1914 1012 +1129 1915 1916 +1916 1917 1918 +1919 1920 1921 +1921 1922 1182 +1894 1923 1924 +1924 1925 1926 +185 597 1927 +1927 1928 1929 +1930 1931 1932 +1932 1933 1967 +1934 1935 2088 +1775 1936 1937 +1937 1294 1296 +2021 444 1938 +1938 1939 1940 +1950 1941 1942 +1942 1943 1944 +1954 1945 1946 +1946 1947 1835 +1947 1948 1949 +1949 1950 1951 +2213 1952 1953 +1953 1954 1955 +1603 1956 1957 +1957 1767 2149 +1958 1959 1960 +1960 1961 1375 +1373 1888 1962 +1962 1963 1964 +1440 1965 1966 +1966 1967 1968 +1779 1765 1969 +1969 1970 1971 +1869 2163 1972 +1972 1973 285 +2206 1974 1975 +1975 1245 1398 +2008 1976 2138 +151 1977 1978 +1978 1979 2004 +1980 1981 1982 +1982 1983 1961 +1984 1985 1217 +2038 1986 1987 +1987 1988 2241 +1318 1519 1989 +1989 1990 1227 +1963 2073 1991 +1991 1992 1993 +27 1867 1994 +1994 1995 1996 +1790 1997 1998 +1998 58 1976 +2173 1999 2000 +2000 2001 2002 +2003 2004 2005 +2005 2006 2239 +2007 2008 2009 +2009 2010 152 +1981 2011 2012 +2012 2013 2014 +1959 2015 2016 +2016 1403 553 +1248 2017 2018 +2018 2019 2025 +2020 812 1361 +2021 2022 2023 +2023 2024 1387 +1323 2025 2026 +2026 2027 409 +2229 2028 2029 +2029 2030 1793 +2031 2032 1394 +2033 2034 2035 +2035 1624 1635 +1384 2036 2037 +2037 927 1369 +2187 2038 2039 +2039 2040 30 +2041 2042 2043 +2043 98 1304 +2044 2045 2046 +2046 2047 2010 +1446 2048 2049 +2049 2050 22 +324 2051 2052 +2052 1430 1444 +1726 124 2053 +2054 2055 2056 +2056 1115 632 +1096 2057 2058 +2058 581 2059 +2060 1622 2061 +2061 2062 739 +24 2063 2064 +2064 2065 2066 +2067 2068 2069 +2069 64 1632 +1887 2070 2071 +2071 2072 2073 +2074 787 2075 +2075 2076 878 +2055 2077 2078 +2078 2079 450 +2080 2081 2082 +2082 86 1720 +2083 2084 2085 +2085 1891 1711 +1799 1413 2086 +2086 2087 2088 +2089 2090 2091 +2091 39 2175 +2092 2093 2094 +2094 2195 1085 +2233 2095 2096 +2096 2097 1093 +52 1335 2098 +2098 2099 1324 +2100 2101 2102 +2102 2186 1257 +1481 1778 2103 +2103 2104 2105 +1250 2106 2107 +2107 2108 2222 +2109 2110 2111 +2111 2112 1724 +2226 2113 2114 +1758 2115 2116 +2116 2117 201 +1973 4 2118 +2118 2119 1281 +2120 1760 1365 +1287 2110 2121 +2121 2122 90 +1229 1379 2123 +2123 2124 1368 +2170 2125 2126 +2126 2127 695 +2128 2120 1046 +1478 2129 2130 +2130 2131 1267 +1986 2132 2133 +2133 2134 2204 +1820 1736 2135 +2135 2136 2137 +2044 2138 2139 +2139 57 1805 +2140 2132 2141 +2141 2142 1406 +2125 2143 2144 +2144 2145 2146 +2147 1597 2148 +2148 2149 1811 +2150 2151 2152 +2152 2153 1343 +1455 327 2154 +2154 2155 68 +2150 2156 2157 +2157 1904 176 +2131 2158 2159 +2159 294 325 +2160 2161 2162 +2162 2163 1834 +1774 2164 2165 +2165 2166 1280 +2167 2168 2169 +2169 2170 884 +1907 2171 2172 +2172 2173 1718 +2174 2175 2176 +2176 1985 2093 +1754 2177 2178 +2178 2179 1970 +2180 2181 2182 +2182 2183 1934 +2215 2184 2185 +2185 2186 1222 +2187 2188 2227 +2203 2189 2190 +2190 2243 1988 +2212 2191 2192 +2192 375 1555 +1984 1094 2193 +2193 2194 2195 +2020 885 2196 +2196 2197 2198 +2202 2040 2199 +1410 2200 2201 +2201 2202 2006 +2203 2204 2205 +2205 2206 2031 +358 1484 2207 +2207 2208 2209 +2053 2210 2211 +2211 1162 1710 +2212 2213 2214 +2214 2215 1298 +2216 2220 2217 +2217 2218 1253 +2219 2220 2221 +2221 2222 1223 +1725 2223 2224 +2224 2225 2226 +2142 2227 2228 +2228 2229 2230 +2231 2232 1911 +2252 2233 2234 +1657 2235 2236 +2236 1702 2128 +2189 2237 2238 +2238 2239 2240 +2199 2241 2242 +2242 2243 2240 +2244 2245 2246 +2246 2247 1337 +2248 2249 2250 +2250 2219 1299 +2251 2252 2253 +2253 1107 2231 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/box.obj b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/box.obj new file mode 100644 index 0000000..1e1c785 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/box.obj @@ -0,0 +1,79 @@ +# ----------------- +# Start of obj file +g Box01 +mtllib box.mat +usemtl box +v -62.0579 -41.4791 0.0 +v 58.8424 -41.4791 0.0 +v -62.0579 22.1865 0.0 +v 58.8424 22.1865 0.0 +v -62.0579 -41.4791 39.8714 +v 58.8424 -41.4791 39.8714 +v -62.0579 22.1865 39.8714 +v 58.8424 22.1865 39.8714 + +vt 0.843206 0.405444 0.000499517 +vt 0.482802 0.71377 0.9995 +vt 0.478066 0.404023 0.000499636 +vt 0.482802 0.716612 0.9995 +vt 0.841627 0.688332 0.000499517 +vt 0.482013 0.981029 0.9995 +vt 0.480434 0.688332 0.000499636 +vt 0.485959 0.978188 0.9995 +vt 0.450102 0.00618343 0.000499547 +vt 0.45247 0.509304 0.000499547 +vt 0.000499517 0.512146 0.000499547 +vt 0.000499517 0.512146 0.000499547 +vt -0.0010791 0.00618302 0.000499547 +vt 0.450102 0.00618343 0.000499547 +vt 0.000499517 0.512009 0.9995 +vt 0.450891 0.510588 0.9995 +vt 0.45247 0.995237 0.9995 +vt 0.45247 0.996658 0.9995 +vt 0.000499636 0.9995 0.9995 +vt 0.000499517 0.51343 0.9995 +vt 0.478855 0.405444 0.000500023 +vt 0.841627 0.408286 0.000499576 +vt 0.83847 0.688332 0.000499576 +vt 0.83847 0.688332 0.000499576 +vt 0.477276 0.694016 0.000500023 +vt 0.478855 0.405444 0.000500023 +vt 0.482802 0.71377 0.9995 +vt 0.845574 0.71377 0.999501 +vt 0.844784 0.976767 0.999501 +vt 0.844784 0.976767 0.999501 +vt 0.482802 0.716612 0.9995 +vt 0.842417 0.710929 0.9995 +vt 0.843995 0.975346 0.9995 +vt 0.843995 0.975346 0.9995 +vt 0.478066 0.404023 0.000499636 +vt 0.841627 0.688332 0.000499517 + +vn 0.0 0.0 -1.0 +vn 0.0 0.0 -1.0 +vn 0.0 0.0 1.0 +vn 0.0 0.0 1.0 +vn 0.0 -1.0 0.0 +vn 0.0 -1.0 0.0 +vn 1.0 0.0 0.0 +vn 1.0 0.0 0.0 +vn 0.0 1.0 0.0 +vn 0.0 1.0 0.0 +vn -1.0 0.0 0.0 +vn -1.0 0.0 0.0 + +f 1/9/1 3/10/1 4/11/1 +f 4/12/2 2/13/2 1/14/2 +f 5/15/3 6/16/3 8/17/3 +f 8/18/4 7/19/4 5/20/4 +f 1/21/5 2/22/5 6/23/5 +f 6/24/6 5/25/6 1/26/6 +f 2/27/7 4/28/7 8/29/7 +f 8/30/8 6/6/8 2/2/8 +f 4/31/9 3/32/9 7/33/9 +f 7/34/10 8/8/10 4/4/10 +f 3/35/11 1/1/11 5/36/11 +f 5/5/12 7/7/12 3/3/12 + +# end of obj file +# --------------- diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/inkscape_star.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/inkscape_star.svg new file mode 100644 index 0000000..8d99449 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/inkscape_star.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_boolean.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_boolean.xml new file mode 100644 index 0000000..b426a64 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_boolean.xml @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + Default Texture + + + + + + + + + + + + + + + + + + + + + + + + + + Camera 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Light 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cube 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cube 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Boolean1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_cylinder.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_cylinder.xml new file mode 100644 index 0000000..a5c1198 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_cylinder.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + Default Texture + + + + + + + + + + + + + + + + + + + + + + + + + + Camera 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Light 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cylinder 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_group.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_group.xml new file mode 100644 index 0000000..5352bce --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_group.xml @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + Default Texture + + + + + + + + + + + + + + + + + + + + + + + + + + Camera 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Light 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Array of Cylinder 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cylinder 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cylinder 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + Cylinder 2 + + + + + + + + + + + Cylinder 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_sphere.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_sphere.xml new file mode 100644 index 0000000..81514fd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_sphere.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + Default Texture + + + + + + + + + + + + + + + + + + + + + + + + + + Camera 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Light 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sphere1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_tetrahedron.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_tetrahedron.xml new file mode 100644 index 0000000..5007bfd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/art_of_illusion/art_of_illusion_tetrahedron.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + Default Texture + + + + + + + + + + + + + + + + + + + + + + + + + + Camera 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Light 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetrahedron + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/combined.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/combined.xml new file mode 100644 index 0000000..f00fa61 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/combined.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/circle.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/circle.xml new file mode 100644 index 0000000..8682a90 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/circle.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/concatenate.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/concatenate.xml new file mode 100644 index 0000000..0a6223f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/concatenate.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/drill.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/drill.xml new file mode 100644 index 0000000..787befa --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/drill.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/extrude.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/extrude.xml new file mode 100644 index 0000000..0040fb3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/extrude.xml @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/bevel.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/bevel.svg new file mode 100644 index 0000000..a3d348f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/bevel.svg @@ -0,0 +1,705 @@ + + + + + + + + bevel.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + Layer 25, z:10.2 + + + + + Layer 26, z:10.6 + + + + + Layer 27, z:11.0 + + + + + Layer 28, z:11.4 + + + + + Layer 29, z:11.8 + + + + + Layer 30, z:12.2 + + + + + Layer 31, z:12.6 + + + + + Layer 32, z:13.0 + + + + + Layer 33, z:13.4 + + + + + Layer 34, z:13.8 + + + + + Layer 35, z:14.2 + + + + + Layer 36, z:14.6 + + + + + Layer 37, z:15.0 + + + + + Layer 38, z:15.4 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -49.2741 mm + Y: -148.9752 mm + Z: 0.0 mm + + + Max + X: 49.2741 mm + Y: 21.6669 mm + Z: 15.6 mm + + + Dimension + X: 98.5482 mm + Y: 170.6421 mm + Z: 15.6 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 39 + Volume: 262.5277 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -49.2741 mm + Y: -148.9752 mm + Z: 0.0 mm + + + Max + X: 49.2741 mm + Y: 21.6669 mm + Z: 15.6 mm + + + Dimension + X: 98.5482 mm + Y: 170.6421 mm + Z: 15.6 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 39 + Volume: 262.5277 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -49.2741 mm + Y: -148.9752 mm + Z: 0.0 mm + + + Max + X: 49.2741 mm + Y: 21.6669 mm + Z: 15.6 mm + + + Dimension + X: 98.5482 mm + Y: 170.6421 mm + Z: 15.6 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 39 + Volume: 262.5277 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/bevel.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/bevel.xml new file mode 100644 index 0000000..e93586a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/bevel.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/collar.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/collar.svg new file mode 100644 index 0000000..1af847c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/collar.svg @@ -0,0 +1,760 @@ + + + + + + + + collar.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + Layer 25, z:10.2 + + + + + Layer 26, z:10.6 + + + + + Layer 27, z:11.0 + + + + + Layer 28, z:11.4 + + + + + Layer 29, z:11.8 + + + + + Layer 30, z:12.2 + + + + + Layer 31, z:12.6 + + + + + Layer 32, z:13.0 + + + + + Layer 33, z:13.4 + + + + + Layer 34, z:13.8 + + + + + Layer 35, z:14.2 + + + + + Layer 36, z:14.6 + + + + + Layer 37, z:15.0 + + + + + Layer 38, z:15.4 + + + + + Layer 39, z:15.8 + + + + + Layer 40, z:16.2 + + + + + Layer 41, z:16.6 + + + + + Layer 42, z:17.0 + + + + + Layer 43, z:17.4 + + + + + Layer 44, z:17.8 + + + + + Layer 45, z:18.2 + + + + + Layer 46, z:18.6 + + + + + Layer 47, z:19.0 + + + + + Layer 48, z:19.4 + + + + + Layer 49, z:19.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 20.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 20.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 50 + Volume: 164.3011 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 20.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 20.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 50 + Volume: 164.3011 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 20.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 20.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 50 + Volume: 164.3011 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/collar.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/collar.xml new file mode 100644 index 0000000..c775fc3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/collar.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/gear.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/gear.svg new file mode 100644 index 0000000..7c39e00 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/gear.svg @@ -0,0 +1,635 @@ + + + + + + + + gear.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.0364 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.0364 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.0364 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/gear.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/gear.xml new file mode 100644 index 0000000..0843e61 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/gear.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/keyway.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/keyway.svg new file mode 100644 index 0000000..3210cf2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/keyway.svg @@ -0,0 +1,760 @@ + + + + + + + + keyway.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + Layer 25, z:10.2 + + + + + Layer 26, z:10.6 + + + + + Layer 27, z:11.0 + + + + + Layer 28, z:11.4 + + + + + Layer 29, z:11.8 + + + + + Layer 30, z:12.2 + + + + + Layer 31, z:12.6 + + + + + Layer 32, z:13.0 + + + + + Layer 33, z:13.4 + + + + + Layer 34, z:13.8 + + + + + Layer 35, z:14.2 + + + + + Layer 36, z:14.6 + + + + + Layer 37, z:15.0 + + + + + Layer 38, z:15.4 + + + + + Layer 39, z:15.8 + + + + + Layer 40, z:16.2 + + + + + Layer 41, z:16.6 + + + + + Layer 42, z:17.0 + + + + + Layer 43, z:17.4 + + + + + Layer 44, z:17.8 + + + + + Layer 45, z:18.2 + + + + + Layer 46, z:18.6 + + + + + Layer 47, z:19.0 + + + + + Layer 48, z:19.4 + + + + + Layer 49, z:19.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 20.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 20.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 50 + Volume: 164.533 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 20.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 20.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 50 + Volume: 164.533 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 20.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 20.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 50 + Volume: 164.533 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/keyway.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/keyway.xml new file mode 100644 index 0000000..0a780a8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/keyway.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack.svg new file mode 100644 index 0000000..5cd250c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack.svg @@ -0,0 +1,635 @@ + + + + + + + + rack.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -62.8319 mm + Y: -54.0 mm + Z: -0.0 mm + + + Max + X: 62.8319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 125.6637 mm + Y: 75.8248 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 55.6493 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -62.8319 mm + Y: -54.0 mm + Z: -0.0 mm + + + Max + X: 62.8319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 125.6637 mm + Y: 75.8248 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 55.6493 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -62.8319 mm + Y: -54.0 mm + Z: -0.0 mm + + + Max + X: 62.8319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 125.6637 mm + Y: 75.8248 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 55.6493 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack.xml new file mode 100644 index 0000000..2f01a1d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack_hole.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack_hole.svg new file mode 100644 index 0000000..022f523 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack_hole.svg @@ -0,0 +1,635 @@ + + + + + + + + rack_hole.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -62.8319 mm + Y: -64.0 mm + Z: -0.0 mm + + + Max + X: 62.8319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 125.6637 mm + Y: 85.8248 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 81.0238 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -62.8319 mm + Y: -64.0 mm + Z: -0.0 mm + + + Max + X: 62.8319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 125.6637 mm + Y: 85.8248 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 81.0238 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -62.8319 mm + Y: -64.0 mm + Z: -0.0 mm + + + Max + X: 62.8319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 125.6637 mm + Y: 85.8248 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 81.0238 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack_hole.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack_hole.xml new file mode 100644 index 0000000..43f719e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/rack_hole.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/ring.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/ring.svg new file mode 100644 index 0000000..6930208 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/ring.svg @@ -0,0 +1,700 @@ + + + + + + + + ring.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + Layer 25, z:10.2 + + + + + Layer 26, z:10.6 + + + + + Layer 27, z:11.0 + + + + + Layer 28, z:11.4 + + + + + Layer 29, z:11.8 + + + + + Layer 30, z:12.2 + + + + + Layer 31, z:12.6 + + + + + Layer 32, z:13.0 + + + + + Layer 33, z:13.4 + + + + + Layer 34, z:13.8 + + + + + Layer 35, z:14.2 + + + + + Layer 36, z:14.6 + + + + + Layer 37, z:15.0 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -73.4936 mm + Y: -191.9792 mm + Z: -0.0 mm + + + Max + X: 73.4936 mm + Y: 21.8248 mm + Z: 15.2 mm + + + Dimension + X: 146.9872 mm + Y: 213.804 mm + Z: 15.2 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 38 + Volume: 230.2172 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -73.4936 mm + Y: -191.9792 mm + Z: -0.0 mm + + + Max + X: 73.4936 mm + Y: 21.8248 mm + Z: 15.2 mm + + + Dimension + X: 146.9872 mm + Y: 213.804 mm + Z: 15.2 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 38 + Volume: 230.2172 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -73.4936 mm + Y: -191.9792 mm + Z: -0.0 mm + + + Max + X: 73.4936 mm + Y: 21.8248 mm + Z: 15.2 mm + + + Dimension + X: 146.9872 mm + Y: 213.804 mm + Z: 15.2 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 38 + Volume: 230.2172 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/ring.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/ring.xml new file mode 100644 index 0000000..1fb56af --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/ring.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft.svg new file mode 100644 index 0000000..fe01684 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft.svg @@ -0,0 +1,635 @@ + + + + + + + + shaft.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.8979 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.8979 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.8979 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft.xml new file mode 100644 index 0000000..fbaa52e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft_top.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft_top.svg new file mode 100644 index 0000000..203642f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft_top.svg @@ -0,0 +1,635 @@ + + + + + + + + shaft_top.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.1382 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.1382 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: -0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 10.0 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.1382 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft_top.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft_top.xml new file mode 100644 index 0000000..e5568e7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/shaft_top.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_helix.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_helix.svg new file mode 100644 index 0000000..6cd0d8b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_helix.svg @@ -0,0 +1,635 @@ + + + + + + + + spur_helix.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4346 mm + Y: -150.4247 mm + Z: -0.0 mm + + + Max + X: 50.4288 mm + Y: 22.1224 mm + Z: 10.0 mm + + + Dimension + X: 100.8635 mm + Y: 172.5471 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 150.9144 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4346 mm + Y: -150.4247 mm + Z: -0.0 mm + + + Max + X: 50.4288 mm + Y: 22.1224 mm + Z: 10.0 mm + + + Dimension + X: 100.8635 mm + Y: 172.5471 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 150.9144 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4346 mm + Y: -150.4247 mm + Z: -0.0 mm + + + Max + X: 50.4288 mm + Y: 22.1224 mm + Z: 10.0 mm + + + Dimension + X: 100.8635 mm + Y: 172.5471 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 150.9144 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_helix.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_helix.xml new file mode 100644 index 0000000..a0bc6d8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_helix.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_herringbone.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_herringbone.svg new file mode 100644 index 0000000..d4bd6df --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_herringbone.svg @@ -0,0 +1,635 @@ + + + + + + + + spur_herringbone.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4225 mm + Y: -150.4395 mm + Z: -0.0 mm + + + Max + X: 50.4306 mm + Y: 22.1224 mm + Z: 10.0 mm + + + Dimension + X: 100.8531 mm + Y: 172.5619 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 150.9346 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4225 mm + Y: -150.4395 mm + Z: -0.0 mm + + + Max + X: 50.4306 mm + Y: 22.1224 mm + Z: 10.0 mm + + + Dimension + X: 100.8531 mm + Y: 172.5619 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 150.9346 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4225 mm + Y: -150.4395 mm + Z: -0.0 mm + + + Max + X: 50.4306 mm + Y: 22.1224 mm + Z: 10.0 mm + + + Dimension + X: 100.8531 mm + Y: 172.5619 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 150.9346 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_herringbone.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_herringbone.xml new file mode 100644 index 0000000..ef8b8de --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_herringbone.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_parabolic.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_parabolic.svg new file mode 100644 index 0000000..de90249 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_parabolic.svg @@ -0,0 +1,635 @@ + + + + + + + + spur_parabolic.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + Layer 2, z:1.0 + + + + + Layer 3, z:1.4 + + + + + Layer 4, z:1.8 + + + + + Layer 5, z:2.2 + + + + + Layer 6, z:2.6 + + + + + Layer 7, z:3.0 + + + + + Layer 8, z:3.4 + + + + + Layer 9, z:3.8 + + + + + Layer 10, z:4.2 + + + + + Layer 11, z:4.6 + + + + + Layer 12, z:5.0 + + + + + Layer 13, z:5.4 + + + + + Layer 14, z:5.8 + + + + + Layer 15, z:6.2 + + + + + Layer 16, z:6.6 + + + + + Layer 17, z:7.0 + + + + + Layer 18, z:7.4 + + + + + Layer 19, z:7.8 + + + + + Layer 20, z:8.2 + + + + + Layer 21, z:8.6 + + + + + Layer 22, z:9.0 + + + + + Layer 23, z:9.4 + + + + + Layer 24, z:9.8 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4272 mm + Y: -150.3492 mm + Z: -0.0 mm + + + Max + X: 50.4412 mm + Y: 22.1077 mm + Z: 10.0 mm + + + Dimension + X: 100.8684 mm + Y: 172.4569 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.0364 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4272 mm + Y: -150.3492 mm + Z: -0.0 mm + + + Max + X: 50.4412 mm + Y: 22.1077 mm + Z: 10.0 mm + + + Dimension + X: 100.8684 mm + Y: 172.4569 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.0364 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4272 mm + Y: -150.3492 mm + Z: -0.0 mm + + + Max + X: 50.4412 mm + Y: 22.1077 mm + Z: 10.0 mm + + + Dimension + X: 100.8684 mm + Y: 172.4569 mm + Z: 10.0 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 25 + Volume: 151.0364 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_parabolic.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_parabolic.xml new file mode 100644 index 0000000..a0e8a4f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_parabolic.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_profile.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_profile.svg new file mode 100644 index 0000000..45ad13b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_profile.svg @@ -0,0 +1,521 @@ + + + + + + + + spur_profile.xml - Slice Layers + + + + + + Layer 0, z:0.2 + + + + + Layer 1, z:0.6 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: 0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 0.8 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 0.8 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 2 + Volume: 16.6701 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: 0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 0.8 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 0.8 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 2 + Volume: 16.6701 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -50.4319 mm + Y: -150.126 mm + Z: 0.0 mm + + + Max + X: 50.4319 mm + Y: 21.8248 mm + Z: 0.8 mm + + + Dimension + X: 100.8638 mm + Y: 171.9508 mm + Z: 0.8 mm + + + Statistics + Layer Thickness: 0.4 mm + Number of Layers: 2 + Volume: 16.6701 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_profile.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_profile.xml new file mode 100644 index 0000000..f616bf5 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/spur_profile.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/test_gear.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/test_gear.xml new file mode 100644 index 0000000..579bbd7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/gear/test_gear.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/grid.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/grid.xml new file mode 100644 index 0000000..c9333bd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/grid.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap.xml new file mode 100644 index 0000000..bc982d2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap_1.pgm b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap_1.pgm new file mode 100644 index 0000000..c8e23b4 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap_1.pgm @@ -0,0 +1,9 @@ +P1 +# CREATOR: GIMP PNM Filter Version 1.1 +3 2 +1 +0 +1 +1 +0 +1 \ No newline at end of file diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap_255.pgm b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap_255.pgm new file mode 100644 index 0000000..2425437 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/heightmap_255.pgm @@ -0,0 +1,201 @@ +P2 +# CREATOR: GIMP PNM Filter Version 1.1 +20 10 +255 +255 +255 +255 +255 +229 120 19 0 +0 +0 +0 +0 +0 +19 +120 +229 +255 +255 +255 +255 +255 +255 +255 +255 +197 +70 +0 +0 +0 +0 +0 +0 +0 +0 +70 +197 +255 +255 +255 +255 +255 +255 +255 +255 +140 +12 +0 +0 +0 +0 +0 +0 +0 +0 +12 +140 +255 +255 +255 +255 +255 +255 +255 +255 +128 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +128 +255 +255 +255 +255 +255 +255 +255 +255 +128 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +128 +255 +255 +255 +255 +255 +255 +255 +255 +179 +51 +0 +0 +0 +0 +0 +0 +0 +0 +51 +179 +255 +255 +255 +255 +255 +255 +255 +255 +217 +89 +0 +0 +0 +0 +0 +0 +0 +0 +89 +217 +255 +255 +255 +255 +255 +255 +255 +255 +249 +198 +77 +0 +0 +0 +0 +0 +0 +77 +198 +249 +255 +255 +255 +255 +255 +255 +255 +255 +255 +249 +198 +128 +51 +0 +0 +51 +128 +198 +249 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +255 +249 +236 +218 +205 +205 +218 +236 +249 +255 +255 +255 +255 +255 +255 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/lathe.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/lathe.xml new file mode 100644 index 0000000..8f1e5a2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/lathe.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/line.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/line.xml new file mode 100644 index 0000000..3c94c1e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/line.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/linear_bearing_cage.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/linear_bearing_cage.xml new file mode 100644 index 0000000..14b9ed9 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/linear_bearing_cage.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/lineation.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/lineation.xml new file mode 100644 index 0000000..9028433 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/lineation.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/mechaslab.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/mechaslab.xml new file mode 100644 index 0000000..e98cc66 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/mechaslab.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/peg.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/peg.xml new file mode 100644 index 0000000..8a6d296 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/peg.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/polygon.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/polygon.xml new file mode 100644 index 0000000..ac8bc0f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/polygon.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/shaft.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/shaft.xml new file mode 100644 index 0000000..443a122 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/shaft.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/square.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/square.xml new file mode 100644 index 0000000..a322f41 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/square.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/svg.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/svg.xml new file mode 100644 index 0000000..45f9961 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/svg.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/teardrop.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/teardrop.xml new file mode 100644 index 0000000..a3a2636 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/teardrop.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/text.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/text.xml new file mode 100644 index 0000000..9880fed --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/creation/text.xml @@ -0,0 +1,5 @@ + + + hi + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry.csv new file mode 100644 index 0000000..5d6b1a0 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry.csv @@ -0,0 +1,25 @@ +Format is tab separated boolean geometry. +Name Value +_object booleangeometry +version 2010-03-29 +_object trianglemesh +id tetrahedron + _object matrix4x4 + m11 0.0 + m13 1.0 + m21 -1.0 + m22 0.0 + m32 -1.0 + m33 0.0 + _table vertex + x y z + -5.0 2.89 + -5.77 + 5.0 2.89 + 8.66 + _table face + vertex0 vertex1 vertex2 + 3 0 1 + 3 1 2 + 3 2 0 + 0 2 1 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/arc.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/arc.xml new file mode 100644 index 0000000..2315b3d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/arc.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/cubic.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/cubic.xml new file mode 100644 index 0000000..bb38791 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/cubic.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/quadratic.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/quadratic.xml new file mode 100644 index 0000000..7364d9f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_tools/path_elements/quadratic.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate.xml new file mode 100644 index 0000000..cc0c948 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/creation.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/creation.xml new file mode 100644 index 0000000..3f8806c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/creation.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/document.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/document.xml new file mode 100644 index 0000000..2f2f299 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/document.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/setting.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/setting.xml new file mode 100644 index 0000000..39312cd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_elements/setting.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/dictionary.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/dictionary.xml new file mode 100644 index 0000000..8b072b0 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/dictionary.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/list.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/list.xml new file mode 100644 index 0000000..7efb1d3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/list.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/string.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/string.xml new file mode 100644 index 0000000..18da3be --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_enumerables/string.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/euclid.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/euclid.xml new file mode 100644 index 0000000..a1ba2b0 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/euclid.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/math.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/math.xml new file mode 100644 index 0000000..1540842 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/math.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/print.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/print.xml new file mode 100644 index 0000000..be2727c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/geometry_utilities/evaluate_fundamentals/print.xml @@ -0,0 +1,10 @@ + + + + + hello + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/rotate.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/rotate.xml new file mode 100644 index 0000000..4a5fe62 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/rotate.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/scale.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/scale.xml new file mode 100644 index 0000000..6ac9867 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/scale.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/transform.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/transform.xml new file mode 100644 index 0000000..e9e9a11 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/transform.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/translate.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/translate.xml new file mode 100644 index 0000000..f45587a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_matrix/translate.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/array.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/array.xml new file mode 100644 index 0000000..2a08f45 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/array.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/copy.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/copy.xml new file mode 100644 index 0000000..fafd795 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/copy.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/disjoin.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/disjoin.xml new file mode 100644 index 0000000..4abf001 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/disjoin.xml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/import.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/import.xml new file mode 100644 index 0000000..d197421 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/import.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/pathTest.svg b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/pathTest.svg new file mode 100644 index 0000000..370820e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/pathTest.svg @@ -0,0 +1,527 @@ + + + + + + + + write.xml - Slice Layers + + + + + + Layer 0, z:0.0 + + + + + Layer 1, z:5.0 + + + + + + + + + + + + + Latitude + < + > + Longitude + < + > + Scale + 1 + < + > + + Min + X: -9.0 mm + Y: -9.0 mm + Z: -1.5 mm + + + Max + X: 9.0 mm + Y: 15.0 mm + Z: 6.5 mm + + + Dimension + X: 18.0 mm + Y: 24.0 mm + Z: 8.0 mm + + + Statistics + Layer Thickness: 3.0 mm + Number of Layers: 2 + Volume: 0.33 cm3 + + + + + + + + Y + X + 0 + + + 1 + Layer + < + > + Scale + 1 + < + > + + Min + X: -9.0 mm + Y: -9.0 mm + Z: -1.5 mm + + + Max + X: 9.0 mm + Y: 15.0 mm + Z: 6.5 mm + + + Dimension + X: 18.0 mm + Y: 24.0 mm + Z: 8.0 mm + + + Statistics + Layer Thickness: 3.0 mm + Number of Layers: 2 + Volume: 0.33 cm3 + + + + + + + Y + X + Scale + : 1 + < + > + + Min + X: -9.0 mm + Y: -9.0 mm + Z: -1.5 mm + + + Max + X: 9.0 mm + Y: 15.0 mm + Z: 6.5 mm + + + Dimension + X: 18.0 mm + Y: 24.0 mm + Z: 8.0 mm + + + Statistics + Layer Thickness: 3.0 mm + Number of Layers: 2 + Volume: 0.33 cm3 + + + [Iso View] + Iso View + [Layer View] + Layer View + [Scroll View] + Scroll View + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/write.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/write.xml new file mode 100644 index 0000000..42bc509 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/write.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/writeTest.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/writeTest.xml new file mode 100644 index 0000000..7d15752 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/writeTest.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/writeTest_2.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/writeTest_2.xml new file mode 100644 index 0000000..7d15752 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_meta/writeTest_2.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/bevel.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/bevel.xml new file mode 100644 index 0000000..68ce115 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/bevel.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/convex.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/convex.xml new file mode 100644 index 0000000..185885c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/convex.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/inset.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/inset.xml new file mode 100644 index 0000000..e75b16d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/inset.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/outline.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/outline.xml new file mode 100644 index 0000000..0c73ec1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/outline.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/outset.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/outset.xml new file mode 100644 index 0000000..6788280 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/outset.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/overhang.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/overhang.xml new file mode 100644 index 0000000..17d9782 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/overhang.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/round.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/round.xml new file mode 100644 index 0000000..b2dffd3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/segment.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/segment.xml new file mode 100644 index 0000000..8c431f9 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/segment.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/wedge.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/wedge.xml new file mode 100644 index 0000000..577082a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_paths/wedge.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/bottom.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/bottom.xml new file mode 100644 index 0000000..85936f2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/bottom.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/equation.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/equation.xml new file mode 100644 index 0000000..7c5e763 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/equation.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_element.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_element.xml new file mode 100644 index 0000000..92c3d29 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_element.xml @@ -0,0 +1,6 @@ + + + hi + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_path.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_path.xml new file mode 100644 index 0000000..f733855 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_path.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_solid.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_solid.xml new file mode 100644 index 0000000..e3b9a25 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/flip/flip_solid.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_element.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_element.xml new file mode 100644 index 0000000..73373e2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_element.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_path.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_path.xml new file mode 100644 index 0000000..f41bf70 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_path.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_solid.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_solid.xml new file mode 100644 index 0000000..debaef4 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/manipulation_shapes/mirror/mirror_solid.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/slab.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/slab.xml new file mode 100644 index 0000000..e30dec7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/slab.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/cube.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/cube.xml new file mode 100644 index 0000000..0f89ca3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/cube.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/cylinder.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/cylinder.xml new file mode 100644 index 0000000..ca78e18 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/cylinder.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/difference.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/difference.xml new file mode 100644 index 0000000..0731d67 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/difference.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/sphere.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/sphere.xml new file mode 100644 index 0000000..0fab81c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/sphere.xml @@ -0,0 +1,4 @@ + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/union.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/union.xml new file mode 100644 index 0000000..7ca2f79 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/solids/union.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/class.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/class.xml new file mode 100644 index 0000000..857720f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/class.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/elif.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/elif.xml new file mode 100644 index 0000000..2d20e7a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/elif.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/else.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/else.xml new file mode 100644 index 0000000..4075942 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/else.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/for.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/for.xml new file mode 100644 index 0000000..b379827 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/for.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/function.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/function.xml new file mode 100644 index 0000000..2c71034 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/function.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/if.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/if.xml new file mode 100644 index 0000000..f338a6f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/if.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/print.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/print.xml new file mode 100644 index 0000000..6ce4bff --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/print.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/return.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/return.xml new file mode 100644 index 0000000..243a0d2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/return.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/statement.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/statement.xml new file mode 100644 index 0000000..413ccf3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/statement.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/while.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/while.xml new file mode 100644 index 0000000..810edad --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/statements/while.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/support_test_box.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/support_test_box.xml new file mode 100644 index 0000000..600c7d1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/support_test_box.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/tetra.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/tetra.xml new file mode 100644 index 0000000..1c07c14 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/tetra.xml @@ -0,0 +1,1330 @@ + + + + + + + + + + + + + + + + Default Texture + + + + + + + + + + + + + + + + + + + + + + + + + + Camera 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Light 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetrax20 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetray40 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetraz30 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetrax20y40 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetrax20z30 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetray40z30 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetrax20y40z30 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/tetrawedge.xml b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/tetrawedge.xml new file mode 100644 index 0000000..db79680 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/models/xml_models/tetrawedge.xml @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + Default Texture + + + + + + + + + + + + + + + + + + + + + + + + + + Camera 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + Light 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tetrawedge + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Position + + + + + + + + + + + + + + + + + + + + + + + + Weight + + Rotation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__init__.py new file mode 100644 index 0000000..bdac25d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 1 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__init__.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__init__.pyc new file mode 100644 index 0000000..8ecb581 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__init__.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__pycache__/.gitignore b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__pycache__/.gitignore new file mode 100644 index 0000000..a74b07a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/__pycache__/.gitignore @@ -0,0 +1 @@ +/*.pyc diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_cool_end.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_cool_end.gcode new file mode 100644 index 0000000..730c606 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_cool_end.gcode @@ -0,0 +1,2 @@ +(this is a sample cool end file, it must be renamed cool_end.gcode for skeinforge to recognize it) +M107 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_cool_start.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_cool_start.gcode new file mode 100644 index 0000000..90285c7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_cool_start.gcode @@ -0,0 +1,2 @@ +(this is a sample cool start file, it must be renamed cool_start.gcode for skeinforge to recognize it) +M106 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_end.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_end.gcode new file mode 100644 index 0000000..86dc43b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_end.gcode @@ -0,0 +1,2 @@ +(this is a sample gcode end file, it must be renamed end.gcode for skeinforge to recognize it) +M2 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_homing.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_homing.gcode new file mode 100644 index 0000000..a089a31 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_homing.gcode @@ -0,0 +1,5 @@ +(this is a sample gcode homing file, it must be renamed homing.gcode for skeinforge to recognize it) +G1 X-250.0 +G92 X0 ;set x 0 +G1 Y-250.0 +G92 Y0 ;set y 0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_replace.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_replace.csv new file mode 100644 index 0000000..dbcbd1b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_replace.csv @@ -0,0 +1,3 @@ +M101 +M103 + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_replace_M108.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_replace_M108.csv new file mode 100644 index 0000000..4cac815 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_replace_M108.csv @@ -0,0 +1,2 @@ +M108 S M108 P +M113 S M108 S diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_start.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_start.gcode new file mode 100644 index 0000000..6de5bc1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_start.gcode @@ -0,0 +1,2 @@ +(This is a sample gcode start file, it must be renamed start.gcode for skeinforge to recognize it. Also, to remove confusion this comment line should be deleted.) +G28 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_support_end.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_support_end.gcode new file mode 100644 index 0000000..63315e9 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_support_end.gcode @@ -0,0 +1,2 @@ +(this is a sample support end file, it must be renamed support_end.gcode for skeinforge to recognize it) + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_support_start.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_support_start.gcode new file mode 100644 index 0000000..04392f0 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/alterations/example_support_start.gcode @@ -0,0 +1,2 @@ +(this is a sample support start file, it must be renamed support_start.gcode for skeinforge to recognize it) + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/end.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/end.gcode new file mode 100644 index 0000000..36fc223 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/end.gcode @@ -0,0 +1,18 @@ +(**** Beginning of end.gcode ****) +(**** begin move to cooling position ****) +G1 X0.0 F1000.0 (move to cooling position) +G1 X0.0 Y45.0 F1000.0 (move to cooling position) +G162 Z F800 (home Z axis maximum) +(**** end move to cooling position ****) +(**** begin filament reversal ****) +M108 R50 T0 +M102 T0 (Extruder on, reverse) +G04 P100 (Wait t/1000 seconds) +M103 T0 (Extruder off) +M18 (Turn off steppers) +(**** end filament reversal ****) +(**** begin cool for safety ****) +M104 S0 (set extruder temperature) +M109 S0 T0 (set heated-build-platform temperature) +(**** end cool for safety ****) +(**** end of end.gcode ****) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/replace.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/replace.csv new file mode 100644 index 0000000..d858e44 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/replace.csv @@ -0,0 +1,2 @@ +M113 ;M113 +M108 S M108 R diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/start.gcode b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/start.gcode new file mode 100644 index 0000000..c2cbad3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/alterations/start.gcode @@ -0,0 +1,20 @@ +(**** beginning of start.gcode ****) +(This file is for 1.75mm ABS in a MK7 Extruder) +G21 (set units to mm) +G90 (set positioning to absolute) +M104 S225 (set extruder temperature) +M109 S110 T0 (set heated-build-platform temperature) +M108 R5.0 (set extruder speed) +M103 (Make sure extruder is off) +(**** begin homing ****) +G162 Z F500 (home Z axis maximum) +G92 Z10 (set Z to 10) +G1 Z0.0 (move Z down 0) +G162 Z F100 (home Z axis maximum) +G161 X Y F2500 (home XY axes minimum) +M132 X Y Z A B (Recall stored home offsets for XYZAB axis) +(**** end homing ****) +M6 T0 (wait for toolhead parts, nozzle, HBP, etc., to reach temperature) +M6 T1 +G54 +(**** end of start.gcode ****) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/comment.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/comment.csv new file mode 100644 index 0000000..df35361 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/comment.csv @@ -0,0 +1,5 @@ +Format is tab separated comment settings. +Name Value +WindowPosition 0+0 +Activate Comment False +Open File to Write Comments for diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/cutting.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/cutting.csv new file mode 100644 index 0000000..343333d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/cutting.csv @@ -0,0 +1,4 @@ +Format is tab separated cutting settings. +Name Value +WindowPosition 0+400 +Profile Selection: end_mill diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion.csv new file mode 100644 index 0000000..3db7596 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion.csv @@ -0,0 +1,4 @@ +Format is tab separated extrusion settings. +Name Value +WindowPosition 0+400 +Profile Selection: ABS diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/bookend.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/bookend.csv new file mode 100644 index 0000000..440b605 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/bookend.csv @@ -0,0 +1,7 @@ +Format is tab separated bookend settings. +_Name Value +WindowPosition 700+0 +Open File for Bookend +Activate Bookend False +Name of End File: end.gcode +Name of Start File: start.gcode diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/bottom.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/bottom.csv new file mode 100644 index 0000000..141dedd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/bottom.csv @@ -0,0 +1,8 @@ +Format is tab separated bottom settings. +_Name Value +WindowPosition 700+0 +Open File for Bottom +Activate Bottom False +Additional Height over Layer Thickness (ratio): 0.5 +Altitude (mm): 0.25 +SVG Viewer: webbrowser diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/carve.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/carve.csv new file mode 100644 index 0000000..01eb442 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/carve.csv @@ -0,0 +1,15 @@ +Format is tab separated carve settings. +_Name Value +WindowPosition 700+0 +Open File for Carve +Add Layer Template to SVG True +Extra Decimal Places (float): 1.0 +Import Coarseness (ratio): 1.0 +Infill in Direction of Bridge False +Layer Thickness (mm): 0.25 +Layers From (index): 0 +Layers To (index): 912345678 +Correct Mesh True +Unproven Mesh False +Perimeter Width over Thickness (ratio): 1.6 +SVG Viewer: webbrowser diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/chamber.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/chamber.csv new file mode 100644 index 0000000..949379f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/chamber.csv @@ -0,0 +1,8 @@ +Format is tab separated chamber settings. +_Name Value +WindowPosition 700+0 +Open File for Chamber +Activate Chamber True +Bed Temperature (Celcius): 60.0 +Chamber Temperature (Celcius): 30.0 +Holding Force (bar): 0.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/clairvoyance.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/clairvoyance.csv new file mode 100644 index 0000000..8aadf4f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/clairvoyance.csv @@ -0,0 +1,6 @@ +Format is tab separated clairvoyance settings. +_Name Value +WindowPosition 700+0 +Activate Clairvoyance False +Open File to Generate Clairvoyances for +Gcode Program: webbrowser diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/clip.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/clip.csv new file mode 100644 index 0000000..e3be203 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/clip.csv @@ -0,0 +1,7 @@ +Format is tab separated clip settings. +_Name Value +WindowPosition 700+0 +Open File for Clip +Activate Clip False +Clip Over Perimeter Width (ratio): 0.5 +Maximum Connection Distance Over Perimeter Width (ratio): 10.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/comb.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/comb.csv new file mode 100644 index 0000000..8bbba39 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/comb.csv @@ -0,0 +1,5 @@ +Format is tab separated comb settings. +_Name Value +WindowPosition 700+0 +Open File for Comb +Activate Comb False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/comment.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/comment.csv new file mode 100644 index 0000000..64c9a96 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/comment.csv @@ -0,0 +1,5 @@ +Format is tab separated comment settings. +Name Value +WindowPosition 700+0 +Activate Comment False +Open File to Write Comments for diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/cool.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/cool.csv new file mode 100644 index 0000000..fc664ff --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/cool.csv @@ -0,0 +1,16 @@ +Format is tab separated cool settings. +_Name Value +WindowPosition 700+0 +Open File for Cool +Activate Cool False +Bridge Cool (Celcius): 1.0 +Orbit False +Slow Down True +Maximum Cool (Celcius): 0.0 +Minimum Layer Time (seconds): 25.0 +Minimum Orbital Radius (millimeters): 10.0 +Name of Cool End File: +Name of Cool Start File: +Orbital Outset (millimeters): 2.0 +Turn Fan On at Beginning False +Turn Fan Off at Ending False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/dimension.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/dimension.csv new file mode 100644 index 0000000..4744aa8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/dimension.csv @@ -0,0 +1,14 @@ +Format is tab separated dimension settings. +_Name Value +WindowPosition 700+0 +Open File for Dimension +Activate Dimension True +Absolute Extrusion Distance True +Relative Extrusion Distance False +Extruder Retraction Speed (mm/s): 10.0 +Filament Diameter (mm): 3.0 +Filament Packing Density (ratio): 1.0 +Minimum Travel for Retraction (millimeters): 1.0 +Retract Within Island False +Retraction Distance (millimeters): 0.0 +Restart Extra Distance (millimeters): 0.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/export.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/export.csv new file mode 100644 index 0000000..49154e6 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/export.csv @@ -0,0 +1,22 @@ +Format is tab separated export settings. +_Name Value +WindowPosition 700+0 +Open File for Export +Activate Export True +Add Descriptive Extension False +Add Export Suffix False +Add Profile Extension False +Add Timestamp Extension False +Also Send Output To: +Analyze Gcode True +Do Not Delete Comments False +Delete Crafting Comments False +Delete All Comments True +Do Not Change Output True +binary_16_byte False +gcode_step False +gcode_time_segment False +gcode_small False +File Extension: gcode +Name of Replace File: Value +Save Penultimate Gcode False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/fill.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/fill.csv new file mode 100644 index 0000000..224c2c4 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/fill.csv @@ -0,0 +1,35 @@ +Format is tab separated fill settings. +_Name Value +WindowPosition 700+0 +Open File for Fill +Activate Fill True +Diaphragm Period (layers): 100000 +Diaphragm Thickness (layers): 0 +Extra Shells on Alternating Solid Layer (layers): 2 +Extra Shells on Base (layers): 3 +Extra Shells on Sparse Layer (layers): 3 +Grid Circle Separation over Perimeter Width (ratio): 0.2 +Grid Extra Overlap (ratio): 0.1 +Grid Junction Separation Band Height (layers): 10 +Grid Junction Separation over Octogon Radius At End (ratio): 0.0 +Grid Junction Separation over Octogon Radius At Middle (ratio): 0.0 +Infill Begin Rotation (degrees): 45.0 +Infill Begin Rotation Repeat (layers): 1 +Infill Odd Layer Extra Rotation (degrees): 90.0 +Grid Circular False +Grid Hexagonal False +Grid Rectangular False +Line True +Infill Perimeter Overlap (ratio): 0.3 +Infill Solidity (ratio): 0.3 +Infill Width over Thickness (ratio): 1.6 +Solid Surface Thickness (layers): 4 +Lower Left True +Nearest False +Surrounding Angle (degrees): 45.0 +Infill > Loops > Perimeter False +Infill > Perimeter > Loops False +Loops > Infill > Perimeter True +Loops > Perimeter > Infill False +Perimeter > Infill > Loops False +Perimeter > Loops > Infill False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/fillet.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/fillet.csv new file mode 100644 index 0000000..3984fae --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/fillet.csv @@ -0,0 +1,13 @@ +Format is tab separated fillet settings. +_Name Value +WindowPosition 700+0 +Open File to be Filleted +Activate Fillet False +Arc Point False +Arc Radius False +Arc Segment False +Bevel True +Corner Feed Rate over Operating Feed Rate (ratio): 1.0 +Fillet Radius over Perimeter Width (ratio): 0.35 +Reversal Slowdown Distance over Perimeter Width (ratio): 0.5 +Use Intermediate Feed Rate in Corners True diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/home.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/home.csv new file mode 100644 index 0000000..4413448 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/home.csv @@ -0,0 +1,6 @@ +Format is tab separated home settings. +_Name Value +WindowPosition 700+0 +Open File for Home +Activate Home False +Name of Homing File: diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/hop.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/hop.csv new file mode 100644 index 0000000..9573849 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/hop.csv @@ -0,0 +1,7 @@ +Format is tab separated hop settings. +_Name Value +WindowPosition 700+0 +Open File for Hop +Activate Hop False +Hop Over Layer Thickness (ratio): 10.0 +Minimum Hop Angle (degrees): 30.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/inset.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/inset.csv new file mode 100644 index 0000000..10a5446 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/inset.csv @@ -0,0 +1,10 @@ +Format is tab separated inset settings. +_Name Value +WindowPosition 700+0 +Open File for Inset +Add Custom Code for Temperature Reading False +Bridge Width Multiplier (ratio): 1.0 +Ascending Area True +Descending Area False +Overlap Removal Width over Perimeter Width (ratio): 0.8 +Turn Extruder Heater Off at Shut Down True diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/interpret.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/interpret.csv new file mode 100644 index 0000000..49edc63 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/interpret.csv @@ -0,0 +1,7 @@ +Format is tab separated interpret settings. +Name Value +WindowPosition 700+0 +Open File for Interpret +Activate Interpret False +Print Interpretion False +Text Program: webbrowser diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/jitter.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/jitter.csv new file mode 100644 index 0000000..c08d981 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/jitter.csv @@ -0,0 +1,6 @@ +Format is tab separated jitter settings. +_Name Value +WindowPosition 700+0 +Open File for Jitter +Activate Jitter False +Jitter Over Perimeter Width (ratio): 2.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/lash.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/lash.csv new file mode 100644 index 0000000..37c29d8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/lash.csv @@ -0,0 +1,7 @@ +Format is tab separated lash settings. +_Name Value +WindowPosition 700+0 +Open File for Lash +Activate Lash False +X Backlash (mm): 0.2 +Y Backlash (mm): 0.3 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/limit.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/limit.csv new file mode 100644 index 0000000..4a5b336 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/limit.csv @@ -0,0 +1,6 @@ +Format is tab separated limit settings. +_Name Value +WindowPosition 700+0 +Open File for Limit +Activate Limit False +Maximum Initial Feed Rate (mm/s): 8.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/multiply.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/multiply.csv new file mode 100644 index 0000000..e387b0e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/multiply.csv @@ -0,0 +1,11 @@ +Format is tab separated multiply settings. +_Name Value +WindowPosition 700+0 +Open File for Multiply +Activate Multiply False +Center X (mm): 100.0 +Center Y (mm): 100.0 +Number of Columns (integer): 1 +Number of Rows (integer): 1 +Reverse Sequence every Odd Layer False +Separation over Perimeter Width (ratio): 5.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/oozebane.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/oozebane.csv new file mode 100644 index 0000000..ad8cd89 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/oozebane.csv @@ -0,0 +1,13 @@ +Format is tab separated oozebane settings. +_Name Value +WindowPosition 700+0 +Open File for Oozebane +Activate Oozebane False +After Startup Distance (millimeters): 1.2 +Early Shutdown Distance (millimeters): 1.2 +Early Startup Distance Constant (millimeters): 20.0 +Early Startup Maximum Distance (millimeters): 1.2 +First Early Startup Distance (millimeters): 25.0 +Minimum Distance for Early Startup (millimeters): 0.0 +Minimum Distance for Early Shutdown (millimeters): 0.0 +Slowdown Startup Steps (positive integer): 3 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/outline.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/outline.csv new file mode 100644 index 0000000..5d49444 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/outline.csv @@ -0,0 +1,6 @@ +Format is tab separated outline settings. +Name Value +WindowPosition 600+0 +Open File for Outline +Activate Outline False +Outline Margin: 3.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/polyfile.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/polyfile.csv new file mode 100644 index 0000000..81ebcfb --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/polyfile.csv @@ -0,0 +1,5 @@ +Format is tab separated polyfile settings. +Name Value +WindowPosition 700+0 +Execute All Unmodified Files in a Directory False +Execute File True diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/preface.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/preface.csv new file mode 100644 index 0000000..49cb4d8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/preface.csv @@ -0,0 +1,10 @@ +Format is tab separated preface settings. +_Name Value +WindowPosition 700+0 +Open File for Preface +Meta: +Set Positioning to Absolute True +Set Units to Millimeters True +Start at Home True +Turn Extruder Off at Shut Down True +Turn Extruder Off at Start Up True diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/raft.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/raft.csv new file mode 100644 index 0000000..33c656f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/raft.csv @@ -0,0 +1,37 @@ +Format is tab separated raft settings. +_Name Value +WindowPosition 700+0 +Open File for Raft +Activate Raft True +Add Raft, Elevate Nozzle, Orbit: True +Base Feed Rate Multiplier (ratio): 0.7 +Base Flow Rate Multiplier (ratio): 1.0 +Base Infill Density (ratio): 0.4 +Base Layer Thickness over Layer Thickness: 2.0 +Base Layers (integer): 1 +Base Nozzle Lift over Base Layer Thickness (ratio): 0.8 +Initial Circling: False +Infill Overhang over Extrusion Width (ratio): 0.05 +Interface Feed Rate Multiplier (ratio): 1.5 +Interface Flow Rate Multiplier (ratio): 0.8 +Interface Infill Density (ratio): 0.3 +Interface Layer Thickness over Layer Thickness: 0.7 +Interface Layers (integer): 2 +Interface Nozzle Lift over Interface Layer Thickness (ratio): 0.2 +Name of Support End File: +Name of Support Start File: +Object First Layer Feed Rate Infill Multiplier (ratio): 0.7 +Object First Layer Feed Rate Perimeter Multiplier (ratio): 0.7 +Object First Layer Flow Rate Infill Multiplier (ratio): 0.7 +Object First Layer Flow Rate Perimeter Multiplier (ratio): 0.7 +Operating Nozzle Lift over Layer Thickness (ratio): 0.2 +Raft Additional Margin over Length (%): 1.2 +Raft Margin (mm): 4.0 +Support Cross Hatch False +Support Flow Rate over Operating Flow Rate (ratio): 0.8 +Support Gap over Perimeter Extrusion Width (ratio): 0.005 +None False +Empty Layers Only False +Everywhere True +Exterior Only False +Support Minimum Angle (degrees): 35.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/reversal.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/reversal.csv new file mode 100644 index 0000000..6a54360 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/reversal.csv @@ -0,0 +1,10 @@ +Format is tab separated reversal settings. +Name Value +WindowPosition 700+0 +Open File for Reversal +Activate Reversal True +Reversal speed (RPM): 35.0 +Reversal time (milliseconds): 30.0 +Push-back time (milliseconds): 30.0 +Reversal threshold (mm): 1.0 +Activate early reversal and push-back False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/scale.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/scale.csv new file mode 100644 index 0000000..9891888 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/scale.csv @@ -0,0 +1,8 @@ +Format is tab separated scale settings. +_Name Value +WindowPosition 700+0 +Open File for Scale +Activate Scale False +XY Plane Scale (ratio): 1.01 +Z Axis Scale (ratio): 1.0 +SVG Viewer: webbrowser diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge.csv new file mode 100644 index 0000000..afa1f70 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge.csv @@ -0,0 +1,9 @@ +Format is tab separated skeinforge settings. +_Name Value +WindowPosition 0+1 +Open File for Skeinforge /media/home/cube_50x20x5.stl +analyze False +craft True +help False +meta False +profile False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_analyze.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_analyze.csv new file mode 100644 index 0000000..9c9d2d4 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_analyze.csv @@ -0,0 +1,12 @@ +Format is tab separated skeinforge analyze settings. +_Name Value +WindowPosition 600+0 +Open File for Analyze +clairvoyance False +comment False +interpret False +skeiniso True +skeinlayer False +statistic False +synopsis False +vectorwrite False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_craft.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_craft.csv new file mode 100644 index 0000000..b0a2031 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_craft.csv @@ -0,0 +1,46 @@ +Format is tab separated skeinforge craft settings. +_Name Value +WindowPosition 600+0 +Open File for Craft +bookend False +bottom False +carve False +chamber False +chop False +cleave False +clip False +coil False +comb False +cool False +dimension False +drill False +export False +feed False +fill False +fillet False +flow False +home False +hop False +inset False +jitter False +lash False +lift False +limit False +mill False +multiply True +oozebane False +outset False +preface False +raft False +scale False +skin False +skirt False +speed False +splodge False +stretch False +temperature False +tower False +unpause False +whittle False +widen False +wipe False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_help.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_help.csv new file mode 100644 index 0000000..b8ba661 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinforge_help.csv @@ -0,0 +1,4 @@ +Format is tab separated skeinforge help settings. +Name Value +WindowPosition 600+0 +Wiki Manual Primary True diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeiniso.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeiniso.csv new file mode 100644 index 0000000..f059242 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeiniso.csv @@ -0,0 +1 @@ +Activate Skeiniso False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinlayer.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinlayer.csv new file mode 100644 index 0000000..06e66da --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skeinlayer.csv @@ -0,0 +1 @@ +Activate Skeinlayer False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skin.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skin.csv new file mode 100644 index 0000000..3c4d82c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skin.csv @@ -0,0 +1,8 @@ +Format is tab separated skin settings. +_Name Value +WindowPosition 700+0 +Open File for Skin +Activate Skin False +Half Width Perimeter True +Hop When Extruding Infill False +Layers From (index): 1 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skirt.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skirt.csv new file mode 100644 index 0000000..096cb25 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/skirt.csv @@ -0,0 +1,8 @@ +Format is tab separated skirt settings. +_Name Value +WindowPosition 700+0 +Open File for Skirt +Activate Skirt True +Convex: True +Gap over Perimeter Width (ratio): 3.0 +Layers To (index): 1 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/speed.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/speed.csv new file mode 100644 index 0000000..406b6bd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/speed.csv @@ -0,0 +1,17 @@ +Format is tab separated speed settings. +_Name Value +WindowPosition 700+0 +Open File for Speed +Activate Speed True +Add Flow Rate: True +Bridge Feed Rate Multiplier (ratio): 1.0 +Bridge Flow Rate Multiplier (ratio): 1.0 +Duty Cyle at Beginning (portion): 1.0 +Duty Cyle at Ending (portion): 0.0 +Feed Rate (mm/s): 100.0 +Flow Rate Setting (float): 15.0 +Orbital Feed Rate over Operating Feed Rate (ratio): 0.5 +Maximum Z Feed Rate (mm/s): 1.0 +Perimeter Feed Rate over Operating Feed Rate (ratio): 0.8 +Perimeter Flow Rate over Operating Flow Rate (ratio): 0.8 +Travel Feed Rate (mm/s): 150.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/splodge.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/splodge.csv new file mode 100644 index 0000000..295a157 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/splodge.csv @@ -0,0 +1,11 @@ +Format is tab separated splodge settings. +_Name Value +WindowPosition 700+0 +Open File for Splodge +Activate Splodge False +Initial Lift over Extra Thickness (ratio): 1.0 +Initial Splodge Feed Rate (mm/s): 1.0 +Initial Splodge Quantity Length (millimeters): 30.0 +Operating Lift over Extra Thickness (ratio): 1.0 +Operating Splodge Feed Rate (mm/s): 1.0 +Operating Splodge Quantity Length (millimeters): 1.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/statistic.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/statistic.csv new file mode 100644 index 0000000..33db58d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/statistic.csv @@ -0,0 +1,11 @@ +Format is tab separated statistic settings. +Name Value +WindowPosition 700+0 +Activate Statistic True +Machine Time ($/hour): 1.0 +Material ($/kg): 10.0 +Density (kg/m3): 930.0 +Extrusion Diameter over Thickness (ratio): 1.25 +Open File to Generate Statistics for +Print Statistics True +Save Statistics False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/stretch.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/stretch.csv new file mode 100644 index 0000000..da8e62f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/stretch.csv @@ -0,0 +1,11 @@ +Format is tab separated stretch settings. +_Name Value +WindowPosition 700+0 +Open File for Stretch +Activate Stretch False +Cross Limit Distance Over Perimeter Width (ratio): 5.0 +Loop Stretch Over Perimeter Width (ratio): 0.11 +Path Stretch Over Perimeter Width (ratio): 0.0 +Perimeter Inside Stretch Over Perimeter Width (ratio): 0.32 +Perimeter Outside Stretch Over Perimeter Width (ratio): 0.1 +Stretch From Distance Over Perimeter Width (ratio): 2.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/synopsis.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/synopsis.csv new file mode 100644 index 0000000..f77e5cd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/synopsis.csv @@ -0,0 +1,7 @@ +Format is tab separated synopsis settings. +_Name Value +WindowPosition 700+0 +Activate Synopsis False +Open File to Write Synopsis for +Export Profile As CSV File True +Export Profile As Zip File False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/temperature.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/temperature.csv new file mode 100644 index 0000000..63f45c8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/temperature.csv @@ -0,0 +1,14 @@ +Format is tab separated temperature settings. +_Name Value +WindowPosition 600+0 +Open File for Temperature +Activate Temperature True +Cooling Rate (Celcius/second): 3.0 +Heating Rate (Celcius/second): 10.0 +Base Temperature (Celcius): 175.0 +Interface Temperature (Celcius): 175.0 +Object First Layer Infill Temperature (Celcius): 175.0 +Object First Layer Perimeter Temperature (Celcius): 175.0 +Object Next Layers Temperature (Celcius): 175.0 +Support Layers Temperature (Celcius): 175.0 +Supported Layers Temperature (Celcius): 175.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/tower.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/tower.csv new file mode 100644 index 0000000..c2edfd8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/tower.csv @@ -0,0 +1,8 @@ +Format is tab separated tower settings. +_Name Value +WindowPosition 700+0 +Open File for Tower +Activate Tower False +Extruder Possible Collision Cone Angle (degrees): 60.0 +Maximum Tower Height (layers): 5 +Tower Start Layer (integer): 5 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/unpause.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/unpause.csv new file mode 100644 index 0000000..f30516c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/unpause.csv @@ -0,0 +1,7 @@ +Format is tab separated unpause settings. +_Name Value +WindowPosition 700+0 +Open File for Unpause +Activate Unpause False +Delay (milliseconds): 28.0 +Maximum Speed (ratio): 1.3 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/vectorwrite.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/vectorwrite.csv new file mode 100644 index 0000000..ac6e12f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/vectorwrite.csv @@ -0,0 +1,8 @@ +Format is tab separated vectorwrite settings. +Name Value +WindowPosition 700+0 +Activate Vectorwrite False +Open File to Write Vector Graphics for +Layers From (index): 0 +Layers To (index): 912345678 +SVG Viewer: webbrowser diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/widen.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/widen.csv new file mode 100644 index 0000000..9d40ae1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/widen.csv @@ -0,0 +1,5 @@ +Format is tab separated widen settings. +_Name Value +WindowPosition 700+0 +Open File for Widen +Activate Widen False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/wipe.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/wipe.csv new file mode 100644 index 0000000..090d296 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/extrusion/ABS/wipe.csv @@ -0,0 +1,15 @@ +Format is tab separated wipe settings. +_Name Value +WindowPosition 700+0 +Open File for Wipe +Activate Wipe False +Location Arrival X (mm): 52.0 +Location Arrival Y (mm): -57.0 +Location Arrival Z (mm): 10.0 +Location Departure X (mm): 52.0 +Location Departure Y (mm): -30.0 +Location Departure Z (mm): 10.0 +Location Wipe X (mm): 52.0 +Location Wipe Y (mm): -55.0 +Location Wipe Z (mm): 10.0 +Wipe Period (layers): 99999999 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/home.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/home.csv new file mode 100644 index 0000000..52f82f3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/home.csv @@ -0,0 +1,6 @@ +Format is tab separated home settings. +Name Value +WindowPosition 0+0 +Open File for Home +Activate Home True +Name of Homing File: homing.gcode diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/interpret.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/interpret.csv new file mode 100644 index 0000000..4fe641d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/interpret.csv @@ -0,0 +1,7 @@ +Format is tab separated interpret settings. +Name Value +WindowPosition 0+0 +Open File for Interpret +Activate Interpret False +Print Interpretion False +Text Program: webbrowser diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/lash.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/lash.csv new file mode 100644 index 0000000..cc36337 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/lash.csv @@ -0,0 +1,7 @@ +Format is tab separated lash settings. +Name Value +WindowPosition 0+0 +Open File for Lash +Activate Lash False +X Backlash (mm): 0.2 +Y Backlash (mm): 0.3 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/milling.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/milling.csv new file mode 100644 index 0000000..051a168 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/milling.csv @@ -0,0 +1,4 @@ +Format is tab separated milling settings. +Name Value +WindowPosition 0+400 +Profile Selection: end_mill diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge.csv new file mode 100644 index 0000000..ff5ecc9 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge.csv @@ -0,0 +1,9 @@ +Format is tab separated skeinforge settings. +Name Value +WindowPosition 63+64 +Open File for Skeinforge +analyze False +craft True +help False +meta False +profile False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_craft.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_craft.csv new file mode 100644 index 0000000..359b30b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_craft.csv @@ -0,0 +1,44 @@ +Format is tab separated skeinforge craft settings. +Name Value +WindowPosition 0+0 +Open File for Craft +bottom False +carve False +chamber False +chop False +cleave False +clip False +coil False +comb False +cool False +dimension False +drill False +export False +feed False +fill True +fillet False +flow False +home False +hop False +inset False +jitter False +lash False +lift False +limit False +mill False +multiply False +oozebane False +outline False +outset False +preface False +raft False +reversal False +speed False +splodge False +stretch False +temperature False +tower False +unpause False +whittle False +widen False +wipe False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_help.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_help.csv new file mode 100644 index 0000000..445ef97 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_help.csv @@ -0,0 +1,4 @@ +Format is tab separated skeinforge help settings. +Name Value +WindowPosition 0+0 +Wiki Manual Primary True diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_profile.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_profile.csv new file mode 100644 index 0000000..1d60c1b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinforge_profile.csv @@ -0,0 +1,7 @@ +Format is tab separated skeinforge profile settings. +Name Value +WindowPosition 0+200 +cutting False +extrusion True +milling False +winding False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeiniso.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeiniso.csv new file mode 100644 index 0000000..f059242 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeiniso.csv @@ -0,0 +1 @@ +Activate Skeiniso False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinlayer.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinlayer.csv new file mode 100644 index 0000000..06e66da --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/skeinlayer.csv @@ -0,0 +1 @@ +Activate Skeinlayer False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/statistic.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/statistic.csv new file mode 100644 index 0000000..871b987 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/statistic.csv @@ -0,0 +1,11 @@ +Format is tab separated statistic settings. +Name Value +WindowPosition 0+0 +Activate Statistic True +Machine Time ($/hour): 1.0 +Material ($/kg): 10.0 +Density (kg/m3): 930.0 +Extrusion Diameter over Thickness (ratio): 1.25 +Open File to Generate Statistics for +Print Statistics True +Save Statistics False diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/unpause.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/unpause.csv new file mode 100644 index 0000000..5ab9392 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/unpause.csv @@ -0,0 +1,7 @@ +Format is tab separated unpause settings. +Name Value +WindowPosition 0+0 +Open File for Unpause +Activate Unpause False +Delay (milliseconds): 28.0 +Maximum Speed (ratio): 1.3 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/winding.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/winding.csv new file mode 100644 index 0000000..0b65a9f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/prefs/RepRap-Wade-PLA/profiles/winding.csv @@ -0,0 +1,4 @@ +Format is tab separated winding settings. +Name Value +WindowPosition 0+400 +Profile Selection: free_wire diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/End_Mill/chop.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/End_Mill/chop.csv new file mode 100644 index 0000000..ace928d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/End_Mill/chop.csv @@ -0,0 +1,13 @@ +Format is tab separated chop preferences. +Name Value +Add Extra Top Layer if Necessary True +Open File to be Chopped +Import Coarseness (ratio): 1.0 +Correct Mesh True +Unproven Mesh False +Layer Thickness (mm): 0.4 +Layer Thickness over Precision (ratio): 10.0 +Layers From (index): 0 +Layers To (index): 999999999 +Perimeter Width (mm): 2.0 +windowPositionChop Preferences 600+0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/End_Mill/lift.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/End_Mill/lift.csv new file mode 100644 index 0000000..a2cf543 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/End_Mill/lift.csv @@ -0,0 +1,7 @@ +Format is tab separated lift preferences. +Name Value +Activate Lift: True +Cutting Lift over Layer Step (ratio): -0.5 +Open File to be Lifted /home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/craft_plugins/Screw Holder Bottom.stl +Clearance above Top (mm): 5.0 +windowPositionLift Preferences 440+53 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/Laser/chop.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/Laser/chop.csv new file mode 100644 index 0000000..b54d561 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/Laser/chop.csv @@ -0,0 +1,13 @@ +Format is tab separated chop preferences. +Name Value +Add Extra Top Layer if Necessary True +Open File to be Chopped +Import Coarseness (ratio): 1.0 +Correct Mesh True +Unproven Mesh False +Layer Thickness (mm): 0.4 +Layer Thickness over Precision (ratio): 10.0 +Layers From (index): 0 +Layers To (index): 999999999 +Perimeter Width (mm): 0.2 +windowPositionChop Preferences 600+0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/Laser/lift.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/Laser/lift.csv new file mode 100644 index 0000000..9818ca2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/cutting/Laser/lift.csv @@ -0,0 +1,7 @@ +Format is tab separated lift preferences. +Name Value +Activate Lift: True +Cutting Lift over Layer Step (ratio): 0.0 +Open File to be Lifted /home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/craft_plugins/Screw Holder Bottom.stl +Clearance above Top (mm): 5.0 +windowPositionLift Preferences 440+53 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/ABS/temperature.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/ABS/temperature.csv new file mode 100644 index 0000000..9900b5b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/ABS/temperature.csv @@ -0,0 +1,16 @@ +Format is tab separated temperature settings. +Name Value +WindowPosition 600+0 +WindowVisibilities +Open File for Temperature +Activate Temperature: True +Cooling Rate (Celcius/second): 3.0 +Heating Rate (Celcius/second): 10.0 +Temperature at Beginning (Celcius): 20.0 +Temperature of Base (Celcius): 200.0 +Temperature of Interface (Celcius): 200.0 +Temperature of Object First Layer Infill (Celcius): 195.0 +Temperature of Object First Layer Perimeter (Celcius): 220.0 +Temperature of Object Next Layers (Celcius): 230.0 +Temperature of Support Layers (Celcius): 200.0 +Temperature of Supported Layers (Celcius): 230.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/HDPE/temperature.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/HDPE/temperature.csv new file mode 100644 index 0000000..9900b5b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/HDPE/temperature.csv @@ -0,0 +1,16 @@ +Format is tab separated temperature settings. +Name Value +WindowPosition 600+0 +WindowVisibilities +Open File for Temperature +Activate Temperature: True +Cooling Rate (Celcius/second): 3.0 +Heating Rate (Celcius/second): 10.0 +Temperature at Beginning (Celcius): 20.0 +Temperature of Base (Celcius): 200.0 +Temperature of Interface (Celcius): 200.0 +Temperature of Object First Layer Infill (Celcius): 195.0 +Temperature of Object First Layer Perimeter (Celcius): 220.0 +Temperature of Object Next Layers (Celcius): 230.0 +Temperature of Support Layers (Celcius): 200.0 +Temperature of Supported Layers (Celcius): 230.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/PCL/temperature.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/PCL/temperature.csv new file mode 100644 index 0000000..d1e5d87 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/PCL/temperature.csv @@ -0,0 +1,16 @@ +Format is tab separated temperature settings. +Name Value +WindowPosition 600+0 +WindowVisibilities +Open File for Temperature +Activate Temperature: True +Cooling Rate (Celcius/second): 3.0 +Heating Rate (Celcius/second): 10.0 +Temperature at Beginning (Celcius): 20.0 +Temperature of Base (Celcius): 125.0 +Temperature of Interface (Celcius): 125.0 +Temperature of Object First Layer Infill (Celcius): 130.0 +Temperature of Object First Layer Perimeter (Celcius): 130.0 +Temperature of Object Next Layers (Celcius): 120.0 +Temperature of Support Layers (Celcius): 125.0 +Temperature of Supported Layers (Celcius): 135.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/PLA/temperature.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/PLA/temperature.csv new file mode 100644 index 0000000..3a68176 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/extrusion/PLA/temperature.csv @@ -0,0 +1,16 @@ +Format is tab separated temperature settings. +Name Value +WindowPosition 600+0 +WindowVisibilities +Open File for Temperature +Activate Temperature: True +Cooling Rate (Celcius/second): 3.0 +Heating Rate (Celcius/second): 10.0 +Temperature at Beginning (Celcius): 20.0 +Temperature of Base (Celcius): 180.0 +Temperature of Interface (Celcius): 180.0 +Temperature of Object First Layer Infill (Celcius): 170.0 +Temperature of Object First Layer Perimeter (Celcius): 180.0 +Temperature of Object Next Layers (Celcius): 160.0 +Temperature of Support Layers (Celcius): 170.0 +Temperature of Supported Layers (Celcius): 190.0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/End_Mill/chop.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/End_Mill/chop.csv new file mode 100644 index 0000000..ace928d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/End_Mill/chop.csv @@ -0,0 +1,13 @@ +Format is tab separated chop preferences. +Name Value +Add Extra Top Layer if Necessary True +Open File to be Chopped +Import Coarseness (ratio): 1.0 +Correct Mesh True +Unproven Mesh False +Layer Thickness (mm): 0.4 +Layer Thickness over Precision (ratio): 10.0 +Layers From (index): 0 +Layers To (index): 999999999 +Perimeter Width (mm): 2.0 +windowPositionChop Preferences 600+0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/End_Mill/lift.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/End_Mill/lift.csv new file mode 100644 index 0000000..a2cf543 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/End_Mill/lift.csv @@ -0,0 +1,7 @@ +Format is tab separated lift preferences. +Name Value +Activate Lift: True +Cutting Lift over Layer Step (ratio): -0.5 +Open File to be Lifted /home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/craft_plugins/Screw Holder Bottom.stl +Clearance above Top (mm): 5.0 +windowPositionLift Preferences 440+53 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/Laser/chop.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/Laser/chop.csv new file mode 100644 index 0000000..b54d561 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/Laser/chop.csv @@ -0,0 +1,13 @@ +Format is tab separated chop preferences. +Name Value +Add Extra Top Layer if Necessary True +Open File to be Chopped +Import Coarseness (ratio): 1.0 +Correct Mesh True +Unproven Mesh False +Layer Thickness (mm): 0.4 +Layer Thickness over Precision (ratio): 10.0 +Layers From (index): 0 +Layers To (index): 999999999 +Perimeter Width (mm): 0.2 +windowPositionChop Preferences 600+0 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/Laser/lift.csv b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/Laser/lift.csv new file mode 100644 index 0000000..9818ca2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/profiles/milling/Laser/lift.csv @@ -0,0 +1,7 @@ +Format is tab separated lift preferences. +Name Value +Activate Lift: True +Cutting Lift over Layer Step (ratio): 0.0 +Open File to be Lifted /home/enrique/Desktop/backup/babbleold/script/reprap/pyRepRap/skeinforge_tools/craft_plugins/Screw Holder Bottom.stl +Clearance above Top (mm): 5.0 +windowPositionLift Preferences 440+53 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/runskeinforge.sh b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/runskeinforge.sh new file mode 100644 index 0000000..6c165a1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/runskeinforge.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +# +# Utility script for keeping track of which preference settings a file was processed +# with, by copying the current preferences to a date-tagged directory together +# with the output files. +# +# Usage: runskeinforge.sh +# + +dir=`dirname $1` +file=`basename $1` + +for s in .gts .GTS .stl .STL; do + if [ ! `basename $file $s` = $file ]; then suffix=$s; fi +done + +if [ -n $suffix ]; then + filename=`basename $file $suffix` + newdir=$filename-`date +%m%d%H%M` + mkdir -p $newdir/skeinforge-prefs + cp $1 $newdir + cp ~/.skeinforge/*.csv $newdir/skeinforge-prefs + python skeinforge.py $newdir/$filename$suffix + echo $PWD/$newdir/${filename}_export.gcode +fi diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/show_skeinforge.sh b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/show_skeinforge.sh new file mode 100644 index 0000000..0548ca1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/show_skeinforge.sh @@ -0,0 +1,8 @@ +#!/usr/bin/python +# +# Script to show the skeinforge dialog. +# +# Usage: set the executable property to true if it isn't already. Then double click the file. +# +import skeinforge +skeinforge.main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge.py new file mode 100644 index 0000000..05e9307 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge.py @@ -0,0 +1,620 @@ +#!/usr/bin/python +""" +This page is in the table of contents. +==Overview== +===Introduction=== +Skeinforge is a GPL tool chain to forge a gcode skein for a model. + +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, 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. + +If you do not want a tool after preface to modify the output, deselect the Activate checkbox for that tool. When the Activate checkbox is off, the tool will just hand off the gcode to the next tool without modifying it. + +The skeinforge module provides a single place to call up all the setting dialogs. When the 'Skeinforge' button is clicked, skeinforge calls export, since that is the end of the chain. + +The plugin buttons which are commonly used are bolded and the ones which are rarely used have normal font weight. + +There are also tools which handle settings for the chain, like polyfile. + +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 interpret tool accesses and displays the import plugins. + +The default settings are similar to those on Nophead's machine. A setting which is often different is the 'Layer Thickness' in carve. + +===Command Line Interface=== +To bring up the skeinforge dialog without a file name, type: +python skeinforge_application/skeinforge.py + +Slicing a file from skeinforge_utilities/skeinforge_craft.py, for example: +python skeinforge_application/skeinforge_utilities/skeinforge_craft.py test.stl + +will slice the file and exit. This is the correct option for programs which use skeinforge to only generate a gcode file. + +Slicing a file from skeinforge.py, for example: +python skeinforge_application/skeinforge.py test.stl + +will slice the file and bring up the skeinforge window and the analyze windows and then skeinforge will wait for user input. + +Slicing a file from skeinforge_plugins/craft.py, for example: +python skeinforge_application/skeinforge_plugins/craft.py test.stl + +will slice the file and bring up the analyze windows only and then skeinforge will wait for user input. + +===Contribute=== +You can contribute by helping develop the manual at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge + +There is also a forum thread about how to contribute to skeinforge development at: +http://dev.forums.reprap.org/read.php?12,27562 + +I will only reply to emails from contributors or to complete bug reports. + +===Documentation=== +There is a manual at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge + +There is also documentation is in the documentation folder, in the doc strings for each module and it can be called from the '?' button or the menu or by clicking F1 in each setting dialog. + +A list of other tutorials is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge#Tutorials + +Skeinforge tagged pages on thingiverse can be searched for at: +http://www.thingiverse.com/search?cx=015525747728168968820%3Arqnsgx1xxcw&cof=FORID%3A9&ie=UTF-8&q=skeinforge&sa=Search&siteurl=www.thingiverse.com%2F#944 + +===Fabrication=== +To fabricate a model with gcode and the Arduino you can use the send.py in the fabricate folder. The documentation for it is in the folder as send.html and at: +http://reprap.org/bin/view/Main/ArduinoSend + +Another way is to use an EMC2 or similar computer controlled milling machine, as described in the "ECM2 based repstrap" forum thread at: +http://forums.reprap.org/read.php?1,12143 + +using the M-Apps package, which is at: +http://forums.reprap.org/file.php?1,file=772 + +Another way is to use Zach's ReplicatorG at: +http://replicat.org/ + +There is also an older Processing script at: +http://reprap.svn.sourceforge.net/viewvc/reprap/trunk/users/hoeken/arduino/GCode_Host/ + +Yet another way is to use the reprap host, written in Java, to load and print gcode: +http://dev.www.reprap.org/bin/view/Main/DriverSoftware#Load_GCode + +For jogging, the Metalab group wrote their own exerciser, also in Processing: +http://reprap.svn.sourceforge.net/viewvc/reprap/trunk/users/metalab/processing/GCode_Exerciser/ + +The Metalab group has descriptions of skeinforge in action and their adventures are described at: +http://reprap.soup.io/ + +There is a board about printing issues at: +http://www.bitsfrombytes.com/fora/user/index.php?board=5.0 + +You can buy the Rapman (an improved Darwin) from Bits from Bytes at: +http://www.bitsfrombytes.com/ + +You can buy the Makerbot from Makerbot Industries at: +http://www.makerbot.com/ + +===File Formats=== +An explanation of the gcodes is at: +http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter + +and at: +http://reprap.org/bin/view/Main/MCodeReference + +A gode example is at: +http://forums.reprap.org/file.php?12,file=565 + +The settings are saved as tab separated .csv files in the .skeinforge folder in your home directory. The settings can be set in the tool dialogs. The .csv files can also be edited with a text editor or a spreadsheet program set to separate tabs. + +The Scalable Vector Graphics file produced by vectorwrite can be opened by an SVG viewer or an SVG capable browser like Mozilla: +http://www.mozilla.com/firefox/ + +A good triangle surface format is the GNU Triangulated Surface format, which is supported by Mesh Viewer and described at: +http://gts.sourceforge.net/reference/gts-surfaces.html#GTS-SURFACE-WRITE + +You can export GTS files from Art of Illusion with the Export GNU Triangulated Surface.bsh script in the Art of Illusion Scripts 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 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. + +===Getting Skeinforge=== +The latest version is at: +http://members.axion.net/~enrique/reprap_python_beanshell.zip + +a sometimes out of date version is in the last reprap_python_beanshell.zip attachment in the last post of the Fabmetheus blog at: +http://fabmetheus.blogspot.com/ + +another sometimes out of date version is at: +https://reprap.svn.sourceforge.net/svnroot/reprap/trunk/reprap/miscellaneous/python-beanshell-scripts/ + +===Getting Started=== +For skeinforge to run, install python 2.x on your machine, which is available from: +http://www.python.org/download/ + +To use the settings dialog you'll also need Tkinter, which probably came with the python installation. If it did not, look for it at: +http://www.tcl.tk/software/tcltk/ + +If you want python and Tkinter together on MacOS, you can try: +http://www.astro.washington.edu/users/rowen/ROPackage/Overview.html + +If you want python and Tkinter together on all platforms and don't mind filling out forms, you can try the ActivePython package from Active State at: +http://www.activestate.com/Products/activepython/feature_list.mhtml + +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 + +The psyco download page is: +http://psyco.sourceforge.net/download.html + +Skeinforge imports Stereolithography (.stl) files or GNU Triangulated Surface (.gts) files. If importing an STL file directly doesn't work, an indirect way to import an STL file is by turning it into a GTS file is by using the Export GNU Triangulated Surface script at: +http://members.axion.net/~enrique/Export%20GNU%20Triangulated%20Surface.bsh + +The Export GNU Triangulated Surface script is also in the Art of Illusion folder, which is in the same folder as skeinforge.py. To bring the script into Art of Illusion, drop it into the folder ArtOfIllusion/Scripts/Tools/. Then import the STL file using the STL import plugin in the import submenu of the Art of Illusion file menu. Then from the Scripts submenu in the Tools menu, choose 'Export GNU Triangulated Surface' and select the imported STL shape. Click the 'Export Selected' checkbox and click OK. Once you've created the GTS file, you can turn it into gcode by typing in a shell in the same folder as skeinforge: +> python skeinforge.py + +When the skeinforge dialog pops up, click 'Skeinforge', choose the file which you exported in 'Export GNU Triangulated Surface' and the gcode file will be saved with the suffix '_export.gcode'. + +Or you can turn files into gcode by adding the file name, for example: +> python skeinforge.py Screw Holder Bottom.stl + +===License=== +GNU Affero General Public License +http://www.gnu.org/licenses/agpl.html + +===Motto=== +I may be slow, but I get there in the end. + +===Troubleshooting=== +If there's a bug, try downloading the very latest version because skeinforge is often updated without an announcement. The very latest version is at: +http://members.axion.net/~enrique/reprap_python_beanshell.zip + +If there is still a bug, then first prepare the following files: + +1. stl file +2. pictures explaining the problem +3. your settings (pack the whole .skeinforge directory with all your settings) +4. alterations folder, if you have any active alterations files + +Then zip all the files. + +Second, write a description of the error, send the description and the archive to the developer, enrique ( perez_enrique AT yahoo.com.removethispart ). After a bug fix is released, test the new version and report the results to enrique, whether the fix was successful or not. + +If the dialog window is too big for the screen, on most Linux window managers you can move a window by holding down the Alt key and then drag the window with the left mouse button to get to the off screen widgets. + +If you can't use the graphical interface, you can change the settings for skeinforge by using a text editor or spreadsheet to change the settings in the profiles folder in the .skeinforge folder in your home directory. + +Comments and suggestions are welcome, however, I won't reply unless you are a contributor. Likewise, I will only answer your questions if you contribute to skeinforge in some way. Some ways of contributing to skeinforge are in the contributions thread at: +http://dev.forums.reprap.org/read.php?12,27562 + +You could also contribute articles to demozendium on any topic: +http://fabmetheus.crsndoo.com/wiki/index.php/Main_Page + +If you contribute in a significant way to another open source project, I will consider that also. + +When I answered everyone's questions, eventually I received more questions than I had time to answer, so now I only answer questions from contributors. + +I reserve the right to make any correspondence public. Do not send me any correspondence marked confidential. If you do I will delete it. + + +==Examples== +The following examples forge 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 +This brings up the dialog, after clicking 'Skeinforge', the following is printed: +The exported file is saved as Screw Holder_export.gcode + +> python skeinforge.py Screw Holder.stl +The exported file is saved as Screw Holder_export.gcode + +To run only fill for example, type in the craft_plugins folder which fill is in: +> python fill.py + +""" + +from __future__ import absolute_import +import __init__ + +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from optparse import OptionParser +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys + + +# document after fillet, then fill and comb once they are updated, maybe later subplugins like export static and export canvas, maybe later mill cut and coil plugins +# move more __file__ tableau +# raftPerimeter outset by maximum thickness +# check skin perimeter feed and flow +# skin horizontal perimeter divisions +# check last reported bug +# fix arc model 'too large for getArcComplexes in svgReader' +# scrollbar/width problem when starting with narrow view like help/meta/profile +# document announce Surrounding Angle up to 80 +# announce bookend / alteration +# interim release +# +# smooth http://hydraraptor.blogspot.com/2010/12/frequency-limit.html _extrusion +# voronoi average location intersection looped inset intercircles +# move dimension after unpause +# replace alteration with file, move to bookend +# command +# +# unimportant +# minor outline problem when an end path goes through a path, like in the letter A +# view profile 1 mm thickness +# analyze doesn't save settings +# +# announce analyzeGcode in export +# +# think about http://code.google.com/p/skeinarchiver/ and/or undo +# skin layers without something over the infill +# unpause slow flow rate instead of speeding feed rate +# maybe in svgReader if loop intersection with previous union else add +# set temperature in temperature +# add links download manual svg_writer, add left right arrow keys to layer +# infuse _extrusion +# cutting ahmet +# +# comb -> maybe add back running jump look at outside loops only for jump, find closest points, find slightly away inside points, link +# global simplify pathBetween +# comb documentation +# +# When opening a file for craft I wondered if there is an option to set the file type to .stl as it currently defaults to .xml +# check inset loop for intersection with rotatedLoopLayer.loops +# add fill in penultimate loops +# maybe make vectorwrite prominent, not skeiniso, probably not because it doesn't work on Mac +# close, getPillarByLoopLists, addConcave, polymorph original graph section, loop, add step object, add continuous object +# hollow top +# chamber: heated bed off at a layer http://blog.makerbot.com/2011/03/17/if-you-cant-stand-the-heat/ +# packingDensity or density in grid - probably just density +# derivations for shapes +# think about rectangular getVector3RemoveByPre.. +# del previous, add begin & end if far get actual path +# linearbearingexample 15 x 1 x 2, linearbearingcage +# remember xy in skeiniso +# polling +# connectionfrom, to, connect, xaxis +# lathe, transform normal in getRemaining, getConnection +# add overview link to crnsdoo index and svg page +# getConnection of some kind like getConnectionVertexes, getConnection +# getElementsByLocalName which is the equivalent of # getElementsByTagName +# xml_creation +# 'fileName, text, repository' commandLineInterface +# delete: text = text.replace(('\nName %sValue\n' % globalSpreadsheetSeparator), ('\n_Name %sValue\n' % globalSpreadsheetSeparator)) +# comment search from home panel when there is an input field +# +# +# multiply to table + boundary bedBound bedWidth bedHeight bedFile.csv +# getNormal, getIsFlat? +# info statistics, procedures, xml if any +# test solid arguments +# combine xmlelement with csvelement using example.csv & geometry.csv, csv _format, _column, _row, _text +# pixel, voxel, surfaxel/boxel, lattice, mesh +# probably not replace getOverlapRatio with getOverlap if getOverlapRatio is never small, always 0.0 +# mesh. for cube, then cyliner, then sphere after lathe +# dimension extrude diameter, density +# maybe get rid of testLoops once they are no longer needed +# thermistor lookup table +# stretch add back addAlong +# import, write, copy examples +# maybe remove default warnings from scale, rotate, translate, transform +# easy helix +# write tool; maybe write one deep +# +# +# tube +# rotor +# coin +# demozendium privacy policy, maybe thumbnail logo +# pymethe +# test translate +# full lathe +# pyramid +# round extrusion ?, fillet +# make html statistics, move statistics to folder +# manipulate solid, maybe manipulate around elements +# boolean loop corner outset +# mechaslab advanced drainage, shingles +# dovetail +# maybe not getNewObject, getNew, addToBoolean +# work out close and radius +# maybe have add function as well as append for list and string +# maybe move and give geometryOutput to cube, cylinder, sphere +# +# maybe move widen before bottom +# maybe add 1 to max layer input to iso in layer_template.svg +# maybe save all generated_files option +# table to dictionary +# check for last existing then remove unneeded fill code (getLastExistingFillLoops) from euclidean +# remove cool set at end of layer +# add fan on when hot in chamber +# maybe measuring rod +# getLayerThickness from xml +# maybe center for xy plane +# remove comments from clip, bend +# winding into coiling, coil into wind & weave +# later, precision +# documentation +# http://wiki.makerbot.com/configuring-skeinforge +# +# +# remove index from CircleIntersection remove ahead or behind from CircleIntersection _speed +# cache surroundingCarves _speed +# probably not speed up CircleIntersection by performing isWithinCircles before creation _speed +# don't remove brackets in early craft tools _speed +# +# +# add hook _extrusion +# integral thin width _extrusion +# layer color, for multilayer start http://reprap.org/pub/Main/MultipleMaterialsFiles/legend.xml _extrusion +# maybe raft triple layer base, middle interface with hot loop or ties +# somehow, add pattern to outside, http://blog.makerbot.com/2010/09/03/lampshades/ +# implement acceleration & collinear removal in penultimate viewers _extrusion +# +# rename skeinforge_profile.addListsToCraftTypeRepository to skeinforge_profile.addToCraftTypeRepository after apron +# basic tool +# arch, ceiling +# meta setting, rename setting _setting +# add polish, has perimeter, has cut first layer (False) +# probably not set addedLocation in distanceFeedRate after arc move +# maybe horizontal bridging and/or check to see if the ends are standing on anything +# thin self? check when removing intersecting paths in inset +# maybe later remove isPerimeterPathInSurroundLoops, once there are no weird fill bugs +# save all analyze viewers of the same name except itself, update help menu self.wikiManualPrimary.setUpdateFunction +# check alterations folder first, if there is something copy it to the home directory, if not check the home directory +# add links to demozendium in help +# maybe add hop only if long option +# +# +# +# help primary menu item refresh +# add plugin help menu, add craft below menu +# give option of saving when switching profiles +# xml & svg more forgiving, svg make defaults for layerThickness +# option of surrounding lines in display +# maybe add connecting line in display line +# maybe check inset loops to see if they are smaller, but this would be slow +# maybe status bar +# maybe measurement ruler mouse tool +# search rss from blogs, add search links for common materials, combine created on or progress bar with searchable help +# boundaries, center radius z bottom top, alterations file, circular or rectangular, polygon, put cool minimum radius orbits within boundaries, bound.. +# move & rotate model +# possible jitter bug http://cpwebste.blogspot.com/2010/04/hydras-first-print.html +# trial, meta in a grid settings +# maybe interpret svg_convex_mesh +#laminate tool head +#maybe use 5x5 radius search in circle node +#maybe add layer updates in behold, skeinlayer and maybe others +#lathe winding, extrusion and cutting; synonym for rotation or turning, loop angle +# maybe split into source code and documentation sections +# transform plugins, start with sarrus http://www.thingiverse.com/thing:1425 +# maybe make setting backups +# move skeinforge_utilities to fabmetheus_utilities +# maybe lathe cutting +# maybe lathe extrusion +# maybe lathe millng +# maybe lathe winding & weaving +# +# +# +# pick and place +# search items, search links, choice entry field +# svg triangle mesh, svg polygon mesh +# simulate +#transform +# juricator +# probably not run along sparse infill to avoid stops +#custom inclined plane, inclined plane from model, screw, fillet travel as well maybe +# probably not stretch single isLoop +#maybe much afterwards make congajure multistep view +#maybe stripe although model colors alone can handle it +#stretch fiber around shape, maybe modify winding for asymmetric shapes +#multiple heads around edge +#maybe add rarely used tool option +#angle shape for overhang extrusions +#maybe m111? countdown +#first time tool tip +#individual tool tip to place in text +# maybe try to simplify raft layer start +# maybe make temp directory +# maybe carve aoi xml testing and check xml gcode +# maybe cross hatch support polishing??? +# maybe print svg view from current layer or zero layer in single view +# maybe check if tower is picking the nearest island +# maybe combine skein classes in fillet +# maybe isometric svg option + +#Manual +#10,990 +#11,1776,786 +#12,3304,1528 +#1,4960,1656 +#2, 7077,2117 +#3, 9598,2521 +#4 12014,2305 +#5 14319,2536 +#6 16855,3226 +#7 20081, 2189 +#8 22270, 2625 +#9 24895, 2967, 98 +#10 27862, 3433, 110 +#11 31295, 3327 +#12 34622 +#85 jan7, 86jan11, 87 jan13, 88 jan15, 91 jan21, 92 jan23, 95 jan30, 98 feb6 +#make one piece electromagnet spool +#stepper rotor with ceramic disk magnet in middle, electromagnet with long thin spool line? +#stepper motor +#make plastic coated thread in vat with pulley +#tensile stuart platform +#kayak +#gear vacuum pump +#gear turbine +#heat engine +#solar power +#sailboat +#yacht +#house +#condo with reflected gardens in between buildings +#medical equipment +#cell counter, etc.. +#pipe clamp lathe +# square tube driller & cutter + +# archihedrongagglevoteindexium +# outline images +# look from top of intersection circle plane to look for next, add a node; tree out until all are stepped on then connect, when more than three intersections are close +# when loading a file, we should have a preview of the part and orientation in space +# second (and most important in my opinion) would be the ability to rotate the part on X/Y/Z axis to chose it's orientation +# third, a routine to detect the largest face and orient the part accordingly. Mat http://reprap.kumy.net/ +# concept, three perpendicular slices to get display spheres +# extend lines around short segment after cross hatched boolean +# concept, donation, postponement, rotate ad network, cached search options +# concept, local ad server, every time the program runs it changes the iamge which all the documentation points to from a pool of ads +# concept, join cross slices, go from vertex to two orthogonal edges, then from edges to each other, if not to a common point, then simplify polygons by removing points which do not change the area much +# concept, each node is fourfold, use sorted intersectionindexes to find close, connect each double sided edge, don't overlap more than two triangles on an edge +# concept, diamond cross section loops +# concept, in file, store polygon mesh and centers +# concept, display spheres or polygons would have original triangle for work plane +# .. then again no point with slices +# concept, filled slices, about 2 mm thick +# concept, rgb color triangle switch to get inside color, color golden ratio on 5:11 slope with a modulo 3 face +# concept, interlaced bricks at corners ( length proportional to corner angle ) +# concept, new links to archi, import links to archi and adds skeinforge tool menu item, back on skeinforge named execute tool is added +# concept, trnsnt +# concept, indexium expand condense remove, single text, pymetheus +# concept, inscribed key silencer +# concept, spreadsheet to python and/or javascript +# concept, range voting for posters, informative, complainer, funny, insightful, rude, spammer, literacy, troll? +# concept, intermittent cloud with multiple hash functions + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = """ +Adrian Bowyer +Brendan Erwin +Greenarrow +Ian England +John Gilmore +Jonwise +Kyle Corbitt +Michael Duffin +Marius Kintel +Nophead +PJR +Reece.Arnott +Wade +Xsainnz +Zach Hoeken + +Organizations: +Art of Illusion """ +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addToProfileMenu(profileSelection, profileType, repository): + 'Add a profile menu.' + pluginFileNames = skeinforge_profile.getPluginFileNames() + craftTypeName = skeinforge_profile.getCraftTypeName() + pluginModule = skeinforge_profile.getCraftTypePluginModule() + profilePluginSettings = settings.getReadRepository(pluginModule.getNewRepository()) + for pluginFileName in pluginFileNames: + skeinforge_profile.ProfileTypeMenuRadio().getFromMenuButtonDisplay(profileType, pluginFileName, repository, craftTypeName == pluginFileName) + for profileName in profilePluginSettings.profileList.value: + skeinforge_profile.ProfileSelectionMenuRadio().getFromMenuButtonDisplay(profileSelection, profileName, repository, profileName == profilePluginSettings.profileListbox.value) + +def getNewRepository(): + 'Get new repository.' + return SkeinforgeRepository() + +def getPluginFileNames(): + 'Get skeinforge plugin fileNames.' + return archive.getPluginFileNamesFromDirectoryPath(archive.getSkeinforgePluginsPath()) + +def getRadioPluginsAddPluginGroupFrame(directoryPath, importantFileNames, names, repository): + 'Get the radio plugins and add the plugin frame.' + repository.pluginGroupFrame = settings.PluginGroupFrame() + radioPlugins = [] + for name in names: + radioPlugin = settings.RadioPlugin().getFromRadio(name in importantFileNames, repository.pluginGroupFrame.latentStringVar, name, repository, name == importantFileNames[0]) + radioPlugin.updateFunction = repository.pluginGroupFrame.update + radioPlugins.append( radioPlugin ) + defaultRadioButton = settings.getSelectedRadioPlugin(importantFileNames + [radioPlugins[0].name], radioPlugins) + repository.pluginGroupFrame.getFromPath(defaultRadioButton, directoryPath, repository) + return radioPlugins + +def writeOutput(fileName): + 'Craft a file, display dialog.' + repository = getNewRepository() + repository.fileNameInput.value = fileName + settings.startMainLoopFromWindow(repository.execute()) + + +class SkeinforgeRepository: + 'A class to handle the skeinforge settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Skeinforge', self, '') + self.profileType = settings.MenuButtonDisplay().getFromName('Profile Type: ', self ) + self.profileSelection = settings.MenuButtonDisplay().getFromName('Profile Selection: ', self) + addToProfileMenu( self.profileSelection, self.profileType, self ) + settings.LabelDisplay().getFromName('', self) + importantFileNames = ['craft', 'profile'] + getRadioPluginsAddPluginGroupFrame(archive.getSkeinforgePluginsPath(), importantFileNames, getPluginFileNames(), self) + self.executeTitle = 'Skeinforge' + + def execute(self): + 'Skeinforge button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + window = None + for fileName in fileNames: + window = skeinforge_craft.writeOutput(fileName) + return window + + def save(self): + 'Profile has been saved and profile menu should be updated.' + self.profileType.removeMenus() + self.profileSelection.removeMenus() + addToProfileMenu(self.profileSelection, self.profileType, self) + self.profileType.addRadiosToDialog(self.repositoryDialog) + self.profileSelection.addRadiosToDialog(self.repositoryDialog) + + +def main(): + 'Display the skeinforge dialog.' + parser = OptionParser() + parser.add_option( + '-p', '--prefdir', help='set path to preference directory', action='store', type='string', dest='preferencesDirectory') + parser.add_option( + '-s', '--start', help='set start file to use', action='store', type='string', dest='startFile') + parser.add_option( + '-e', '--end', help='set end file to use', action='store', type='string', dest='endFile') + parser.add_option( + '-o', '--option', help='set an individual option in the format "module:preference=value"', + action='append', type='string', dest='preferences') + (options, args) = parser.parse_args() + if options.preferencesDirectory: + archive.globalTemporarySettingsPath = options.preferencesDirectory + if options.preferences: + for prefSpec in options.preferences: + (moduleName, prefSpec) = prefSpec.split(':', 1) + (prefName, valueName) = prefSpec.split('=', 1) + settings.temporaryAddPreferenceOverride(moduleName, prefName, valueName) + sys.argv = [sys.argv[0]] + args + if len( args ) > 0: + writeOutput( ' '.join(args) ) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/__init__.py new file mode 100644 index 0000000..2dc8ddc --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 2 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/__init__.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/__init__.pyc new file mode 100644 index 0000000..251fa70 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/__init__.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze.py new file mode 100644 index 0000000..99604b2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze.py @@ -0,0 +1,60 @@ +""" +This page is in the table of contents. +Analyze is a script to access the plugins which analyze a gcode file. + +The plugin buttons which are commonly used are bolded and the ones which are rarely used have normal font weight. + +==Gcodes== +An explanation of the gcodes is at: +http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter + +and at: +http://reprap.org/bin/view/Main/MCodeReference + +A gode example is at: +http://forums.reprap.org/file.php?12,file=565 + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_analyze +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addToMenu(master, menu, repository, window): + "Add a tool plugin menu." + analyzeFilePath = archive.getSkeinforgePluginsPath('analyze.py') + pluginsDirectoryPath = skeinforge_analyze.getPluginsDirectoryPath() + settings.addPluginsParentToMenu(pluginsDirectoryPath, menu, analyzeFilePath, skeinforge_analyze.getPluginFileNames()) + +def getNewRepository(): + 'Get new repository.' + return skeinforge_analyze.AnalyzeRepository() + +def writeOutput(fileName): + "Analyze a gcode file." + repository = getNewRepository() + repository.fileNameInput.value = fileName + repository.execute() + settings.startMainLoopFromConstructor(repository) + + +def main(): + "Display the analyze dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze.pyc new file mode 100644 index 0000000..2885c21 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/__init__.py new file mode 100644 index 0000000..1121e8a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 3 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/__init__.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/__init__.pyc new file mode 100644 index 0000000..734dd0e Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/__init__.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/__init__.py new file mode 100644 index 0000000..58ec332 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 4 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/__init__.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/__init__.pyc new file mode 100644 index 0000000..b824d1d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/__init__.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/display_line.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/display_line.py new file mode 100644 index 0000000..5a8c79c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/display_line.py @@ -0,0 +1,124 @@ +""" +This page is in the table of contents. +Display line is a mouse tool to select and display information about the line. + +When a line is clicked, the line will be selected and information about the line will be displayed. If a gcode line is clicked, the information will be file line count of the line clicked, counting from one, and the line itself. + +When the display line tool is chosen and the canvas has the focus, display line will listen to the arrow keys. Clicking in the canvas gives the canvas the focus, and when the canvas has the focus a thick black border is drawn around the canvas. When the right arrow key is pressed, display line will increase the line index of the layer by one, and change the selection accordingly. If the line index of the layer goes over the index of the last line, the layer index will be increased by one and the new line index will be zero. When the left arrow key is pressed, the index will be decreased. If the line index goes below the index of the first line, the layer index will be decreased by one and the new line index will be at the last line. The up arrow key increases the layer index by one and the down arow key decreases the line index. + +""" + +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_application.skeinforge_plugins.analyze_plugins.analyze_utilities.mouse_tool_base import MouseToolBase +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewMouseTool(): + "Get a new mouse tool." + return DisplayLine() + + +class DisplayLine( MouseToolBase ): + "Display the line when it is clicked." + def button1( self, event, shift = False ): + "Print line text and connection line." + self.destroyEverythingGetFocus() + x = self.canvas.canvasx(event.x) + y = self.canvas.canvasy(event.y) + tags = self.getTagsGivenXY(x, y) + if tags == '': + return + if tags.startswith('colored_line_index:'): + splitLine = tags.split() + coloredLineIndex = int(splitLine[1]) + self.repository.line.value = coloredLineIndex + tags = self.getSelectedColoredLine().displayString + self.drawLineText( complex( float(x), float(y) ), tags ) + + def destroyEverything(self): + "Destroy items." + self.canvas.delete('mouse_item') + self.canvas.delete('selection_line') + + def drawLineText( self, location, tags ): + "Draw the line text." + self.window.getDrawnLineText( location, 'mouse_item', tags ) + + def drawSelectedColoredLineText(self): + "Draw the selected line and text." + selectedColoredLine = self.getSelectedColoredLine() + if len( self.canvas.find_withtag('selection_line') ) < 1 or selectedColoredLine == None: + return + tags = selectedColoredLine.displayString + lineCoordinates = self.canvas.coords( self.canvas.find_withtag('selection_line')[-1] ) + begin = complex( lineCoordinates[0], lineCoordinates[1] ) + end = complex( lineCoordinates[2], lineCoordinates[3] ) + segment = end - begin + segmentLength = abs(segment) + if segmentLength <= 0.0: + return + towardEnd = 0.75 * segment + segmentClockwise = 20.0 * complex( segment.imag, - segment.real ) / segmentLength + location = begin + towardEnd + segmentClockwise + self.drawLineText( location, tags ) + + def getSelectedColoredLine(self): + "Draw the selected line, add it to the items and return the colored line." + self.window.cancelTimerResetButtons() + coloredLines = self.window.getColoredLines() + self.repository.line.value = max(0, self.repository.line.value) + if len(coloredLines) < 1: + return None + self.repository.line.value = min(len(coloredLines) - 1, self.repository.line.value) + self.window.setLineButtonsState() + coloredLine = coloredLines[self.repository.line.value] + lineCoordinates = self.canvas.coords(self.window.getDrawnSelectedColoredLine(coloredLine)) + end = complex(lineCoordinates[2], lineCoordinates[3]) + radiusComplex = complex(16.0, 16.0) + upperLeft = end - radiusComplex + lowerRight = end + radiusComplex + self.canvas.create_oval (int(upperLeft.real), int(upperLeft.imag), int(lowerRight.real), int(lowerRight.imag), tags = 'mouse_item') + return coloredLine + + def isSelectionTool(self): + "Return if this mouse tool is a selection tool." + return True + + def keyPressDown(self, event): + "The down arrow was pressed." + self.destroyEverything() + self.window.setLayerIndex( self.repository.layer.value - 1 ) + + def keyPressLeft(self, event): + "The left arrow was pressed." + self.destroyEverything() + self.repository.line.value -= 1 + if self.window.isLineBelowZeroSetLayer(): + return + self.drawSelectedColoredLineText() + + def keyPressRight(self, event): + "The right arrow was pressed." + self.destroyEverything() + self.repository.line.value += 1 + if self.window.isLineBeyondListSetLayer(): + return + self.drawSelectedColoredLineText() + + def keyPressUp(self, event): + "The up arrow was pressed." + self.destroyEverything() + self.window.setLayerIndex( self.repository.layer.value + 1 ) + + def update(self): + "Update the mouse tool." + self.destroyEverything() + self.drawSelectedColoredLineText() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/display_line.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/display_line.pyc new file mode 100644 index 0000000..3bffe7d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/display_line.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/mouse_tool_base.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/mouse_tool_base.py new file mode 100644 index 0000000..3ca8457 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/mouse_tool_base.py @@ -0,0 +1,85 @@ +""" +Display line is a mouse tool to display the line index of the line clicked, counting from one, and the line itself. + +""" + +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__ + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +class MouseToolBase: + "The mouse tool base class, which does nothing." + def button1(self, event): + "The left button was clicked, function." + pass + + def buttonRelease1(self, event): + "The left button was released, function." + pass + + def destroyEverything(self): + "Destroy items." + self.canvas.delete('mouse_item') + + def destroyEverythingGetFocus(self): + "Destroy items and get the focus for the canvas." + self.destroyEverything() + self.canvas.focus_set() + + def getReset( self, window ): + "Reset the mouse tool to default." + self.setWindowItems( window ) + self.destroyEverything() + return self + + def getTagsGivenXY( self, x, y ): + "Get the tag for the x and y." + tags = self.canvas.itemcget( self.canvas.find_closest(x, y), 'tags') + currentEnd = ' current' + if tags.find( currentEnd ) != - 1: + return tags[ : - len( currentEnd ) ] + return tags + + def isSelectionTool(self): + "Return if this mouse tool is a selection tool." + return False + + def keyPressDown(self, event): + "The down arrow was pressed." + pass + + def keyPressLeft(self, event): + "The left arrow was pressed." + pass + + def keyPressReturn(self, event): + "The return key was pressed." + pass + + def keyPressRight(self, event): + "The right arrow was pressed." + pass + + def keyPressUp(self, event): + "The up arrow was pressed." + pass + + def motion( self, event, shift = False ): + "The mouse moved, function." + pass + + def setWindowItems( self, window ): + "Set the canvas and items." + self.canvas = window.canvas + self.repository = window.repository + self.window = window + + def update(self): + "Update the mouse tool." + pass diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/mouse_tool_base.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/mouse_tool_base.pyc new file mode 100644 index 0000000..2f4c812 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/mouse_tool_base.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/tableau.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/tableau.py new file mode 100644 index 0000000..811fe0a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/tableau.py @@ -0,0 +1,773 @@ +""" +Tableau has a couple of base classes for analyze viewers. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import zoom_in +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import zoom_out +import math +import os + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getGeometricDifference( first, second ): + 'Get the geometric difference of the two numbers.' + return max( first, second ) / min( first, second ) + +def getGridHorizontalFrame(gridPosition): + 'Get the grid horizontal object with a frame from the grid position.' + gridHorizontal = settings.GridHorizontal( 0, 0 ) + gridHorizontal.master = settings.Tkinter.Frame( gridPosition.master, borderwidth = 1, padx = 3, relief = 'raised') + gridHorizontal.master.grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.E ) + return gridHorizontal + +def getIsLayerStart(firstWord, skein, splitLine): + 'Determine if the line is the start of a layer.' + if skein.isThereALayerStartWord: + return firstWord == '(' + if firstWord != 'G1' and firstWord != 'G2' and firstWord != 'G3': + return False + location = gcodec.getLocationFromSplitLine(skein.oldLocation, splitLine) + if location.z - skein.oldZ > 0.1: + skein.oldZ = location.z + return True + return False + +def getLengthMinusOneMinimumOne( elementList ): + 'Get the length of the length minus one, minimum one.' + return max( 1, len( elementList ) - 1 ) + +def getScrollbarCanvasPortion( scrollbar ): + 'Get the canvas portion of the scrollbar.' + scrollbarBeginEnd = scrollbar.get() + return scrollbarBeginEnd[1] - scrollbarBeginEnd[0] + +def setStateNormalDisabled( active, widget ): + 'Set the state of the widget to normal if active and disabled if inactive.' + if active: + widget.config( state = settings.Tkinter.NORMAL ) + else: + widget.config( state = settings.Tkinter.DISABLED ) + + +class ColoredLine: + 'A colored index line.' + def __init__( self, begin, colorName, displayString, end, tagString ): + 'Set the color name and corners.' + self.begin = begin + self.colorName = colorName + self.displayString = displayString + self.end = end + self.tagString = tagString + + def __repr__(self): + 'Get the string representation of this colored index line.' + return '%s, %s, %s, %s' % ( self.colorName, self.begin, self.end, self.tagString ) + + +class ExportCanvasDialog: + 'A class to display the export canvas repository dialog.' + def addPluginToMenu( self, canvas, fileName, menu, name, suffix ): + 'Add the display command to the menu.' + self.canvas = canvas + self.fileName = fileName + self.name = name + self.suffix = suffix + menu.add_command( label = settings.getEachWordCapitalized( self.name ), command = self.display ) + + def display(self): + 'Display the export canvas repository dialog.' + for repositoryDialog in settings.globalRepositoryDialogListTable: + if repositoryDialog.repository.lowerName == self.name: + repositoryDialog.setCanvasFileNameSuffix( self.canvas, self.skein.fileName, self.suffix ) + settings.liftRepositoryDialogs( settings.globalRepositoryDialogListTable[ repositoryDialog ] ) + return + exportCanvasPluginsFolderPath = archive.getAbsoluteFolderPath( os.path.dirname(__file__), 'export_canvas_plugins') + pluginModule = archive.getModuleWithDirectoryPath( exportCanvasPluginsFolderPath, self.name ) + if pluginModule == None: + return None + pluginRepository = pluginModule.getNewRepository() + pluginRepository.setCanvasFileNameSuffix( self.canvas, self.fileName, self.suffix ) + settings.getDisplayedDialogFromConstructor( pluginRepository ) + + +class TableauRepository: + 'The viewer base repository class.' + def addAnimation(self): + 'Add the animation settings.' + self.frameList = settings.FrameList().getFromValue('Frame List', self, [] ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Animation -', self ) + self.animationLineQuickening = settings.FloatSpinUpdate().getFromValue( 0.5, 'Animation Line Quickening (ratio):', self, 4.5, 1.0 ) + self.animationSlideShowRate = settings.FloatSpinUpdate().getFromValue( 1.0, 'Animation Slide Show Rate (layers/second):', self, 5.0, 2.0 ) + settings.LabelSeparator().getFromRepository(self) + + def addScaleScreenSlide(self): + 'Add the scale, screen and slide show settings.' + self.scale = settings.FloatSpinNotOnMenu().getFromValue( 10.0, 'Scale (pixels per millimeter):', self, 50.0, 15.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Screen Inset -', self ) + self.screenHorizontalInset = settings.IntSpin().getFromValue( 80, 'Screen Horizontal Inset (pixels):', self, 1000, 100 ) + self.screenVerticalInset = settings.IntSpin().getFromValue( 120, 'Screen Vertical Inset (pixels):', self, 1000, 220 ) + settings.LabelSeparator().getFromRepository(self) + self.showGcode = settings.BooleanSetting().getFromValue('Show Gcode', self, True ) + + def setToDisplaySave(self, event=None): + 'Set the setting values to the display, save the new values.' + for menuEntity in self.menuEntities: + if menuEntity in self.preferences: + menuEntity.setToDisplay() + settings.writeSettings(self) + + +class TableauWindow: + def activateMouseModeTool(self): + 'Activate the mouse mode tool.' + self.repository.setToDisplaySave() + self.canvas.focus_set() + self.createMouseModeTool() + self.mouseTool.update() + + def addCanvasMenuRootScrollSkein(self, repository, skein, suffix, title): + 'Add the canvas, menu bar, scroll bar, skein panes, tableau repository, root and skein.' + self.imagesDirectoryPath = archive.getFabmetheusUtilitiesPath('images') + self.movementTextID = None + self.mouseInstantButtons = [] + self.photoImages = {} + self.repository = repository + self.root = settings.Tkinter.Tk() + self.gridPosition = settings.GridVertical(0, 1) + self.gridPosition.master = self.root + self.highlightThickness = 3 + self.root.title(os.path.basename(skein.fileName) + ' - ' + title) + self.rulingExtent = 24 + self.rulingTargetSeparation = 150.0 + self.screenSize = skein.screenSize + self.skein = skein + self.skeinPanes = skein.skeinPanes + self.suffix = suffix + self.timerID = None + repository.animationSlideShowRate.value = max(repository.animationSlideShowRate.value, 0.01) + repository.animationSlideShowRate.value = min(repository.animationSlideShowRate.value, 85.0) + repository.drawArrows.setUpdateFunction(self.setWindowToDisplaySaveUpdate) + repository.goAroundExtruderOffTravel.setUpdateFunction(self.setWindowToDisplaySavePhoenixUpdate) + repository.layerExtraSpan.setUpdateFunction(self.setWindowToDisplaySaveUpdate) + repository.showGcode.setUpdateFunction(self.setWindowToDisplaySaveUpdate) + repository.widthOfSelectionThread.setUpdateFunction(self.setWindowToDisplaySaveUpdate) + repository.widthOfTravelThread.setUpdateFunction(self.setWindowToDisplaySaveUpdate) + repository.window = self + for menuRadio in repository.mouseMode.menuRadios: + fileName = menuRadio.name.lower() + fileName = fileName.replace(' ', '_') + '.ppm' + menuRadio.mouseButton = self.getPhotoButtonGridIncrement(menuRadio.invoke, fileName, self.gridPosition) + self.gridPosition = settings.GridHorizontal(2, 99) + self.gridPosition.master = self.root + self.gcodeStringVar = settings.Tkinter.StringVar(self.root) + self.gcodeLabel = settings.Tkinter.Label(self.root, anchor = settings.Tkinter.W, textvariable = self.gcodeStringVar) + self.gcodeLabel.grid(row = 0, column = 5, columnspan = 93, sticky = settings.Tkinter.W) + from fabmetheus_utilities.hidden_scrollbar import HiddenScrollbar + self.xScrollbar = HiddenScrollbar(self.root, orient = settings.Tkinter.HORIZONTAL) + self.xScrollbar.grid(row = 98, column = 2, columnspan = 96, sticky = settings.Tkinter.E + settings.Tkinter.W) + self.yScrollbar = HiddenScrollbar(self.root) + self.yScrollbar.grid(row = 2, rowspan = 96, column = 99, sticky = settings.Tkinter.N + settings.Tkinter.S) + self.canvasHeight = self.root.winfo_screenheight() - repository.screenVerticalInset.value + self.canvasWidth = self.root.winfo_screenwidth() - repository.screenHorizontalInset.value + scrollRegionBoundingBox = (0, 0, int(skein.screenSize.real), int(skein.screenSize.imag)) + self.canvas = settings.Tkinter.Canvas(self.root, highlightthickness = self.highlightThickness, width = self.canvasWidth, height = self.canvasHeight, scrollregion = scrollRegionBoundingBox) + self.canvas.grid(row = 2, rowspan = 96, column = 2, columnspan = 96, sticky = settings.Tkinter.E + settings.Tkinter.W + settings.Tkinter.N + settings.Tkinter.S) + self.fileHelpMenuBar = settings.FileHelpMenuBar(self.root) + self.exportMenu = settings.Tkinter.Menu(self.fileHelpMenuBar.fileMenu, tearoff = 0) + self.fileHelpMenuBar.fileMenu.add_cascade(label = 'Export', menu = self.exportMenu, underline = 0) + exportCanvasPluginsFolderPath = archive.getAbsoluteFolderPath(os.path.dirname(__file__), 'export_canvas_plugins') + exportCanvasPluginFileNames = archive.getPluginFileNamesFromDirectoryPath(exportCanvasPluginsFolderPath) + for exportCanvasPluginFileName in exportCanvasPluginFileNames: + ExportCanvasDialog().addPluginToMenu(self.canvas, skein.fileName, self.exportMenu, exportCanvasPluginFileName, suffix) + self.fileHelpMenuBar.fileMenu.add_separator() + self.fileHelpMenuBar.completeMenu(self.close, repository, self.save, self) + + def addLayer( self, gridPosition ): + 'Add the layer frame items.' + self.diveButton = self.getPhotoButtonGridIncrement( self.dive, 'dive.ppm', gridPosition ) + self.soarButton = self.getPhotoButtonGridIncrement( self.soar, 'soar.ppm', gridPosition ) + gridPosition.increment() + settings.Tkinter.Label( gridPosition.master, text = 'Layer:').grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.W ) + gridPosition.increment() + self.limitIndex() + self.layerEntry = settings.Tkinter.Spinbox( gridPosition.master, command = self.layerEntryReturnPressed, from_ = 0, increment = 1, to = getLengthMinusOneMinimumOne( self.skeinPanes ) ) + self.layerEntry.bind('', self.layerEntryReturnPressed ) + self.layerEntry.grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.W ) + + def addLine( self, gridPosition ): + 'Add the line frame items.' + self.lineDiveButton = self.getPhotoButtonGridIncrement( self.lineDive, 'dive.ppm', gridPosition ) + self.lineSoarButton = self.getPhotoButtonGridIncrement( self.lineSoar, 'soar.ppm', gridPosition ) + gridPosition.increment() + settings.Tkinter.Label( gridPosition.master, text = 'Line:').grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.W ) + gridPosition.increment() + self.lineEntry = settings.Tkinter.Spinbox( gridPosition.master, command = self.lineEntryReturnPressed, from_ = 0, increment = 1, to = getLengthMinusOneMinimumOne( self.getColoredLines() ) ) + self.lineEntry.bind('', self.lineEntryReturnPressed ) + self.lineEntry.grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.W ) + + def addMouseInstantTool( self, fileName, gridPosition, mouseInstantTool ): + 'Add the mouse instant tool and derived photo button.' + mouseInstantTool.getReset(self) + photoButton = self.getPhotoButtonGridIncrement( mouseInstantTool.click, fileName, gridPosition ) + mouseInstantTool.mouseButton = photoButton + self.mouseInstantButtons.append( photoButton ) + + def addMouseToolsBind(self): + 'Add the mouse tool and bind button one clicked, button one released and motion.' + self.xScrollbar.config( command = self.relayXview ) + self.yScrollbar.config( command = self.relayYview ) + self.canvas['xscrollcommand'] = self.xScrollbar.set + self.canvas['yscrollcommand'] = self.yScrollbar.set + settings.CloseListener( self, self.destroyAllDialogWindows ).listenToWidget( self.canvas ) + self.canvasScreenCenter = 0.5 * complex( float( self.canvasWidth ) / float( self.screenSize.real ), float( self.canvasHeight ) / float( self.screenSize.imag ) ) + self.addPhotoImage('stop.ppm', self.gridPosition ) + self.gridPosition.increment() + self.addLayer( getGridHorizontalFrame( self.gridPosition ) ) + self.gridPosition.increment() + self.addLine( getGridHorizontalFrame( self.gridPosition ) ) + self.gridPosition.increment() + self.addScale( getGridHorizontalFrame( self.gridPosition ) ) + self.gridPosition = settings.GridVertical( self.gridPosition.columnStart + 1, self.gridPosition.row ) + self.gridPosition.master = self.root + for name in self.repository.frameList.value: + entity = self.getEntityFromName( name ) + if entity != None: + self.gridPosition.incrementGivenNumberOfColumns(3) + entity.addToDialog( getGridHorizontalFrame( self.gridPosition ) ) + for menuRadio in self.repository.mouseMode.menuRadios: + menuRadio.mouseTool = menuRadio.getNewMouseToolFunction().getReset(self) + self.mouseTool = menuRadio.mouseTool + self.createMouseModeTool() + self.canvas.bind('', self.button1) + self.canvas.bind('', self.buttonRelease1) + self.canvas.bind('', self.setInsetToCanvas) + self.canvas.bind('', self.keyPressDown) + self.canvas.bind('', self.keyPressLeft) + self.canvas.bind('', self.keyPressRight) + self.canvas.bind('', self.keyPressUp) + self.canvas.bind('', self.motion) + self.canvas.bind('', self.keyPressReturn) + self.canvas.bind('', self.shiftButtonRelease1) + self.canvas.bind('', self.shiftMotion) + self.layerEntry.bind('', self.cancelTimer) + self.root.grid_columnconfigure(44, weight = 1) + self.root.grid_rowconfigure(44, weight = 1) + self.resetPeriodicButtonsText() + self.repository.animationLineQuickening.setUpdateFunction( self.repository.setToDisplaySave ) + self.repository.animationSlideShowRate.setUpdateFunction( self.repository.setToDisplaySave ) + self.repository.screenHorizontalInset.setUpdateFunction( self.redisplayWindowUpdate ) + self.repository.screenVerticalInset.setUpdateFunction( self.redisplayWindowUpdate ) + rankZeroSeperation = self.getRulingSeparationWidthPixels( 0 ) + zoom = self.rulingTargetSeparation / rankZeroSeperation + self.rank = euclidean.getRank( zoom ) + rankTop = self.rank + 1 + seperationBottom = self.getRulingSeparationWidthPixels( self.rank ) + seperationTop = self.getRulingSeparationWidthPixels( rankTop ) + bottomDifference = getGeometricDifference( self.rulingTargetSeparation, seperationBottom ) + topDifference = getGeometricDifference( self.rulingTargetSeparation, seperationTop ) + if topDifference < bottomDifference: + self.rank = rankTop + self.rulingSeparationWidthMillimeters = euclidean.getIncrementFromRank( self.rank ) + self.canvas.focus_set() + + def addPhotoImage( self, fileName, gridPosition ): + 'Get a PhotoImage button, grid the button and increment the grid position.' + photoImage = None + try: + photoImage = settings.Tkinter.PhotoImage( file = os.path.join( self.imagesDirectoryPath, fileName ), master = gridPosition.master ) + except: + print('Image %s was not found in the images directory, so a text button will be substituted.' % fileName ) + untilDotFileName = archive.getUntilDot(fileName) + self.photoImages[ untilDotFileName ] = photoImage + return untilDotFileName + + def addScale( self, gridPosition ): + 'Add the line frame items.' + self.addMouseInstantTool('zoom_out.ppm', gridPosition, zoom_out.getNewMouseTool() ) + self.addMouseInstantTool('zoom_in.ppm', gridPosition, zoom_in.getNewMouseTool() ) + gridPosition.increment() + settings.Tkinter.Label( gridPosition.master, text = 'Scale:').grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.W ) + gridPosition.increment() + self.scaleEntry = settings.Tkinter.Spinbox( gridPosition.master, command = self.scaleEntryReturnPressed, from_ = 10.0, increment = 5.0, to = 100.0 ) + self.scaleEntry.bind('', self.scaleEntryReturnPressed ) + self.scaleEntry.grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.W ) + + def addSettingsMenuSetWindowGeometry( self, center ): + 'Add the settings menu, center the scroll region, update, and set the window geometry.' + self.settingsMenu = settings.Tkinter.Menu( self.fileHelpMenuBar.menuBar, tearoff = 0 ) + self.fileHelpMenuBar.addMenuToMenuBar( 'Settings', self.settingsMenu ) + settings.addMenuEntitiesToMenuFrameable( self.settingsMenu, self.repository.menuEntities ) + self.relayXview( settings.Tkinter.MOVETO, center.real - self.canvasScreenCenter.real ) + self.relayYview( settings.Tkinter.MOVETO, center.imag - self.canvasScreenCenter.imag ) + self.root.withdraw() + self.root.update_idletasks() + movedGeometryString = '%sx%s+%s' % ( self.root.winfo_reqwidth(), self.root.winfo_reqheight(), '0+0') + self.root.geometry( movedGeometryString ) + + def button1(self, event): + 'The button was clicked.' + self.mouseTool.button1(event) + + def buttonRelease1(self, event): + 'The button was released.' + self.mouseTool.buttonRelease1(event) + + def cancel(self, event=None): + 'Set all entities to their saved state.' + settings.cancelRepository(self.repository) + + def cancelTimer(self, event=None): + 'Cancel the timer and set it to none.' + if self.timerID != None: + self.canvas.after_cancel(self.timerID) + self.timerID = None + + def cancelTimerResetButtons(self): + 'Cancel the timer and set it to none.' + self.cancelTimer() + self.resetPeriodicButtonsText() + + def close(self, event=None): + 'The dialog was closed.' + try: + self.root.after( 1, self.root.destroy ) # to get around 'Font Helvetica -12 still in cache.' segmentation bug, instead of simply calling self.root.destroy() + except: + pass + + def createMouseModeTool(self): + 'Create the mouse mode tool.' + self.destroyMouseToolRaiseMouseButtons() + for menuRadio in self.repository.mouseMode.menuRadios: + if menuRadio.value: + self.mouseTool = menuRadio.mouseTool + menuRadio.mouseButton['relief'] = settings.Tkinter.SUNKEN + + def destroyAllDialogWindows(self): + 'Destroy all the dialog windows.' + settings.writeSettings(self.repository) + return + for menuEntity in self.repository.menuEntities: + lowerName = menuEntity.name.lower() + if lowerName in settings.globalRepositoryDialogListTable: + globalRepositoryDialogValues = settings.globalRepositoryDialogListTable[ lowerName ] + for globalRepositoryDialogValue in globalRepositoryDialogValues: + settings.quitWindow( globalRepositoryDialogValue.root ) + + def destroyMouseToolRaiseMouseButtons(self): + 'Destroy the mouse tool and raise the mouse buttons.' + self.mouseTool.destroyEverything() + for menuRadio in self.repository.mouseMode.menuRadios: + menuRadio.mouseButton['relief'] = settings.Tkinter.RAISED + for mouseInstantButton in self.mouseInstantButtons: + mouseInstantButton['relief'] = settings.Tkinter.RAISED + + def dive(self): + 'Dive, go down periodically.' + oldDiveButtonText = self.diveButton['text'] + self.cancelTimerResetButtons() + if oldDiveButtonText == 'stop': + return + self.diveCycle() + + def diveCycle(self): + 'Start the dive cycle.' + self.setLayerIndex(self.repository.layer.value - 1) + if self.repository.layer.value < 1: + self.resetPeriodicButtonsText() + return + self.setButtonImageText( self.diveButton, 'stop') + self.timerID = self.canvas.after( self.getSlideShowDelay(), self.diveCycle ) + + def getAnimationLineDelay( self, coloredLine ): + 'Get the animation line delay in milliseconds.' +# maybe later, add animation along line +# nextLayerIndex = self.repository.layer.value +# nextLineIndex = self.repository.line.value + 1 +# coloredLinesLength = len( self.getColoredLines() ) +# self.skein.feedRateMinute +# if nextLineIndex >= coloredLinesLength: +# if nextLayerIndex + 1 < len( self.skeinPanes ): +# nextLayerIndex += 1 +# nextLineIndex = 0 +# else: +# nextLineIndex = self.repository.line.value + splitLine = gcodec.getSplitLineBeforeBracketSemicolon( coloredLine.displayString ) + self.skein.feedRateMinute = gcodec.getFeedRateMinute( self.skein.feedRateMinute, splitLine ) + feedRateSecond = self.skein.feedRateMinute / 60.0 + coloredLineLength = abs( coloredLine.end - coloredLine.begin ) / self.repository.scale.value + duration = coloredLineLength / feedRateSecond + animationLineDelay = int( round( 1000.0 * duration / self.repository.animationLineQuickening.value ) ) + return max( animationLineDelay, 1 ) + + def getDrawnLineText( self, location, tags, text ): + 'Get the line text drawn on the canvas.' + anchorTowardCenter = settings.Tkinter.N + if location.imag > float( self.canvasHeight ) * 0.1: + anchorTowardCenter = settings.Tkinter.S + if location.real > float( self.canvasWidth ) * 0.7: + anchorTowardCenter += settings.Tkinter.E + else: + anchorTowardCenter += settings.Tkinter.W + return self.canvas.create_text( int( location.real ), int( location.imag ), anchor = anchorTowardCenter, tags = tags, text = text ) + + def getEntityFromName(self, name): + 'Get the entity of the given name.' + for entity in self.repository.displayEntities: + if entity.name == name: + return entity + return None + + def getPhotoButtonGridIncrement( self, commandFunction, fileName, gridPosition ): + 'Get a PhotoImage button, grid the button and increment the grid position.' + gridPosition.increment() + untilDotFileName = self.addPhotoImage( fileName, gridPosition ) + photoImage = self.photoImages[ untilDotFileName ] + photoButton = settings.Tkinter.Button( gridPosition.master, activebackground = 'black', activeforeground = 'white', command = commandFunction, text = untilDotFileName ) + if photoImage != None: + photoButton['image'] = photoImage + photoButton.grid( row = gridPosition.row, column = gridPosition.column, sticky = settings.Tkinter.W ) + return photoButton + + def getRoundedRulingText( self, extraDecimalPlaces, number ): + 'Get the rounded ruling text.' + rulingText = euclidean.getRoundedToPlacesString( extraDecimalPlaces - math.floor( math.log10( self.rulingSeparationWidthMillimeters ) ), number ) + if self.rulingSeparationWidthMillimeters < .99: + return rulingText + if rulingText[ - len('.0') : ] == '.0': + return rulingText[ : - len('.0') ] + return rulingText + + def getRulingSeparationWidthPixels( self, rank ): + 'Get the separation width in pixels.' + return euclidean.getIncrementFromRank( rank ) * self.skein.scale + + def getScrollPaneCenter(self): + 'Get the center of the scroll pane.' + return self.getScrollPaneFraction() + self.canvasScreenCenter + + def getScrollPaneFraction(self): + 'Get the scroll pane top left.' + return complex( self.xScrollbar.get()[0], self.yScrollbar.get()[0] ) + + def getSlideShowDelay(self): + 'Get the slide show delay in milliseconds.' + slideShowDelay = int( round( 1000.0 / self.repository.animationSlideShowRate.value ) ) + return max( slideShowDelay, 1 ) + + def getUpdateSkeinPanes(self): + 'Get the update skein panes.' + layerPlusExtraSpan = self.repository.layer.value + self.repository.layerExtraSpan.value + layersFrom = max( 0, min( self.repository.layer.value, layerPlusExtraSpan ) ) + layersTo = min( len( self.skeinPanes ), max( self.repository.layer.value, layerPlusExtraSpan ) + 1 ) + return self.skeinPanes[ layersFrom : layersTo ] + + def isLineBelowZeroSetLayer(self): + 'Determine if the line index is below zero, and if so set the layer index.' + if self.repository.line.value >= 0: + return False + self.repository.line.value = 0 + if self.repository.layer.value > 0: + self.setLayerIndex( self.repository.layer.value - 1 ) + return True + return False + + def isLineBeyondListSetLayer(self): + 'Determine if the line index is beyond the end of the list, and if so set the layer index.' + coloredLinesLength = len( self.getColoredLines() ) + if self.repository.line.value < coloredLinesLength: + return False + self.repository.line.value = coloredLinesLength - 1 + if self.repository.layer.value < len( self.skeinPanes ) - 1: + self.setLayerIndex( self.repository.layer.value + 1 ) + return True + return False + + def keyPressDown(self, event): + 'The down arrow was pressed.' + self.mouseTool.keyPressDown(event) + + def keyPressLeft(self, event): + 'The left arrow was pressed.' + self.mouseTool.keyPressLeft(event) + + def keyPressReturn(self, event): + 'The return key was pressed.' + self.mouseTool.keyPressReturn(event) + + def keyPressRight(self, event): + 'The right arrow was pressed.' + self.mouseTool.keyPressRight(event) + + def keyPressUp(self, event): + 'The up arrow was pressed.' + self.mouseTool.keyPressUp(event) + + def layerEntryReturnPressed(self, event=None): + 'The layer index entry return was pressed.' + self.setLayerIndex( int( self.layerEntry.get() ) ) + + def limitIndex(self): + 'Limit the index so it is not below zero or above the top.' + self.repository.layer.value = max( 0, self.repository.layer.value ) + self.repository.layer.value = min( len( self.skeinPanes ) - 1, self.repository.layer.value ) + + def limitIndexSetArrowMouseDeleteCanvas(self): + 'Limit the index, set the arrow type, and delete all the canvas items.' + self.limitIndex() + self.arrowType = None + if self.repository.drawArrows.value: + self.arrowType = 'last' + self.canvas.delete( settings.Tkinter.ALL ) + + def lineDive(self): + 'Line dive, go down periodically.' + oldLineDiveButtonText = self.lineDiveButton['text'] + self.cancelTimerResetButtons() + if oldLineDiveButtonText == 'stop': + return + self.lineDiveCycle() + + def lineDiveCycle(self): + 'Start the line dive cycle.' + self.cancelTimer() + self.repository.line.value -= 1 + if self.repository.line.value < 0: + self.repository.line.value = 0 + if self.repository.layer.value == 0: + self.resetPeriodicButtonsText() + self.setLineButtonsState() + return + self.setLayerIndex( self.repository.layer.value - 1 ) + else: + self.updateMouseToolIfSelection() + self.setLineButtonsState() + self.setButtonImageText( self.lineDiveButton, 'stop') + coloredLine = self.getColoredLines()[ self.repository.line.value ] + self.timerID = self.canvas.after( self.getAnimationLineDelay( coloredLine ), self.lineDiveCycle ) + + def lineEntryReturnPressed(self, event=None): + 'The line index entry return was pressed.' + self.repository.line.value = int( self.lineEntry.get() ) + if self.isLineBelowZeroSetLayer(): + return + if self.isLineBeyondListSetLayer(): + return + self.cancelTimerResetButtons() + self.updateMouseToolIfSelection() + self.setLineButtonsState() + + def lineSoar(self): + 'Line soar, go up periodically.' + oldLineSoarButtonText = self.lineSoarButton['text'] + self.cancelTimerResetButtons() + if oldLineSoarButtonText == 'stop': + return + self.lineSoarCycle() + + def lineSoarCycle(self): + 'Start the line soar cycle.' + self.cancelTimer() + self.repository.line.value += 1 + coloredLinesLength = len( self.getColoredLines() ) + if self.repository.line.value >= coloredLinesLength: + self.repository.line.value = coloredLinesLength - 1 + if self.repository.layer.value > len( self.skeinPanes ) - 2: + self.resetPeriodicButtonsText() + self.setLineButtonsState() + return + self.setLayerIndex( self.repository.layer.value + 1 ) + else: + self.updateMouseToolIfSelection() + self.setLineButtonsState() + self.setButtonImageText( self.lineSoarButton, 'stop') + coloredLine = self.getColoredLines()[ self.repository.line.value ] + self.timerID = self.canvas.after( self.getAnimationLineDelay( coloredLine ), self.lineSoarCycle ) + + def motion(self, event): + 'The mouse moved.' + self.mouseTool.motion(event) + + def phoenixUpdate(self): + 'Update the skein, and deiconify a new window and destroy the old.' + self.updateNewDestroyOld( self.getScrollPaneCenter() ) + + def redisplayWindowUpdate(self, event=None): + 'Deiconify a new window and destroy the old.' + self.repository.setToDisplaySave() + self.getCopy().updateDeiconify( self.getScrollPaneCenter() ) + self.root.after( 1, self.root.destroy ) # to get around 'Font Helvetica -12 still in cache.' segmentation bug, instead of simply calling self.root.destroy() + + def relayXview( self, *args ): + 'Relay xview changes.' + self.canvas.xview( *args ) + + def relayYview( self, *args ): + 'Relay yview changes.' + self.canvas.yview( *args ) + + def resetPeriodicButtonsText(self): + 'Reset the text of the periodic buttons.' + self.setButtonImageText( self.diveButton, 'dive') + self.setButtonImageText( self.soarButton, 'soar') + self.setButtonImageText( self.lineDiveButton, 'dive') + self.setButtonImageText( self.lineSoarButton, 'soar') + + def save(self): + 'Set the setting values to the display, save the new values.' + for menuEntity in self.repository.menuEntities: + if menuEntity in self.repository.preferences: + menuEntity.setToDisplay() + settings.writeSettings(self.repository) + + def scaleEntryReturnPressed(self, event=None): + 'The scale entry return was pressed.' + self.repository.scale.value = float( self.scaleEntry.get() ) + self.phoenixUpdate() + + def setButtonImageText( self, button, text ): + 'Set the text of the e periodic buttons.' + photoImage = self.photoImages[ text ] + if photoImage != None: + button['image'] = photoImage + button['text'] = text + + def setDisplayLayerIndex(self): + 'Set the display of the layer index entry field and buttons.' + coloredLines = self.getColoredLines() + isAboveFloor = self.repository.layer.value > 0 + isBelowCeiling = self.repository.layer.value < len( self.skeinPanes ) - 1 + setStateNormalDisabled( isAboveFloor, self.diveButton ) + setStateNormalDisabled( isBelowCeiling, self.soarButton ) + self.setLineButtonsState() + settings.setEntryText( self.layerEntry, self.repository.layer.value ) + settings.setEntryText( self.lineEntry, self.repository.line.value ) + settings.setEntryText( self.scaleEntry, self.repository.scale.value ) + self.mouseTool.update() + + def setInsetToCanvas(self, event=None): + 'Set the repository insets to the canvas.' + if self.root.state() != 'normal': + return + excessExtent = self.highlightThickness + self.highlightThickness + screenHorizontalInset = self.repository.screenHorizontalInset + screenVerticalInset = self.repository.screenVerticalInset + oldHorizontalValue = screenHorizontalInset.value + oldVerticalValue = screenVerticalInset.value + screenHorizontalInset.value = self.root.winfo_screenwidth() - self.canvas.winfo_width() + excessExtent + if not self.yScrollbar.visible: + screenHorizontalInset.value += self.yScrollbar.winfo_reqwidth() + screenHorizontalInset.setStateToValue() + screenVerticalInset.value = self.root.winfo_screenheight() - self.canvas.winfo_height() + excessExtent + if not self.xScrollbar.visible: + screenVerticalInset.value += self.xScrollbar.winfo_reqheight() + screenVerticalInset.setStateToValue() + if oldHorizontalValue != screenHorizontalInset.value or oldVerticalValue != screenVerticalInset.value: + self.repository.setToDisplaySave() + + def setLayerIndex( self, layerIndex ): + 'Set the layer index.' + self.cancelTimerResetButtons() + oldLayerIndex = self.repository.layer.value + self.repository.layer.value = layerIndex + self.limitIndex() + coloredLines = self.getColoredLines() + if self.repository.layer.value < oldLayerIndex: + self.repository.line.value = len( coloredLines ) - 1 + self.lineEntry['to'] = getLengthMinusOneMinimumOne( coloredLines ) + if self.repository.layer.value > oldLayerIndex: + self.repository.line.value = 0 + self.lineEntry['to'] = getLengthMinusOneMinimumOne( coloredLines ) + self.update() + + def setLineButtonsState(self): + 'Set the state of the line buttons.' + coloredLines = self.getColoredLines() + if len(coloredLines) < 1: + print('Warning, there are no coloredLines in setLineButtonsState in tableau for the layer:') + print(self.repository.layer.value) + return + isAboveFloor = self.repository.layer.value > 0 + isBelowCeiling = self.repository.layer.value < len( self.skeinPanes ) - 1 + setStateNormalDisabled( isAboveFloor or self.repository.line.value > 0, self.lineDiveButton ) + setStateNormalDisabled( isBelowCeiling or self.repository.line.value < len( coloredLines ) - 1, self.lineSoarButton ) + self.repository.line.value = max(self.repository.line.value, 0) + self.repository.line.value = min(self.repository.line.value, len(coloredLines) - 1) + gcodeString = '' + if self.repository.showGcode.value: + gcodeString = 'Gcode: ' + coloredLines[self.repository.line.value].displayString + self.gcodeStringVar.set(gcodeString) + self.canvas.delete('selection_line') + self.getDrawnSelectedColoredLine(coloredLines[self.repository.line.value]) + settings.setEntryText(self.lineEntry, self.repository.line.value) + + def setWindowNewMouseTool( self, getNewMouseToolFunction, mouseTool ): + 'Set the getNewMouseTool function and the update function.' + mouseTool.getNewMouseToolFunction = getNewMouseToolFunction + mouseTool.setUpdateFunction( self.activateMouseModeTool ) + + def setWindowToDisplaySavePhoenixUpdate(self, event=None): + 'Set the setting values to the display, save the new values, then call the update function.' + self.repository.setToDisplaySave() + self.phoenixUpdate() + + def setWindowToDisplaySaveUpdate(self, event=None): + 'Set the setting values to the display, save the new values, then call the update function.' + self.repository.setToDisplaySave() + self.update() + + def shiftButtonRelease1(self, event): + 'The button was released while the shift key was pressed.' + self.mouseTool.buttonRelease1( event, True ) + + def shiftMotion(self, event): + 'The mouse moved.' + self.mouseTool.motion( event, True ) + + def soar(self): + 'Soar, go up periodically.' + oldSoarButtonText = self.soarButton['text'] + self.cancelTimerResetButtons() + if oldSoarButtonText == 'stop': + return + self.soarCycle() + + def soarCycle(self): + 'Start the soar cycle.' + self.setLayerIndex(self.repository.layer.value + 1) + if self.repository.layer.value > len( self.skeinPanes ) - 2: + self.resetPeriodicButtonsText() + return + self.setButtonImageText( self.soarButton, 'stop') + self.timerID = self.canvas.after( self.getSlideShowDelay(), self.soarCycle ) + + def updateDeiconify( self, center = complex( 0.5, 0.5 ) ): + 'Update and deiconify the window.' + self.addSettingsMenuSetWindowGeometry( center ) + self.update() + self.root.deiconify() + + def updateMouseToolIfSelection(self): + 'Update the mouse tool if it is a selection tool.' + if self.mouseTool == None: + return + if self.mouseTool.isSelectionTool(): + self.mouseTool.update() + + def updateNewDestroyOld( self, scrollPaneCenter ): + 'Update and deiconify a window and destroy the old.' + self.getCopyWithNewSkein().updateDeiconify( scrollPaneCenter ) + self.root.after(1, self.root.destroy) # to get around 'Font Helvetica -12 still in cache.' segmentation bug, instead of simply calling self.root.destroy() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/tableau.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/tableau.pyc new file mode 100644 index 0000000..a53d89c Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/tableau.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_move.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_move.py new file mode 100644 index 0000000..ca68350 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_move.py @@ -0,0 +1,83 @@ +""" +This page is in the table of contents. +Viewpoint move is a mouse tool to move the viewpoint in the xy plane. + +When the mouse is clicked and dragged on the canvas, viewpoint move will drag the scroll pane accordingly. If the shift key is also pressed, the scroll pane will be moved only in the x or y direction, whichever is largest. + +When the viewpoint move tool is chosen and the canvas has the focus, viewpoint move will listen to the arrow keys. Clicking in the canvas gives the canvas the focus, and when the canvas has the focus a thick black border is drawn around the canvas. When the right arrow key is pressed, viewpoint move will move the scroll pane to the right by a pixel. When the left arrow key is pressed, the scroll pane will be moved a pixel to the left. The up arrow key moves the scroll pane a pixel up and the down arow key moves the scroll pane a pixel down. + +""" + +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_application.skeinforge_plugins.analyze_plugins.analyze_utilities.mouse_tool_base import MouseToolBase +from fabmetheus_utilities import settings + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewMouseTool(): + "Get a new mouse tool." + return ViewpointMove() + + +class ViewpointMove( MouseToolBase ): + "Display the line when it is clicked." + def button1( self, event, shift = False ): + "Print line text and connection line." + self.destroyEverythingGetFocus() + self.buttonOnePressedScreenCoordinate = complex( event.x, event.y ) + self.scrollPaneFraction = self.window.getScrollPaneFraction() + + def buttonRelease1( self, event, shift = False ): + "The left button was released, function." + self.destroyEverything() + + def destroyEverything(self): + "Destroy items." + self.buttonOnePressedScreenCoordinate = None + + def keyPressDown(self, event): + "The down arrow was pressed." + self.setScrollPaneMove( complex( 0.0, 1.0 ) ) + + def keyPressLeft(self, event): + "The left arrow was pressed." + self.setScrollPaneMove( complex( - 1.0, 0.0 ) ) + + def keyPressRight(self, event): + "The right arrow was pressed." + self.setScrollPaneMove( complex( 1.0, 0.0 ) ) + + def keyPressUp(self, event): + "The up arrow was pressed." + self.setScrollPaneMove( complex(0.0, -1.0) ) + + def motion( self, event, shift = False ): + "The mouse moved, function." + if self.buttonOnePressedScreenCoordinate == None: + return + motionCoordinate = complex( event.x, event.y ) + relativeMotion = motionCoordinate - self.buttonOnePressedScreenCoordinate + if shift: + if abs( relativeMotion.real ) > abs( relativeMotion.imag ): + relativeMotion = complex( relativeMotion.real, 0.0 ) + else: + relativeMotion = complex( 0.0, relativeMotion.imag ) + self.relativeMove( relativeMotion ) + + def relativeMove( self, relativeMotion ): + "Move the view given the relative motion." + relativeScreenMotion = complex( relativeMotion.real / float( self.window.screenSize.real ), relativeMotion.imag / float( self.window.screenSize.imag ) ) + moveTo = self.scrollPaneFraction - relativeScreenMotion + self.window.relayXview( settings.Tkinter.MOVETO, moveTo.real ) + self.window.relayYview( settings.Tkinter.MOVETO, moveTo.imag ) + + def setScrollPaneMove( self, relativeMotion ): + "The up arrow was pressed." + self.scrollPaneFraction = self.window.getScrollPaneFraction() + self.relativeMove( relativeMotion ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_move.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_move.pyc new file mode 100644 index 0000000..a0bc787 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_move.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_rotate.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_rotate.py new file mode 100644 index 0000000..984bb0d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_rotate.py @@ -0,0 +1,201 @@ +""" +This page is in the table of contents. +Viewpoint rotate is a mouse tool to rotate the viewpoint around the origin. + +When the mouse is clicked, dragged and released on the canvas, viewpoint rotate will rotate the longitude by the amount the mouse is dragged around the origin. If the mouse is moved towards the origin, the latitude will be increased, so the viewpoint will be closer to the top. If the mouse is moved away from the origin, the latitude will be decreased. If the shift key is also pressed, only the latitude or longitude will be changed, whichever is being changed the most. + +When the viewpoint rotate tool is chosen and the canvas has the focus, viewpoint rotate will listen to the arrow keys. Clicking in the canvas gives the canvas the focus, and when the canvas has the focus a thick black border is drawn around the canvas. When the right arrow key is pressed, viewpoint rotate will increase the preview longitude by one degree. When the left arrow key is pressed, the preview longitude will be decreased. The up arrow key increase the preview latitude by one degree and the down arow decreases the preview latitude. Pressing the key implements the preview. + +""" + +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_application.skeinforge_plugins.analyze_plugins.analyze_utilities.mouse_tool_base import MouseToolBase +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import settings +import math + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getBoundedLatitude( latitude ): + "Get the bounded latitude.later get rounded" + return round( min( 179.9, max( 0.1, latitude ) ), 1 ) + +def getNewMouseTool(): + "Get a new mouse tool." + return ViewpointRotate() + + +class LatitudeLongitude: + "A latitude and longitude." + def __init__( self, buttonOnePressedCanvasCoordinate, newCoordinate, skeinWindow, shift ): + "Set the latitude and longitude." + buttonOnePressedCentered = skeinWindow.getCenteredScreened( buttonOnePressedCanvasCoordinate ) + buttonOnePressedRadius = abs( buttonOnePressedCentered ) + buttonOnePressedComplexMirror = complex( buttonOnePressedCentered.real, - buttonOnePressedCentered.imag ) + buttonOneReleasedCentered = skeinWindow.getCenteredScreened( newCoordinate ) + buttonOneReleasedRadius = abs( buttonOneReleasedCentered ) + pressedReleasedRotationComplex = buttonOneReleasedCentered * buttonOnePressedComplexMirror + self.deltaLatitude = math.degrees( buttonOneReleasedRadius - buttonOnePressedRadius ) + self.originalDeltaLongitude = math.degrees( math.atan2( pressedReleasedRotationComplex.imag, pressedReleasedRotationComplex.real ) ) + self.deltaLongitude = self.originalDeltaLongitude + if skeinWindow.repository.viewpointLatitude.value > 90.0: + self.deltaLongitude = - self.deltaLongitude + if shift: + if abs( self.deltaLatitude ) > abs( self.deltaLongitude ): + self.deltaLongitude = 0.0 + else: + self.deltaLatitude = 0.0 + self.latitude = getBoundedLatitude( skeinWindow.repository.viewpointLatitude.value + self.deltaLatitude ) + self.longitude = round( ( skeinWindow.repository.viewpointLongitude.value + self.deltaLongitude ) % 360.0, 1 ) + + +class ViewpointRotate( MouseToolBase ): + "Display the line when it is clicked." + def button1( self, event, shift = False ): + "Print line text and connection line." + self.destroyEverything() + x = self.canvas.canvasx(event.x) + y = self.canvas.canvasy(event.y) + self.buttonOnePressedCanvasCoordinate = complex(x, y) + + def buttonRelease1( self, event, shift = False ): + "The left button was released, function." + if self.buttonOnePressedCanvasCoordinate == None: + return + x = self.canvas.canvasx(event.x) + y = self.canvas.canvasy(event.y) + buttonOneReleasedCanvasCoordinate = complex(x, y) + self.moveViewpointGivenCoordinates( buttonOneReleasedCanvasCoordinate, shift, self.buttonOnePressedCanvasCoordinate ) + + def destroyEverything(self): + "Destroy items." + self.buttonOnePressedCanvasCoordinate = None + self.keyStartCanvasCoordinate = None + self.relativeLatitude = 0.0 + self.relativeLongitude = 0.5 * math.pi + self.canvas.delete('mouse_item') + + def getMoveCoordinate(self): + "Get the movement coordinate from the class relative latitude and longitude." + motionRadius = ( 0.75 + self.relativeLatitude ) * self.window.getCanvasRadius() + return self.window.getScreenComplex( motionRadius * euclidean.getWiddershinsUnitPolar( self.relativeLongitude ) ) + + def keyPressDown(self, event): + "The down arrow was pressed." + self.keyPressStart() + self.relativeLatitude -= math.radians(1.0) + self.keyPressMotion() + + def keyPressLeft(self, event): + "The left arrow was pressed." + self.keyPressStart() + self.relativeLongitude += math.radians(1.0) + self.keyPressMotion() + + def keyPressMotion(self): + "Move the motion viewpoint for the class key press coordinates." + self.motionGivenCoordinates( self.getMoveCoordinate(), False, self.keyStartCanvasCoordinate ) + + def keyPressReturn(self, event): + "The return key was pressed." + if self.keyStartCanvasCoordinate == None: + return + self.moveViewpointGivenCoordinates( self.getMoveCoordinate(), False, self.keyStartCanvasCoordinate ) + + def keyPressRight(self, event): + "The right arrow was pressed." + self.keyPressStart() + self.relativeLongitude -= math.radians(1.0) + self.keyPressMotion() + + def keyPressStart(self): + "If necessary, destroy everything and calculate the keyStartCanvasCoordinate." + if self.keyStartCanvasCoordinate == None: + self.destroyEverything() + self.keyStartCanvasCoordinate = self.window.getScreenComplex( complex( 0.0, 0.75 * self.window.getCanvasRadius() ) ) + + def keyPressUp(self, event): + "The up arrow was pressed." + self.keyPressStart() + self.relativeLatitude += math.radians(1.0) + self.keyPressMotion() + + def motion( self, event, shift = False ): + "Move the motion viewpoint if the mouse was moved." + if self.buttonOnePressedCanvasCoordinate == None: + return + x = self.canvas.canvasx(event.x) + y = self.canvas.canvasy(event.y) + motionCoordinate = complex(x, y) + self.motionGivenCoordinates( motionCoordinate, shift, self.buttonOnePressedCanvasCoordinate ) + + def motionGivenCoordinates( self, motionCoordinate, shift, startCoordinate ): + "Move the motion viewpoint given the motion coordinates." + latitudeLongitude = LatitudeLongitude( startCoordinate, motionCoordinate, self.window, shift ) + viewVectors = euclidean.ProjectiveSpace().getByLatitudeLongitude( latitudeLongitude.latitude, latitudeLongitude.longitude ) + motionCentered = self.window.getCentered( motionCoordinate ) + motionCenteredNormalized = motionCentered / abs( motionCentered ) + buttonOnePressedCentered = self.window.getCentered( startCoordinate ) + buttonOnePressedAngle = math.degrees( math.atan2( buttonOnePressedCentered.imag, buttonOnePressedCentered.real ) ) + buttonOnePressedLength = abs( buttonOnePressedCentered ) + buttonOnePressedCorner = complex( buttonOnePressedLength, buttonOnePressedLength ) + buttonOnePressedCornerBottomLeft = self.window.getScreenComplex( - buttonOnePressedCorner ) + buttonOnePressedCornerUpperRight = self.window.getScreenComplex( buttonOnePressedCorner ) + motionPressedStart = buttonOnePressedLength * motionCenteredNormalized + motionPressedScreen = self.window.getScreenComplex( motionPressedStart ) + motionColorName = '#4B0082' + motionWidth = 9 + self.canvas.delete('mouse_item') + if abs( latitudeLongitude.deltaLongitude ) > 0.0: + self.canvas.create_arc( + buttonOnePressedCornerBottomLeft.real, + buttonOnePressedCornerBottomLeft.imag, + buttonOnePressedCornerUpperRight.real, + buttonOnePressedCornerUpperRight.imag, + extent = latitudeLongitude.originalDeltaLongitude, + start = buttonOnePressedAngle, + outline = motionColorName, + outlinestipple = self.window.motionStippleName, + style = settings.Tkinter.ARC, + tags = 'mouse_item', + width = motionWidth ) + if abs( latitudeLongitude.deltaLatitude ) > 0.0: + self.canvas.create_line( + motionPressedScreen.real, + motionPressedScreen.imag, + motionCoordinate.real, + motionCoordinate.imag, + fill = motionColorName, + arrow = 'last', + arrowshape = self.window.arrowshape, + stipple = self.window.motionStippleName, + tags = 'mouse_item', + width = motionWidth ) + self.window.getDrawnLineText( motionCoordinate, 'mouse_item', 'Latitude: %s, Longitude: %s' % ( round( latitudeLongitude.latitude ), round( latitudeLongitude.longitude ) ) ) + if self.repository.widthOfAxisPositiveSide.value > 0: + self.window.getDrawnColoredLineMotion( self.window.positiveAxisLineX, viewVectors, self.repository.widthOfAxisPositiveSide.value ) + self.window.getDrawnColoredLineMotion( self.window.positiveAxisLineY, viewVectors, self.repository.widthOfAxisPositiveSide.value ) + self.window.getDrawnColoredLineMotion( self.window.positiveAxisLineZ, viewVectors, self.repository.widthOfAxisPositiveSide.value ) + + def moveViewpointGivenCoordinates( self, moveCoordinate, shift, startCoordinate ): + "Move the viewpoint given the move coordinates." + if abs( startCoordinate - moveCoordinate ) < 3: + startCoordinate = None + self.canvas.delete('mouse_item') + return + latitudeLongitude = LatitudeLongitude( startCoordinate, moveCoordinate, self.window, shift ) + self.repository.viewpointLatitude.value = latitudeLongitude.latitude + self.repository.viewpointLatitude.setStateToValue() + self.repository.viewpointLongitude.value = latitudeLongitude.longitude + self.repository.viewpointLongitude.setStateToValue() + startCoordinate = None + settings.writeSettings(self.repository) + self.window.update() + self.destroyEverything() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_rotate.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_rotate.pyc new file mode 100644 index 0000000..93b2992 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/view_rotate.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_in.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_in.py new file mode 100644 index 0000000..2d0e344 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_in.py @@ -0,0 +1,50 @@ +""" +This page is in the table of contents. +Zoom in is a mouse tool to zoom in the display at the point where the mouse was clicked, increasing the scale by a factor of two. + +""" + +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_application.skeinforge_plugins.analyze_plugins.analyze_utilities.mouse_tool_base import MouseToolBase +from fabmetheus_utilities import settings + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewMouseTool(): + "Get a new mouse tool." + return ZoomIn() + + +class ZoomIn( MouseToolBase ): + "The zoom in mouse tool." + def button1( self, event, shift = False ): + "Print line text and connection line." + scaleSetting = self.window.repository.scale + scaleSetting.value *= self.getMultiplier() + delta = complex( float(event.x) / float( self.window.screenSize.real ), float(event.y) / float( self.window.screenSize.imag ) ) - self.window.canvasScreenCenter + delta *= 1.0 - 1.0 / self.getMultiplier() + scrollPaneCenter = self.window.getScrollPaneCenter() + delta + self.window.updateNewDestroyOld( scrollPaneCenter ) + + def click(self, event=None): + "Set the window mouse tool to this." + self.window.destroyMouseToolRaiseMouseButtons() + self.window.mouseTool = self + self.mouseButton['relief'] = settings.Tkinter.SUNKEN + + def getMultiplier(self): + "Get the scale multiplier." + return 2.0 + + def getReset( self, window ): + "Reset the mouse tool to default." + self.setWindowItems( window ) + self.mouseButton = None + return self diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_in.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_in.pyc new file mode 100644 index 0000000..ff55c41 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_in.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_out.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_out.py new file mode 100644 index 0000000..b104807 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_out.py @@ -0,0 +1,29 @@ +""" +This page is in the table of contents. +Zoom out is a mouse tool to zoom out the display at the point where the mouse was clicked, decreasing the scale by a factor of two. + +""" + +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_application.skeinforge_plugins.analyze_plugins.analyze_utilities import zoom_in +from fabmetheus_utilities import settings + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewMouseTool(): + "Get a new mouse tool." + return ZoomOut() + + +class ZoomOut( zoom_in.ZoomIn ): + "The zoom out mouse tool." + def getMultiplier(self): + "Get the scale multiplier." + return 0.5 diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_out.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_out.pyc new file mode 100644 index 0000000..268d93c Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/analyze_utilities/zoom_out.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/clairvoyance.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/clairvoyance.py new file mode 100644 index 0000000..55698f5 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/clairvoyance.py @@ -0,0 +1,118 @@ +""" +This page is in the table of contents. +Clairvoyance is an analyze plugin to open the gcode file with an outside program. + +The clairvoyance manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Clairvoyance + +==Operation== +The default 'Activate Clairvoyance' checkbox is off. When it is on, the functions described below will work when called from the 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 Clairvoyance' checkbox is on, when clairvoyance is run directly. + +==Settings== +===Gcode Program=== +Default is webbrowser. + +If the 'Gcode Program' is set to webbrowser, the gcode file will be sent to the default browser to be opened. If the 'Gcode Program' is set to a program name, the gcode file will be sent to that program to be opened. A good gcode viewer is Pleasant3D, at: +http://www.pleasantsoftware.com/developer/pleasant3d/index.shtml + +==Examples== +Below are examples of clairvoyance being used. These examples are run in a terminal in the folder which contains Screw Holder_penultimate.gcode and clairvoyance.py. + +> python clairvoyance.py +This brings up the clairvoyance dialog. + +> python clairvoyance.py Screw Holder_penultimate.gcode +The file is opened by an outside program + +""" + + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import subprocess +import sys +import traceback + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return ClairvoyanceRepository() + +def getWindowAnalyzeFile(fileName, repository=None): + 'Open penultimate file with outside program.' + print('') + if repository == None: + repository = settings.getReadRepository(ClairvoyanceRepository()) + gcodeProgram = repository.gcodeProgram.value + if gcodeProgram == '': + print('Warning, nothing will be done in getWindowAnalyzeFile in clairvoyance because the Gcode Program field is empty.') + print('') + return + if gcodeProgram == 'webbrowser': + print('Clairvoyance will use a web browser to open the file:') + print(archive.getSummarizedFileName(fileName)) + settings.openWebPage(fileName) + return + try: + subprocess.Popen([gcodeProgram, fileName]) + print('Clairvoyance has opened the file:') + print(archive.getSummarizedFileName(fileName)) + print('with the gcode program:') + print(gcodeProgram) + except: + print('Warning, getWindowAnalyzeFile in clairvoyance could not open the file:') + print(fileName) + print('with the gcode program:') + print(gcodeProgram) + print('Error traceback is the following:') + traceback.print_exc(file=sys.stdout) + print('') + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + 'Open penultimate file with outside program given text.' + repository = settings.getReadRepository(ClairvoyanceRepository()) + if repository.activateClairvoyance.value: + if not filePenultimateWritten: + archive.writeFileText(fileNamePenultimate, gcodeText) + getWindowAnalyzeFile(fileNamePenultimate, repository) + + +class ClairvoyanceRepository: + 'A class to handle the clairvoyance settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.clairvoyance.html', self) + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Clairvoyance') + self.activateClairvoyance = settings.BooleanSetting().getFromValue('Activate Clairvoyance', self, False) + settings.LabelSeparator().getFromRepository(self) + self.fileNameInput = settings.FileNameInput().getFromFileName([('Gcode text files', '*.gcode')], 'Open File to Generate Clairvoyances for', self, '') + self.gcodeProgram = settings.StringSetting().getFromValue('Gcode Program:', self, 'webbrowser') + self.executeTitle = 'Clairvoyance' + + def execute(self): + 'Write button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled, ['_comment'] ) + for fileName in fileNames: + getWindowAnalyzeFile(fileName) + + +def main(): + 'Display the clairvoyance dialog.' + if len(sys.argv) > 1: + getWindowAnalyzeFile(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/clairvoyance.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/clairvoyance.pyc new file mode 100644 index 0000000..f5dbd40 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/clairvoyance.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/comment.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/comment.py new file mode 100644 index 0000000..184af11 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/comment.py @@ -0,0 +1,170 @@ +""" +This page is in the table of contents. +Comment is an analyze plugin to comment a gcode file. + +The comment manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Comment + +==Operation== +The default 'Activate Comment' checkbox is off. When it is on, the file will be commented when called from the skeinforge toolchain, when it is off, the file will not be commented when called from the toolchain. The file will still be commented, whether or not the 'Activate Comment' checkbox is on, when comment is run directly. + +==Gcodes== +An explanation of the gcodes is at: +http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter + +and at: +http://reprap.org/bin/view/Main/MCodeReference + +A gode example is at: +http://forums.reprap.org/file.php?12,file=565 + +==Examples== +Below are examples of comment being used. These examples are run in a terminal in the folder which contains Screw_Holder_penultimate.gcode and comment.py. + +> python comment.py +This brings up the comment dialog. + +> python comment.py Screw Holder_penultimate.gcode +The comment file is saved as Screw_Holder_penultimate_comment.gcode + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import cStringIO +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return CommentRepository() + +def getWindowAnalyzeFile(fileName): + "Comment a gcode file." + gcodeText = archive.getFileText(fileName) + return getWindowAnalyzeFileGivenText(fileName, gcodeText) + +def getWindowAnalyzeFileGivenText(fileName, gcodeText): + "Write a commented gcode file for a gcode file." + skein = CommentSkein() + skein.parseGcode(gcodeText) + archive.writeFileMessageEnd('_comment.gcode', fileName, skein.output.getvalue(), 'The commented file is saved as ') + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + "Write a commented gcode file for a skeinforge gcode file, if 'Write Commented File for Skeinforge Chain' is selected." + repository = settings.getReadRepository( CommentRepository() ) + if gcodeText == '': + gcodeText = archive.getFileText( fileNameSuffix ) + if repository.activateComment.value: + getWindowAnalyzeFileGivenText( fileNameSuffix, gcodeText ) + + +class CommentRepository: + "A class to handle the comment settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.comment.html', self) + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Comment') + self.activateComment = settings.BooleanSetting().getFromValue('Activate Comment', self, False ) + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File to Write Comments for', self, '') + self.executeTitle = 'Write Comments' + + def execute(self): + "Write button has been clicked." + fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled, ['_comment'] ) + for fileName in fileNames: + getWindowAnalyzeFile(fileName) + + +class CommentSkein: + "A class to comment a gcode skein." + def __init__(self): + self.oldLocation = None + self.output = cStringIO.StringIO() + + def addComment( self, comment ): + "Add a gcode comment and a newline to the output." + self.output.write( "( " + comment + " )\n" ) + + def linearMove( self, splitLine ): + "Comment a linear move." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.addComment( "Linear move to " + str( location ) + "." ); + self.oldLocation = location + + def parseGcode( self, gcodeText ): + "Parse gcode text and store the commented gcode." + lines = archive.getTextLines(gcodeText) + for line in lines: + self.parseLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the commented gcode." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + elif firstWord == 'G2': + self.setHelicalMoveEndpoint(splitLine) + self.addComment( "Helical clockwise move to " + str( self.oldLocation ) + "." ) + elif firstWord == 'G3': + self.setHelicalMoveEndpoint(splitLine) + self.addComment( "Helical counterclockwise move to " + str( self.oldLocation ) + "." ) + elif firstWord == 'G21': + self.addComment( "Set units to mm." ) + elif firstWord == 'G28': + self.addComment( "Start at home." ) + elif firstWord == 'G90': + self.addComment( "Set positioning to absolute." ) + elif firstWord == 'M101': + self.addComment( "Extruder on, forward." ); + elif firstWord == 'M102': + self.addComment( "Extruder on, reverse." ); + elif firstWord == 'M103': + self.addComment( "Extruder off." ) + elif firstWord == 'M104': + self.addComment( "Set temperature to " + str( gcodec.getDoubleAfterFirstLetter(splitLine[1]) ) + " C." ) + elif firstWord == 'M105': + self.addComment( "Custom code for temperature reading." ) + elif firstWord == 'M106': + self.addComment( "Turn fan on." ) + elif firstWord == 'M107': + self.addComment( "Turn fan off." ) + elif firstWord == 'M108': + self.addComment( "Set extruder speed to " + str( gcodec.getDoubleAfterFirstLetter(splitLine[1]) ) + "." ) + self.output.write(line + '\n') + + def setHelicalMoveEndpoint( self, splitLine ): + "Get the endpoint of a helical move." + if self.oldLocation == None: + print( "A helical move is relative and therefore must not be the first move of a gcode file." ) + return + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + location += self.oldLocation + self.oldLocation = location + + +def main(): + "Display the comment dialog." + if len(sys.argv) > 1: + getWindowAnalyzeFile(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/comment.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/comment.pyc new file mode 100644 index 0000000..9236a81 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/comment.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/__init__.py new file mode 100644 index 0000000..58ec332 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 4 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/postscript.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/postscript.py new file mode 100644 index 0000000..41fb8d8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/postscript.py @@ -0,0 +1,95 @@ +""" +This page is in the table of contents. +Postscript is an export canvas plugin to export the canvas to a postscript file. + +When the export menu item in the file menu in an analyze viewer tool, like skeinlayer or skeiniso is clicked, the postscript dialog will be displayed. When the 'Export to Postscript' button on that dialog is clicked, the canvas will be exported as a postscript file. If the 'Postscript Program' is set to a program name, the postscript file will be sent to that program to be opened. The default is gimp, the Gnu Image Manipulation Program (Gimp), which is open source, can open postscript and save in a variety of formats. It is available at: +http://www.gimp.org/ + +If furthermore the 'File Extension' is set to a file extension, the postscript file will be sent to the program, along with the file extension for the converted output. The default is blank because some systems do not have an image conversion program; if you have or will install an image conversion program, a common 'File Extension' is png. A good open source conversion program is Image Magick, which is available at: +http://www.imagemagick.org/script/index.php + +An export canvas plugin is a script in the export_canvas_plugins folder which has the function getNewRepository, and which has a repository class with the functions setCanvasFileNameSuffix to set variables and execute to save the file. It is meant to be run from an analyze viewer tool, like skeinlayer or skeiniso. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin a lower case name. + +""" + + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import cStringIO +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return PostscriptRepository() + + +class PostscriptRepository: + "A class to handle the export settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository( + 'skeinforge_application.skeinforge_plugins.analyze_plugins.export_canvas_plugins.postscript.html', self) + self.fileExtension = settings.StringSetting().getFromValue('File Extension:', self, '') + self.postscriptProgram = settings.StringSetting().getFromValue('Postscript Program:', self, 'gimp') + + def execute(self): + "Convert to postscript button has been clicked." + "Export the canvas as a postscript file." + postscriptFileName = archive.getFilePathWithUnderscoredBasename( self.fileName, self.suffix ) + boundingBox = self.canvas.bbox( settings.Tkinter.ALL ) # tuple (w, n, e, s) + boxW = boundingBox[0] + boxN = boundingBox[1] + boxWidth = boundingBox[2] - boxW + boxHeight = boundingBox[3] - boxN + print('Exported postscript file saved as ' + postscriptFileName ) + self.canvas.postscript( file = postscriptFileName, height = boxHeight, width = boxWidth, pageheight = boxHeight, pagewidth = boxWidth, x = boxW, y = boxN ) + fileExtension = self.fileExtension.value + postscriptProgram = self.postscriptProgram.value + if postscriptProgram == '': + return + postscriptFilePath = '"' + os.path.normpath( postscriptFileName ) + '"' # " to send in file name with spaces + shellCommand = postscriptProgram + ' ' + postscriptFilePath + print('') + if fileExtension == '': + print('Sending the shell command:') + print(shellCommand) + commandResult = os.system(shellCommand) + if commandResult != 0: + print('It may be that the system could not find the %s program.' % postscriptProgram ) + print('If so, try installing the %s program or look for another one, like the Gnu Image Manipulation Program (Gimp) which can be found at:' % postscriptProgram ) + print('http://www.gimp.org/') + return + convertedFileName = archive.getFilePathWithUnderscoredBasename( postscriptFilePath, '.' + fileExtension + '"') + shellCommand += ' ' + convertedFileName + print('Sending the shell command:') + print(shellCommand) + commandResult = os.system(shellCommand) + if commandResult != 0: + print('The %s program could not convert the postscript to the %s file format.' % ( postscriptProgram, fileExtension ) ) + print('Try installing the %s program or look for another one, like Image Magick which can be found at:' % postscriptProgram ) + print('http://www.imagemagick.org/script/index.php') + + def setCanvasFileNameSuffix( self, canvas, fileName, suffix ): + "Set the canvas and initialize the execute title." + self.canvas = canvas + self.executeTitle = 'Export to Postscript' + self.fileName = fileName + self.suffix = suffix + '.ps' + + +def main(): + "Display the file or directory dialog." + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/scalable_vector_graphics.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/scalable_vector_graphics.py new file mode 100644 index 0000000..8113fd0 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/export_canvas_plugins/scalable_vector_graphics.py @@ -0,0 +1,137 @@ +""" +This page is in the table of contents. +Scalable vector graphics is an export canvas plugin to export the canvas to a scalable vector graphics (.svg) file. + +When the export menu item in the file menu in an analyze viewer tool, like skeinlayer or skeiniso is clicked, the postscript dialog will be displayed. When the 'Export to Scalable Vector Graphics' button on that dialog is clicked, the canvas will be exported as a scalable vector graphics file. If the 'Scalable Vector Graphics Program' is set to the default 'webbrowser', the scalable vector graphics file will be sent to the default browser to be opened. If the 'Scalable Vector Graphics Program' is set to a program name, the scalable vector graphics file will be sent to that program to be opened. + +If furthermore the 'File Extension' is set to a file extension, the scalable vector graphics file will be sent to the program, along with the file extension for the converted output. The default is blank because some systems do not have an image conversion program; if you have or will install an image conversion program, a common 'File Extension' is png. A good open source conversion program is Image Magick, which is available at: +http://www.imagemagick.org/script/index.php + +An export canvas plugin is a script in the export_canvas_plugins folder which has the function getNewRepository, and which has a repository class with the functions setCanvasFileNameSuffix to set variables and execute to save the file. It is meant to be run from an analyze viewer tool, like skeinlayer or skeiniso. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin a lower case name. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import cStringIO +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return ScalableVectorGraphicsRepository() + +def parseLineReplace( firstWordTable, line, output ): + "Parse the line and replace it if the first word of the line is in the first word table." + firstWord = gcodec.getFirstWordFromLine(line) + if firstWord in firstWordTable: + line = firstWordTable[ firstWord ] + gcodec.addLineAndNewlineIfNecessary( line, output ) + + +class ScalableVectorGraphicsRepository: + "A class to handle the export settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository( + 'skeinforge_application.skeinforge_plugins.analyze_plugins.export_canvas_plugins.scalable_vector_graphics.html', self) + self.fileExtension = settings.StringSetting().getFromValue('File Extension:', self, '') + self.svgViewer = settings.StringSetting().getFromValue('SVG Viewer:', self, 'webbrowser') + + def addCanvasLineToOutput( self, canvasLinesOutput, objectIDNumber ): + "Add the canvas line to the output." + coordinates = self.canvas.coords( objectIDNumber ) + xBegin = coordinates[0] - self.boxW + xEnd = coordinates[2] - self.boxW + yBegin = coordinates[1] - self.boxN + yEnd = coordinates[3] - self.boxN + west = self.boxW + color = self.canvas.itemcget( objectIDNumber, 'fill') + width = self.canvas.itemcget( objectIDNumber, 'width') + line = '\n' % ( xBegin, yBegin, xEnd, yEnd, color, width ) + canvasLinesOutput.write(line + '\n') + + def execute(self): + "Export the canvas as an svg file." + svgFileName = archive.getFilePathWithUnderscoredBasename( self.fileName, self.suffix ) + boundingBox = self.canvas.bbox( settings.Tkinter.ALL ) # tuple (w, n, e, s) + self.boxW = boundingBox[0] + self.boxN = boundingBox[1] + boxWidth = boundingBox[2] - self.boxW + boxHeight = boundingBox[3] - self.boxN + print('Exported svg file saved as ' + svgFileName ) + svgTemplateText = archive.getFileText(archive.getTemplatesPath('canvas_template.svg')) + output = cStringIO.StringIO() + lines = archive.getTextLines( svgTemplateText ) + firstWordTable = {} + firstWordTable['height="999px"'] = ' height="%spx"' % int( round( boxHeight ) ) + firstWordTable[''] = self.getCanvasLinesOutput() + firstWordTable['replaceLineWithTitle'] = archive.getSummarizedFileName( self.fileName ) + firstWordTable['width="999px"'] = ' width="%spx"' % int( round( boxWidth ) ) + for line in lines: + parseLineReplace( firstWordTable, line, output ) + archive.writeFileText( svgFileName, output.getvalue() ) + fileExtension = self.fileExtension.value + svgViewer = self.svgViewer.value + if svgViewer == '': + return + if svgViewer == 'webbrowser': + settings.openWebPage( svgFileName ) + return + svgFilePath = '"' + os.path.normpath( svgFileName ) + '"' # " to send in file name with spaces + shellCommand = svgViewer + ' ' + svgFilePath + print('') + if fileExtension == '': + print('Sending the shell command:') + print(shellCommand) + commandResult = os.system(shellCommand) + if commandResult != 0: + print('It may be that the system could not find the %s program.' % svgViewer ) + print('If so, try installing the %s program or look for another svg viewer, like Netscape which can be found at:' % svgViewer ) + print('http://www.netscape.org/') + return + convertedFileName = archive.getFilePathWithUnderscoredBasename( svgFilePath, '.' + fileExtension + '"') + shellCommand += ' ' + convertedFileName + print('Sending the shell command:') + print(shellCommand) + commandResult = os.system(shellCommand) + if commandResult != 0: + print('The %s program could not convert the svg to the %s file format.' % ( svgViewer, fileExtension ) ) + print('Try installing the %s program or look for another one, like Image Magick which can be found at:' % svgViewer ) + print('http://www.imagemagick.org/script/index.php') + + def getCanvasLinesOutput(self): + "Add the canvas line to the output." + canvasLinesOutput = cStringIO.StringIO() + objectIDNumbers = self.canvas.find_all() + for objectIDNumber in objectIDNumbers: + if self.canvas.type( objectIDNumber ) == 'line': + self.addCanvasLineToOutput( canvasLinesOutput, objectIDNumber ) + return canvasLinesOutput.getvalue() + + def setCanvasFileNameSuffix( self, canvas, fileName, suffix ): + "Set the canvas and initialize the execute title." + self.canvas = canvas + self.executeTitle = 'Convert to Scalable Vector Graphics' + self.fileName = fileName + self.suffix = suffix + '.svg' + + +def main(): + "Display the file or directory dialog." + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/interpret.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/interpret.py new file mode 100644 index 0000000..b3b2f42 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/interpret.py @@ -0,0 +1,66 @@ +""" +This page is in the table of contents. +Interpret is an analyze plugin to interpret a file, turning a 2D file into svg and a 3D file into constructive solid geometry xml. + +The comment manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Interpret + +==Operation== +The default 'Activate Interpret' checkbox is off. When it is on, the functions described below will work when called from the skeinforge toolchain, when it is off, the functions will not be called from the tool chain. The functions will still be called, whether or not the 'Activate Interpret' checkbox is on, when interpret is run directly. + +==Settings== +===Print Interpretion=== +Default is off. + +When selected, the xml text will be printed to the console. + +===Text Program=== +Default is webbrowser. + +If the 'Text Program' is set the default 'webbrowser', the XML file will be sent to the default browser to be opened. If the 'Text Program' is set to a program name, the XML file will be sent to that program to be opened. + +==Examples== +Below are examples of interpret being used. These examples are run in a terminal in the folder which contains Screw_Holder.stl and interpret.py. + +> python interpret.py +This brings up the interpret dialog. + +> python interpret.py Screw_Holder.stl +The comment file is saved as Screw_Holder_interpret.xml + +""" + +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 fabmetheus_utilities import settings +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return fabmetheus_interpret.InterpretRepository() + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + "Write file interpretation, if activate interpret is selected." + repository = settings.getReadRepository(getNewRepository()) + if repository.activateInterpret.value: + fabmetheus_interpret.getWindowAnalyzeFile(fileName) + + +def main(): + "Display the interpret dialog." + if len(sys.argv) > 1: + fabmetheus_interpret.getWindowAnalyzeFile(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/interpret.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/interpret.pyc new file mode 100644 index 0000000..0530b4a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/interpret.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeiniso.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeiniso.py new file mode 100644 index 0000000..c8e257a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeiniso.py @@ -0,0 +1,886 @@ +""" +This page is in the table of contents. +Skeiniso is an analyze viewer to display a gcode file in an isometric view. + +The skeiniso manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Skeiniso + +==Operation== +The default 'Activate Skeiniso' checkbox is off. When it is on, the functions described below will work when called from the 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 Skeiniso' checkbox is on, when skeiniso is run directly. + +Skeiniso requires skeinforge comments in the gcode file to distinguish the loops and perimeters. If the comments are deleted, all threads will be displayed as generic threads. To get the penultimate file of the tool chain, just before export deletes the comments, select 'Save Penultimate Gcode' in export, and open the gcode file with the suffix '_penultimate.gcode' with skeiniso. + +The viewer is simple, the viewpoint can only be moved in a sphere around the center of the model by changing the viewpoint latitude and longitude. Different regions of the model can be hidden by setting the width of the thread to zero. The alternating bands act as contour bands and their brightness and width can be changed. + +==Settings== +===Animation=== +====Animation Line Quickening==== +Default is one. + +The quickness of the tool animation over the quickness of the actual tool. + +====Animation Slide Show Rate==== +Default is two layers per second. + +The rate, in layers per second, at which the layer changes when the soar or dive button is pressed.. + +===Axis Rulings=== +Default is on. + +When selected, rulings will be drawn on the axis lines. + +===Banding=== +====Band Height==== +Default is five layers. + +Defines the height of the band in layers, a pair of bands is twice that height. + +====Bottom Band Brightness==== +Default is 0.7. + +Defines the ratio of the brightness of the bottom band over the brightness of the top band. The higher it is the brighter the bottom band will be. + +====Bottom Layer Brightness==== +Default is one. + +Defines the ratio of the brightness of the bottom layer over the brightness of the top layer. With a low bottom layer brightness ratio the bottom of the model will be darker than the top of the model, as if it was being illuminated by a light just above the top. + +====Bright Band Start==== +Default choice is 'From the Top'. + +The button group that determines where the bright band starts from. + +=====From the Bottom===== +When selected, the bright bands will start from the bottom. + +=====From the Top===== +When selected, the bright bands will start from the top. + +===Draw Arrows=== +Default is on. + +When selected, arrows will be drawn at the end of each line segment. + +===Export Menu=== +When the submenu in the export menu item in the file menu is clicked, an export canvas dialog will be displayed, which can export the canvas to a file. + +===Go Around Extruder Off Travel=== +Default is off. + +When selected, the display will include the travel when the extruder is off, which means it will include the nozzle wipe path if any. + +===Layers=== +====Layer==== +Default is zero. + +On the display window, the Up button increases the 'Layer' by one, and the Down button decreases the layer by one. When the layer displayed in the layer spin box is changed then is hit, the layer shown will be set to the spin box, to a mimimum of zero and to a maximum of the highest index layer.The Soar button increases the layer at the 'Animation Slide Show Rate', and the Dive (double left arrow button beside the layer field) button decreases the layer at the slide show rate. + +====Layer Extra Span==== +Default is a huge number. + +The viewer will draw the layers in the range including the 'Layer' index and the 'Layer' index plus the 'Layer Extra Span'. If the 'Layer Extra Span' is negative, the layers viewed will start at the 'Layer' index, plus the 'Layer Extra Span', and go up to and include the 'Layer' index. If the 'Layer Extra Span' is zero, only the 'Layer' index layer will be displayed. If the 'Layer Extra Span' is positive, the layers viewed will start at the 'Layer' index, and go up to and include the 'Layer' index plus the 'Layer Extra Span'. + +===Line=== +Default is zero. + +The index of the selected line on the layer that is highlighted when the 'Display Line' mouse tool is chosen. The line spin box up button increases the 'Line' by one. If the line index of the layer goes over the index of the last line, the layer index will be increased by one and the new line index will be zero. The down button decreases the line index by one. If the line index goes below the index of the first line, the layer index will be decreased by one and the new line index will be at the last line. When the line displayed in the line field is changed then is hit, the line shown will be set to the line field, to a mimimum of zero and to a maximum of the highest index line. The Soar button increases the line at the speed at which the extruder would move, times the 'Animation Line Quickening' ratio, and the Dive (double left arrow button beside the line field) button decreases the line at the animation line quickening ratio. + +===Mouse Mode=== +Default is 'Display Line'. + +The mouse tool can be changed from the 'Mouse Mode' menu button or picture button. The mouse tools listen to the arrow keys when the canvas has the focus. Clicking in the canvas gives the canvas the focus, and when the canvas has the focus a thick black border is drawn around the canvas. + +====Display Line==== +The 'Display Line' tool will display the highlight the selected line, and display the file line count, counting from one, and the gcode line itself. When the 'Display Line' tool is active, clicking the canvas will select the nearest line to the mouse click. + +====Viewpoint Move==== +The 'Viewpoint Move' tool will move the viewpoint in the xy plane when the mouse is clicked and dragged on the canvas. + +====Viewpoint Rotate==== +The 'Viewpoint Rotate' tool will rotate the viewpoint around the origin, when the mouse is clicked and dragged on the canvas, or the arrow keys have been used and is pressed. The viewpoint can also be moved by dragging the mouse. The viewpoint latitude will be increased when the mouse is dragged from the center towards the edge. The viewpoint longitude will be changed by the amount around the center the mouse is dragged. This is not very intuitive, but I don't know how to do this the intuitive way and I have other stuff to develop. If the shift key is pressed; if the latitude is changed more than the longitude, only the latitude will be changed, if the longitude is changed more only the longitude will be changed. + +===Number of Fill Layers=== +====Number of Fill Bottom Layers==== +Default is one. + +The "Number of Fill Bottom Layers" is the number of layers at the bottom which will be colored olive. + +===Number of Fill Top Layers=== +Default is one. + +The "Number of Fill Top Layers" is the number of layers at the top which will be colored blue. + +===Scale=== +Default is ten. + +The scale setting is the scale of the image in pixels per millimeter, the higher the number, the greater the size of the display. + +The zoom in mouse tool will zoom in the display at the point where the mouse was clicked, increasing the scale by a factor of two. The zoom out tool will zoom out the display at the point where the mouse was clicked, decreasing the scale by a factor of two. + +===Screen Inset=== +====Screen Horizontal Inset==== +Default is one hundred. + +The "Screen Horizontal Inset" determines how much the canvas will be inset in the horizontal direction from the edge of screen, the higher the number the more it will be inset and the smaller it will be. + +====Screen Vertical Inset==== +Default is two hundred and twenty. + +The "Screen Vertical Inset" determines how much the canvas will be inset in the vertical direction from the edge of screen, the higher the number the more it will be inset and the smaller it will be.. + +===Viewpoint=== +====Viewpoint Latitude==== +Default is fifteen degrees. + +The "Viewpoint Latitude" is the latitude of the viewpoint, a latitude of zero is the top pole giving a top view, a latitude of ninety gives a side view and a latitude of 180 gives a bottom view. + +====Viewpoint Longitude==== +Default is 210 degrees. + +The "Viewpoint Longitude" is the longitude of the viewpoint. + +===Width=== +The width of each type of thread and of each axis can be changed. If the width is set to zero, the thread will not be visible. + +====Width of Axis Negative Side==== +Default is two. + +Defines the width of the negative side of the axis. + +====Width of Axis Positive Side==== +Default is six. + +Defines the width of the positive side of the axis. + +====Width of Infill Thread==== +Default is one. + +The "Width of Infill Thread" sets the width of the green extrusion threads, those threads which are not loops and not part of the raft. + +====Width of Fill Bottom Thread==== +Default is two. + +The "Width of Fill Bottom Thread" sets the width of the olive extrusion threads at the bottom of the model. + +====Width of Fill Top Thread==== +Default is two. + +The "Width of Fill Top Thread" sets the width of the blue extrusion threads at the top of the model. + +====Width of Loop Thread==== +Default is three. + +The "Width of Loop Thread" sets the width of the yellow loop threads, which are not perimeters. + +====Width of Perimeter Inside Thread==== +Default is eight. + +The "Width of Perimeter Inside Thread" sets the width of the orange inside perimeter threads. + +====Width of Perimeter Outside Thread==== +Default is eight. + +The "Width of Perimeter Outside Thread" sets the width of the red outside perimeter threads. + +====Width of Raft Thread==== +Default is one. + +The "Width of Raft Thread" sets the width of the brown raft threads. + +====Width of Selection Thread==== +Default is six. + +The "Width of Selection Thread" sets the width of the selected line. + +====Width of Travel Thread==== +Default is zero. + +The "Width of Travel Thread" sets the width of the grey extruder off travel threads. + +==Icons== +The dive, soar and zoom icons are from Mark James' soarSilk icon set 1.3 at: +http://www.famfamfam.com/lab/icons/silk/ + +==Gcodes== +An explanation of the gcodes is at: +http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter + +and at: +http://reprap.org/bin/view/Main/MCodeReference + +A gode example is at: +http://forums.reprap.org/file.php?12,file=565 + +==Examples== +Below are examples of skeiniso being used. These examples are run in a terminal in the folder which contains Screw Holder_penultimate.gcode and skeiniso.py. + +> python skeiniso.py +This brings up the skeiniso dialog. + +> python skeiniso.py Screw Holder_penultimate.gcode +This brings up the skeiniso viewer to view the gcode file. + +""" + +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 fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import display_line +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import tableau +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import view_move +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import view_rotate +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def compareLayerSequence( first, second ): + "Get comparison in order to sort skein panes in ascending order of layer zone index then sequence index." + if first.layerZoneIndex < second.layerZoneIndex: + return - 1 + if first.layerZoneIndex > second.layerZoneIndex: + return 1 + if first.sequenceIndex < second.sequenceIndex: + return - 1 + return int( first.sequenceIndex > second.sequenceIndex ) + +def getNewRepository(): + 'Get new repository.' + return SkeinisoRepository() + +def getWindowAnalyzeFile(fileName): + "Skeiniso a gcode file." + gcodeText = archive.getFileText(fileName) + return getWindowAnalyzeFileGivenText(fileName, gcodeText) + +def getWindowAnalyzeFileGivenText( fileName, gcodeText, repository=None): + "Display a skeiniso gcode file for a gcode file." + if gcodeText == '': + return None + if repository == None: + repository = settings.getReadRepository( SkeinisoRepository() ) + skeinWindow = getWindowGivenTextRepository( fileName, gcodeText, repository ) + skeinWindow.updateDeiconify() + return skeinWindow + +def getWindowGivenTextRepository( fileName, gcodeText, repository ): + "Display the gcode text in a skeiniso viewer." + skein = SkeinisoSkein() + skein.parseGcode( fileName, gcodeText, repository ) + return SkeinWindow( repository, skein ) + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + "Write a skeinisoed gcode file for a skeinforge gcode file, if 'Activate Skeiniso' is selected." + try: + import Tkinter + except: + print('Warning, skeiniso will do nothing because Tkinter is not installed.') + return + repository = settings.getReadRepository( SkeinisoRepository() ) + if repository.activateSkeiniso.value: + gcodeText = archive.getTextIfEmpty( fileNameSuffix, gcodeText ) + return getWindowAnalyzeFileGivenText( fileNameSuffix, gcodeText, repository ) + + +class SkeinisoRepository( tableau.TableauRepository ): + "A class to handle the skeiniso settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.skeiniso.html', self) + self.baseNameSynonym = 'behold.csv' + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File for Skeiniso', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Skeiniso') + self.activateSkeiniso = settings.BooleanSetting().getFromValue('Activate Skeiniso', self, False) + self.addAnimation() + self.axisRulings = settings.BooleanSetting().getFromValue('Axis Rulings', self, True ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Banding -', self ) + self.bandHeight = settings.IntSpinUpdate().getFromValue( 0, 'Band Height (layers):', self, 10, 5 ) + self.bottomBandBrightness = settings.FloatSpinUpdate().getFromValue( 0.0, 'Bottom Band Brightness (ratio):', self, 1.0, 0.7 ) + self.bottomLayerBrightness = settings.FloatSpinUpdate().getFromValue( 0.0, 'Bottom Layer Brightness (ratio):', self, 1.0, 1.0 ) + self.brightBandStart = settings.MenuButtonDisplay().getFromName('Bright Band Start:', self ) + self.fromTheBottom = settings.MenuRadio().getFromMenuButtonDisplay( self.brightBandStart, 'From the Bottom', self, False ) + self.fromTheTop = settings.MenuRadio().getFromMenuButtonDisplay( self.brightBandStart, 'From the Top', self, True ) + settings.LabelSeparator().getFromRepository(self) + self.drawArrows = settings.BooleanSetting().getFromValue('Draw Arrows', self, False ) + self.goAroundExtruderOffTravel = settings.BooleanSetting().getFromValue('Go Around Extruder Off Travel', self, False ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Layers -', self ) + self.layer = settings.IntSpinNotOnMenu().getSingleIncrementFromValue( 0, 'Layer (index):', self, 912345678, 0 ) + self.layerExtraSpan = settings.IntSpinUpdate().getSingleIncrementFromValue( - 912345678, 'Layer Extra Span (integer):', self, 912345678, 912345678 ) + settings.LabelSeparator().getFromRepository(self) + self.line = settings.IntSpinNotOnMenu().getSingleIncrementFromValue( 0, 'Line (index):', self, 912345678, 0 ) + self.mouseMode = settings.MenuButtonDisplay().getFromName('Mouse Mode:', self ) + self.displayLine = settings.MenuRadio().getFromMenuButtonDisplay( self.mouseMode, 'Display Line', self, True ) + self.viewMove = settings.MenuRadio().getFromMenuButtonDisplay( self.mouseMode, 'View Move', self, False ) + self.viewRotate = settings.MenuRadio().getFromMenuButtonDisplay( self.mouseMode, 'View Rotate', self, False ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Number of Fill Layers -', self ) + self.numberOfFillBottomLayers = settings.IntSpinUpdate().getFromValue( 0, 'Number of Fill Bottom Layers (integer):', self, 5, 1 ) + self.numberOfFillTopLayers = settings.IntSpinUpdate().getFromValue( 0, 'Number of Fill Top Layers (integer):', self, 5, 1 ) + settings.LabelSeparator().getFromRepository(self) + self.addScaleScreenSlide() + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Viewpoint -', self ) + self.viewpointLatitude = settings.FloatSpin().getFromValue( 0.0, 'Viewpoint Latitude (degrees):', self, 180.0, 15.0 ) + self.viewpointLongitude = settings.FloatSpin().getFromValue( 0.0, 'Viewpoint Longitude (degrees):', self, 360.0, 210.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Width -', self ) + self.widthOfAxisNegativeSide = settings.IntSpinUpdate().getFromValue( 0, 'Width of Axis Negative Side (pixels):', self, 10, 2 ) + self.widthOfAxisPositiveSide = settings.IntSpinUpdate().getFromValue( 0, 'Width of Axis Positive Side (pixels):', self, 10, 6 ) + self.widthOfFillBottomThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Fill Bottom Thread (pixels):', self, 10, 2 ) + self.widthOfFillTopThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Fill Top Thread (pixels):', self, 10, 2 ) + self.widthOfInfillThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Infill Thread (pixels):', self, 10, 1 ) + self.widthOfLoopThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Loop Thread (pixels):', self, 10, 2 ) + self.widthOfPerimeterInsideThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Perimeter Inside Thread (pixels):', self, 10, 8 ) + self.widthOfPerimeterOutsideThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Perimeter Outside Thread (pixels):', self, 10, 8 ) + self.widthOfRaftThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Raft Thread (pixels):', self, 10, 1 ) + self.widthOfSelectionThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Selection Thread (pixels):', self, 10, 6 ) + self.widthOfTravelThread = settings.IntSpinUpdate().getFromValue( 0, 'Width of Travel Thread (pixels):', self, 10, 0 ) + self.executeTitle = 'Skeiniso' + + def execute(self): + "Write button has been clicked." + fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled ) + for fileName in fileNames: + getWindowAnalyzeFile(fileName) + + +class SkeinisoSkein: + "A class to write a get a scalable vector graphics text for a gcode skein." + def __init__(self): + self.coloredThread = [] + self.feedRateMinute = 960.1 + self.hasANestedRingBeenReached = False + self.isLoop = False + self.isPerimeter = False + self.isOuter = False + self.isThereALayerStartWord = False + self.layerCount = settings.LayerCount() + self.layerTops = [] + self.lineIndex = 0 + self.oldLayerZoneIndex = 0 + self.oldZ = - 999987654321.0 + self.skeinPane = None + self.skeinPanes = [] + self.thirdLayerThickness = 0.133333 + + def addToPath( self, line, location ): + 'Add a point to travel and maybe extrusion.' + if self.oldLocation == None: + return + begin = self.scale * self.oldLocation - self.scaleCenterBottom + end = self.scale * location - self.scaleCenterBottom + displayString = '%s %s' % ( self.lineIndex + 1, line ) + tagString = 'colored_line_index: %s %s' % ( len( self.skeinPane.coloredLines ), len( self.skeinPanes ) - 1 ) + coloredLine = tableau.ColoredLine( begin, '', displayString, end, tagString ) + coloredLine.z = location.z + self.skeinPane.coloredLines.append( coloredLine ) + self.coloredThread.append( coloredLine ) + + def getLayerTop(self): + "Get the layer top." + if len( self.layerTops ) < 1: + return - 9123456789123.9 + return self.layerTops[-1] + + def getLayerZoneIndex( self, z ): + "Get the layer zone index." + if self.layerTops[ self.oldLayerZoneIndex ] > z: + if self.oldLayerZoneIndex == 0: + return 0 + elif self.layerTops[ self.oldLayerZoneIndex - 1 ] < z: + return self.oldLayerZoneIndex + for layerTopIndex in xrange( len( self.layerTops ) ): + layerTop = self.layerTops[ layerTopIndex ] + if layerTop > z: + self.oldLayerZoneIndex = layerTopIndex + return layerTopIndex + self.oldLayerZoneIndex = len( self.layerTops ) - 1 + return self.oldLayerZoneIndex + + def initializeActiveLocation(self): + "Set variables to default." + self.extruderActive = False + self.oldLocation = None + + def linearCorner( self, splitLine ): + "Update the bounding corners." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.extruderActive or self.goAroundExtruderOffTravel: + self.cornerMaximum.maximize(location) + self.cornerMinimum.minimize(location) + self.oldLocation = location + + def linearMove( self, line, location ): + "Get statistics for a linear move." + if self.skeinPane == None: + return + self.addToPath(line, location) + + def moveColoredThreadToSkeinPane(self): + 'Move a colored thread to the skein pane.' + if len( self.coloredThread ) <= 0: + return + layerZoneIndex = self.getLayerZoneIndex( self.coloredThread[0].z ) + if not self.extruderActive: + self.setColoredThread( ( 190.0, 190.0, 190.0 ), self.skeinPane.travelLines ) #grey + return + self.skeinPane.layerZoneIndex = layerZoneIndex + if self.isPerimeter: + if self.isOuter: + self.setColoredThread( ( 255.0, 0.0, 0.0 ), self.skeinPane.perimeterOutsideLines ) #red + else: + self.setColoredThread( ( 255.0, 165.0, 0.0 ), self.skeinPane.perimeterInsideLines ) #orange + return + if self.isLoop: + self.setColoredThread( ( 255.0, 255.0, 0.0 ), self.skeinPane.loopLines ) #yellow + return + if not self.hasANestedRingBeenReached: + self.setColoredThread( ( 165.0, 42.0, 42.0 ), self.skeinPane.raftLines ) #brown + return + if layerZoneIndex < self.repository.numberOfFillBottomLayers.value: + self.setColoredThread( ( 128.0, 128.0, 0.0 ), self.skeinPane.fillBottomLines ) #olive + return + if layerZoneIndex >= self.firstTopLayer: + self.setColoredThread( ( 0.0, 0.0, 255.0 ), self.skeinPane.fillTopLines ) #blue + return + self.setColoredThread( ( 0.0, 255.0, 0.0 ), self.skeinPane.infillLines ) #green + + def parseCorner(self, line): + "Parse a gcode line and use the location to update the bounding corners." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if tableau.getIsLayerStart(firstWord, self, splitLine): + if firstWord == '(': + self.layerTopZ = float(splitLine[1]) + self.thirdLayerThickness + else: + self.layerTopZ = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine).z + self.thirdLayerThickness + self.layerTops.append( self.layerTopZ ) + if firstWord == 'G1': + self.linearCorner(splitLine) + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + elif firstWord == '(': + self.thirdLayerThickness = 0.33333333333 * float(splitLine[1]) + if firstWord == '()': + if self.layerTopZ > self.getLayerTop(): + self.layerTops.append( self.layerTopZ ) + + def parseGcode( self, fileName, gcodeText, repository ): + "Parse gcode text and store the vector output." + self.repository = repository + self.fileName = fileName + self.gcodeText = gcodeText + self.initializeActiveLocation() + self.cornerMaximum = Vector3(-987654321.0, -987654321.0, -987654321.0) + self.cornerMinimum = Vector3(987654321.0, 987654321.0, 987654321.0) + self.goAroundExtruderOffTravel = repository.goAroundExtruderOffTravel.value + self.lines = archive.getTextLines(gcodeText) + self.isThereALayerStartWord = (gcodec.getFirstWordIndexReverse('(', self.lines, 1) > -1) + if self.isThereALayerStartWord: + self.parseInitialization() + else: + print('') + print('') + print('') + print('Warning, there are no skeinforge comments in this text, probably because they have been removed by export.') + print('So there is no loop information, and therefore the lines will not be colored.') + print('') + print('To see the full information in an exported file, either deselect Delete Comments in export, or') + print('select Save Penultimate Gcode in export, and open the generated file with the suffix _penultimate.gcode.') + print('') + print('') + print('') + for line in self.lines[self.lineIndex :]: + self.parseCorner(line) + self.oldZ = - 999987654321.0 + if len( self.layerTops ) > 0: + self.layerTops[-1] += 912345678.9 + if len( self.layerTops ) > 1: + self.oneMinusBrightnessOverTopLayerIndex = ( 1.0 - repository.bottomLayerBrightness.value ) / float( len( self.layerTops ) - 1 ) + self.firstTopLayer = len( self.layerTops ) - self.repository.numberOfFillTopLayers.value + self.centerComplex = 0.5 * ( self.cornerMaximum.dropAxis() + self.cornerMinimum.dropAxis() ) + self.centerBottom = Vector3( self.centerComplex.real, self.centerComplex.imag, self.cornerMinimum.z ) + self.scale = repository.scale.value + self.scaleCenterBottom = self.scale * self.centerBottom + self.scaleCornerHigh = self.scale * self.cornerMaximum.dropAxis() + self.scaleCornerLow = self.scale * self.cornerMinimum.dropAxis() + print("The lower left corner of the skeiniso window is at %s, %s" % (self.cornerMinimum.x, self.cornerMinimum.y)) + print("The upper right corner of the skeiniso window is at %s, %s" % (self.cornerMaximum.x, self.cornerMaximum.y)) + self.cornerImaginaryTotal = self.cornerMaximum.y + self.cornerMinimum.y + margin = complex( 5.0, 5.0 ) + self.marginCornerLow = self.scaleCornerLow - margin + self.screenSize = margin + 2.0 * ( self.scaleCornerHigh - self.marginCornerLow ) + self.initializeActiveLocation() + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '()': + return + elif firstWord == '(': + self.feedRateMinute = 60.0 * float(splitLine[1]) + + def parseLine(self, line): + "Parse a gcode line and add it to the vector output." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if tableau.getIsLayerStart(firstWord, self, splitLine): + self.layerCount.printProgressIncrement('skeiniso') + self.skeinPane = SkeinPane( len( self.skeinPanes ) ) + self.skeinPanes.append( self.skeinPane ) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.linearMove(line, location) + self.oldLocation = location + elif firstWord == 'M101': + self.moveColoredThreadToSkeinPane() + self.extruderActive = True + elif firstWord == 'M103': + self.moveColoredThreadToSkeinPane() + self.extruderActive = False + self.isLoop = False + self.isPerimeter = False + elif firstWord == '(': + self.isLoop = True + elif firstWord == '()': + self.moveColoredThreadToSkeinPane() + self.isLoop = False + elif firstWord == '()': + self.hasANestedRingBeenReached = True + elif firstWord == '(': + self.isPerimeter = True + self.isOuter = ( splitLine[1] == 'outer') + elif firstWord == '()': + self.moveColoredThreadToSkeinPane() + self.isPerimeter = False + if firstWord == 'G2' or firstWord == 'G3': + relativeLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + relativeLocation.z = 0.0 + location = self.oldLocation + relativeLocation + self.linearMove(line, location) + self.oldLocation = location + + def setColoredLineColor( self, coloredLine, colorTuple ): + 'Set the color and stipple of the colored line.' + layerZoneIndex = self.getLayerZoneIndex( coloredLine.z ) + multiplier = self.repository.bottomLayerBrightness.value + if len( self.layerTops ) > 1: + multiplier += self.oneMinusBrightnessOverTopLayerIndex * float( layerZoneIndex ) + bandIndex = layerZoneIndex / self.repository.bandHeight.value + if self.repository.fromTheTop.value: + brightZoneIndex = len( self.layerTops ) - 1 - layerZoneIndex + bandIndex = brightZoneIndex / self.repository.bandHeight.value + 1 + if bandIndex % 2 == 0: + multiplier *= self.repository.bottomBandBrightness.value + red = settings.getWidthHex( int( colorTuple[0] * multiplier ), 2 ) + green = settings.getWidthHex( int( colorTuple[1] * multiplier ), 2 ) + blue = settings.getWidthHex( int( colorTuple[2] * multiplier ), 2 ) + coloredLine.colorName = '#%s%s%s' % ( red, green, blue ) + + def setColoredThread( self, colorTuple, lineList ): + 'Set the colored thread, then move it to the line list and stipple of the colored line.' + for coloredLine in self.coloredThread: + self.setColoredLineColor( coloredLine, colorTuple ) + lineList += self.coloredThread + self.coloredThread = [] + + +class SkeinPane: + "A class to hold the colored lines for a layer." + def __init__( self, sequenceIndex ): + "Create empty line lists." + self.coloredLines = [] + self.fillBottomLines = [] + self.fillTopLines = [] + self.index = 0 + self.infillLines = [] + self.layerZoneIndex = 0 + self.loopLines = [] + self.perimeterInsideLines = [] + self.perimeterOutsideLines = [] + self.raftLines = [] + self.sequenceIndex = sequenceIndex + self.travelLines = [] + + +class Ruling: + def __init__( self, modelDistance, roundedRulingText ): + "Initialize the ruling." + self.modelDistance = modelDistance + self.roundedRulingText = roundedRulingText + + +class SkeinWindow( tableau.TableauWindow ): + def __init__( self, repository, skein ): + "Initialize the skein window." + self.arrowshape = ( 24, 30, 9 ) + self.addCanvasMenuRootScrollSkein( repository, skein, '_skeiniso', 'Skeiniso') + self.center = 0.5 * self.screenSize + self.motionStippleName = 'gray75' + halfCenter = 0.5 * self.center.real + negativeHalfCenter = - halfCenter + self.halfCenterModel = halfCenter / skein.scale + negativeHalfCenterModel = - self.halfCenterModel + roundedHalfCenter = euclidean.getThreeSignificantFigures( self.halfCenterModel ) + roundedNegativeHalfCenter = euclidean.getThreeSignificantFigures( negativeHalfCenterModel ) + self.negativeAxisLineX = tableau.ColoredLine( Vector3(), 'darkorange', None, Vector3( negativeHalfCenter ), 'X Negative Axis: Origin -> %s,0,0' % roundedNegativeHalfCenter ) + self.negativeAxisLineY = tableau.ColoredLine( Vector3(), 'gold', None, Vector3( 0.0, negativeHalfCenter ), 'Y Negative Axis: Origin -> 0,%s,0' % roundedNegativeHalfCenter ) + self.negativeAxisLineZ = tableau.ColoredLine( Vector3(), 'skyblue', None, Vector3( 0.0, 0.0, negativeHalfCenter ), 'Z Negative Axis: Origin -> 0,0,%s' % roundedNegativeHalfCenter ) + self.positiveAxisLineX = tableau.ColoredLine( Vector3(), 'darkorange', None, Vector3( halfCenter ), 'X Positive Axis: Origin -> %s,0,0' % roundedHalfCenter ) + self.positiveAxisLineY = tableau.ColoredLine( Vector3(), 'gold', None, Vector3( 0.0, halfCenter ), 'Y Positive Axis: Origin -> 0,%s,0' % roundedHalfCenter ) + self.positiveAxisLineZ = tableau.ColoredLine( Vector3(), 'skyblue', None, Vector3( 0.0, 0.0, halfCenter ), 'Z Positive Axis: Origin -> 0,0,%s' % roundedHalfCenter ) + self.repository.axisRulings.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.bandHeight.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) + self.repository.bottomBandBrightness.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) + self.repository.bottomLayerBrightness.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) + self.repository.fromTheBottom.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) + self.repository.fromTheTop.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) + self.setWindowNewMouseTool( display_line.getNewMouseTool, self.repository.displayLine ) + self.setWindowNewMouseTool( view_move.getNewMouseTool, self.repository.viewMove ) + self.setWindowNewMouseTool( view_rotate.getNewMouseTool, self.repository.viewRotate ) + self.repository.numberOfFillBottomLayers.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) + self.repository.numberOfFillTopLayers.setUpdateFunction( self.setWindowToDisplaySavePhoenixUpdate ) + self.repository.viewpointLatitude.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.viewpointLongitude.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfAxisNegativeSide.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfAxisPositiveSide.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfFillBottomThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfFillTopThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfInfillThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfLoopThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfPerimeterInsideThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfPerimeterOutsideThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.repository.widthOfRaftThread.setUpdateFunction( self.setWindowToDisplaySaveUpdate ) + self.addMouseToolsBind() + self.negativeRulings = [] + self.positiveRulings = [] + for rulingIndex in xrange( 1, int( math.ceil( self.halfCenterModel / self.rulingSeparationWidthMillimeters ) ) ): + modelDistance = rulingIndex * self.rulingSeparationWidthMillimeters + self.negativeRulings.append( Ruling( modelDistance, self.getRoundedRulingText( 1, - modelDistance ) ) ) + self.positiveRulings.append( Ruling( modelDistance, self.getRoundedRulingText( 1, modelDistance ) ) ) + self.rulingExtentHalf = 0.5 * self.rulingExtent + + def drawRuling( self, projectiveSpace, relativeRulingEnd, ruling, tags, viewBegin, viewEnd ): + "Draw ruling." + alongWay = ruling.modelDistance / self.halfCenterModel + oneMinusAlongWay = 1.0 - alongWay + alongScreen = alongWay * viewEnd + oneMinusAlongWay * viewBegin + alongScreenEnd = alongScreen + relativeRulingEnd + self.canvas.create_line( + alongScreen.real, + alongScreen.imag, + alongScreenEnd.real, + alongScreenEnd.imag, + fill = 'black', + tags = tags, + width = 2 ) + self.canvas.create_text( int( alongScreenEnd.real ) + 3, alongScreenEnd.imag, anchor = settings.Tkinter.W, text = ruling.roundedRulingText ) + + def drawRulings( self, axisLine, projectiveSpace, rulings ): + "Draw rulings for the axis line." + if not self.repository.axisRulings.value: + return + viewBegin = self.getScreenView( axisLine.begin, projectiveSpace ) + viewEnd = self.getScreenView( axisLine.end, projectiveSpace ) + viewSegment = viewEnd - viewBegin + viewSegmentLength = abs( viewSegment ) + if viewSegmentLength < self.rulingExtent: + return + normalizedViewSegment = viewSegment / viewSegmentLength + relativeRulingEnd = complex( - normalizedViewSegment.imag, normalizedViewSegment.real ) + if normalizedViewSegment.imag > 0.0: + relativeRulingEnd = complex( normalizedViewSegment.imag, - normalizedViewSegment.real ) + for ruling in rulings: + self.drawRuling( projectiveSpace, relativeRulingEnd * self.rulingExtentHalf, ruling, axisLine.tagString, viewBegin, viewEnd ) + + def drawSkeinPane( self, projectiveSpace, skeinPane ): + "Draw colored lines." + self.getDrawnColoredLines( skeinPane.raftLines, projectiveSpace, self.repository.widthOfRaftThread.value ) + self.getDrawnColoredLines( skeinPane.travelLines, projectiveSpace, self.repository.widthOfTravelThread.value ) + self.getDrawnColoredLines( skeinPane.fillBottomLines, projectiveSpace, self.repository.widthOfFillBottomThread.value ) + self.getDrawnColoredLines( skeinPane.fillTopLines, projectiveSpace, self.repository.widthOfFillTopThread.value ) + self.getDrawnColoredLines( skeinPane.infillLines, projectiveSpace, self.repository.widthOfInfillThread.value ) + self.getDrawnColoredLines( skeinPane.loopLines, projectiveSpace, self.repository.widthOfLoopThread.value ) + self.getDrawnColoredLines( skeinPane.perimeterInsideLines, projectiveSpace, self.repository.widthOfPerimeterInsideThread.value ) + self.getDrawnColoredLines( skeinPane.perimeterOutsideLines, projectiveSpace, self.repository.widthOfPerimeterOutsideThread.value ) + + def drawXYAxisLines( self, projectiveSpace ): + "Draw the x and y axis lines." + if self.repository.widthOfAxisNegativeSide.value > 0: + self.getDrawnColoredLineWithoutArrow( self.negativeAxisLineX, projectiveSpace, self.negativeAxisLineX.tagString, self.repository.widthOfAxisNegativeSide.value ) + self.getDrawnColoredLineWithoutArrow( self.negativeAxisLineY, projectiveSpace, self.negativeAxisLineY.tagString, self.repository.widthOfAxisNegativeSide.value ) + if self.repository.widthOfAxisPositiveSide.value > 0: + self.getDrawnColoredLine('last', self.positiveAxisLineX, projectiveSpace, self.positiveAxisLineX.tagString, self.repository.widthOfAxisPositiveSide.value ) + self.getDrawnColoredLine('last', self.positiveAxisLineY, projectiveSpace, self.positiveAxisLineY.tagString, self.repository.widthOfAxisPositiveSide.value ) + + def drawZAxisLine( self, projectiveSpace ): + "Draw the z axis line." + if self.repository.widthOfAxisNegativeSide.value > 0: + self.getDrawnColoredLineWithoutArrow( self.negativeAxisLineZ, projectiveSpace, self.negativeAxisLineZ.tagString, self.repository.widthOfAxisNegativeSide.value ) + if self.repository.widthOfAxisPositiveSide.value > 0: + self.getDrawnColoredLine('last', self.positiveAxisLineZ, projectiveSpace, self.positiveAxisLineZ.tagString, self.repository.widthOfAxisPositiveSide.value ) + + def getCanvasRadius(self): + "Get half of the minimum of the canvas height and width." + return 0.5 * min( float( self.canvasHeight ), float( self.canvasWidth ) ) + + def getCentered( self, coordinate ): + "Get the centered coordinate." + relativeToCenter = complex( coordinate.real - self.center.real, self.center.imag - coordinate.imag ) + if abs( relativeToCenter ) < 1.0: + relativeToCenter = complex( 0.0, 1.0 ) + return relativeToCenter + + def getCenteredScreened( self, coordinate ): + "Get the normalized centered coordinate." + return self.getCentered( coordinate ) / self.getCanvasRadius() + + def getColoredLines(self): + "Get the colored lines from the skein pane." + return self.skeinPanes[ self.repository.layer.value ].coloredLines + + def getCopy(self): + "Get a copy of this window." + return SkeinWindow( self.repository, self.skein ) + + def getCopyWithNewSkein(self): + "Get a copy of this window with a new skein." + return getWindowGivenTextRepository( self.skein.fileName, self.skein.gcodeText, self.repository ) + + def getDrawnColoredLine( self, arrowType, coloredLine, projectiveSpace, tags, width ): + "Draw colored line." + viewBegin = self.getScreenView( coloredLine.begin, projectiveSpace ) + viewEnd = self.getScreenView( coloredLine.end, projectiveSpace ) + return self.canvas.create_line( + viewBegin.real, + viewBegin.imag, + viewEnd.real, + viewEnd.imag, + fill = coloredLine.colorName, + arrow = arrowType, + tags = tags, + width = width ) + + def getDrawnColoredLineMotion( self, coloredLine, projectiveSpace, width ): + "Draw colored line with motion stipple and tag." + viewBegin = self.getScreenView( coloredLine.begin, projectiveSpace ) + viewEnd = self.getScreenView( coloredLine.end, projectiveSpace ) + return self.canvas.create_line( + viewBegin.real, + viewBegin.imag, + viewEnd.real, + viewEnd.imag, + fill = coloredLine.colorName, + arrow = 'last', + arrowshape = self.arrowshape, + stipple = self.motionStippleName, + tags = 'mouse_item', + width = width + 4 ) + + def getDrawnColoredLines( self, coloredLines, projectiveSpace, width ): + "Draw colored lines." + if width <= 0: + return + drawnColoredLines = [] + for coloredLine in coloredLines: + drawnColoredLines.append( self.getDrawnColoredLine( self.arrowType, coloredLine, projectiveSpace, coloredLine.tagString, width ) ) + return drawnColoredLines + + def getDrawnColoredLineWithoutArrow( self, coloredLine, projectiveSpace, tags, width ): + "Draw colored line without an arrow." + viewBegin = self.getScreenView( coloredLine.begin, projectiveSpace ) + viewEnd = self.getScreenView( coloredLine.end, projectiveSpace ) + return self.canvas.create_line( + viewBegin.real, + viewBegin.imag, + viewEnd.real, + viewEnd.imag, + fill = coloredLine.colorName, + tags = tags, + width = width ) + + def getDrawnSelectedColoredLine( self, coloredLine ): + "Get the drawn selected colored line." + projectiveSpace = euclidean.ProjectiveSpace().getByLatitudeLongitude( self.repository.viewpointLatitude.value, self.repository.viewpointLongitude.value ) + return self.getDrawnColoredLine( self.arrowType, coloredLine, projectiveSpace, 'selection_line', self.repository.widthOfSelectionThread.value ) + + def getScreenComplex( self, pointComplex ): + "Get the point in screen perspective." + return complex( pointComplex.real, - pointComplex.imag ) + self.center + + def getScreenView( self, point, projectiveSpace ): + "Get the point in screen view perspective." + return self.getScreenComplex( projectiveSpace.getDotComplex(point) ) + + def printHexadecimalColorName(self, name): + "Print the color name in hexadecimal." + colorTuple = self.canvas.winfo_rgb( name ) + print('#%s%s%s' % ( settings.getWidthHex( colorTuple[0], 2 ), settings.getWidthHex( colorTuple[1], 2 ), settings.getWidthHex( colorTuple[2], 2 ) ) ) + + def update(self): + "Update the screen." + if len( self.skeinPanes ) < 1: + return + self.limitIndexSetArrowMouseDeleteCanvas() + self.repository.viewpointLatitude.value = view_rotate.getBoundedLatitude( self.repository.viewpointLatitude.value ) + self.repository.viewpointLongitude.value = round( self.repository.viewpointLongitude.value, 1 ) + projectiveSpace = euclidean.ProjectiveSpace().getByLatitudeLongitude( self.repository.viewpointLatitude.value, self.repository.viewpointLongitude.value ) + skeinPanesCopy = self.getUpdateSkeinPanes()[:] + skeinPanesCopy.sort( compareLayerSequence ) + if projectiveSpace.basisZ.z > 0.0: + self.drawXYAxisLines( projectiveSpace ) + else: + skeinPanesCopy.reverse() + self.drawZAxisLine( projectiveSpace ) + for skeinPane in skeinPanesCopy: + self.drawSkeinPane( projectiveSpace, skeinPane ) + if projectiveSpace.basisZ.z > 0.0: + self.drawZAxisLine( projectiveSpace ) + else: + self.drawXYAxisLines( projectiveSpace ) + if self.repository.widthOfAxisNegativeSide.value > 0: + self.drawRulings( self.negativeAxisLineX, projectiveSpace, self.negativeRulings ) + self.drawRulings( self.negativeAxisLineY, projectiveSpace, self.negativeRulings ) + self.drawRulings( self.negativeAxisLineZ, projectiveSpace, self.negativeRulings ) + if self.repository.widthOfAxisPositiveSide.value > 0: + self.drawRulings( self.positiveAxisLineX, projectiveSpace, self.positiveRulings ) + self.drawRulings( self.positiveAxisLineY, projectiveSpace, self.positiveRulings ) + self.drawRulings( self.positiveAxisLineZ, projectiveSpace, self.positiveRulings ) + self.setDisplayLayerIndex() + + +def main(): + "Display the skeiniso dialog." + if len(sys.argv) > 1: + settings.startMainLoopFromWindow( getWindowAnalyzeFile(' '.join(sys.argv[1 :])) ) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeiniso.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeiniso.pyc new file mode 100644 index 0000000..37de41d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeiniso.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.py new file mode 100644 index 0000000..c99c11e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.py @@ -0,0 +1,575 @@ +""" +This page is in the table of contents. +Skeinlayer is an analyze viewer to display each layer of a gcode file. + +The skeinlayer manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Skeinlayer + +Skeinlayer is derived from Nophead's preview script. The extruded lines are in the resistor colors red, orange, yellow, green, blue, purple & brown. When the extruder is off, the travel line is grey. Skeinlayer is useful for a detailed view of the extrusion, skeiniso is better to see the orientation of the shape. To get an initial overview of the skein, when the skeinlayer display window appears, click the Soar button (double right arrow button beside the layer field). + +==Operation== +The default 'Activate Skeinlayer' checkbox is on. When it is on, the functions described below will work when called from the 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 Skeinlayer' checkbox is on, when skeinlayer is run directly. Skeinlayer has trouble separating the layers when it reads gcode without comments. + +==Settings== +===Animation=== +====Animation Line Quickening==== +Default is one. + +The quickness of the tool animation over the quickness of the actual tool. + +====Animation Slide Show Rate==== +Default is two layers per second. + +The rate, in layers per second, at which the layer changes when the soar or dive button is pressed.. + +===Draw Arrows=== +Default is on. + +When selected, arrows will be drawn at the end of each line segment. + +===Export Menu=== +When the submenu in the export menu item in the file menu is clicked, an export canvas dialog will be displayed, which can export the canvas to a file. + +===Go Around Extruder Off Travel=== +Default is off. + +When selected, the display will include the travel when the extruder is off, which means it will include the nozzle wipe path if any. + +===Layers=== +====Layer==== +Default is zero. + +On the display window, the Up button increases the 'Layer' by one, and the Down button decreases the layer by one. When the layer displayed in the layer spin box is changed then is hit, the layer shown will be set to the spin box, to a mimimum of zero and to a maximum of the highest index layer.The Soar button increases the layer at the 'Animation Slide Show Rate', and the Dive (double left arrow button beside the layer field) button decreases the layer at the slide show rate. + +====Layer Extra Span==== +Default is zero. + +The viewer will draw the layers in the range including the 'Layer' index and the 'Layer' index plus the 'Layer Extra Span'. If the 'Layer Extra Span' is negative, the layers viewed will start at the 'Layer' index, plus the 'Layer Extra Span', and go up to and include the 'Layer' index. If the 'Layer Extra Span' is zero, only the 'Layer' index layer will be displayed. If the 'Layer Extra Span' is positive, the layers viewed will start at the 'Layer' index, and go up to and include the 'Layer' index plus the 'Layer Extra Span'. + +===Line=== +Default is zero. + +The index of the selected line on the layer that is highlighted when the 'Display Line' mouse tool is chosen. The line spin box up button increases the 'Line' by one. If the line index of the layer goes over the index of the last line, the layer index will be increased by one and the new line index will be zero. The down button decreases the line index by one. If the line index goes below the index of the first line, the layer index will be decreased by one and the new line index will be at the last line. When the line displayed in the line field is changed then is hit, the line shown will be set to the line field, to a mimimum of zero and to a maximum of the highest index line. The Soar button increases the line at the speed at which the extruder would move, times the 'Animation Line Quickening' ratio, and the Dive (double left arrow button beside the line field) button decreases the line at the animation line quickening ratio. + +===Mouse Mode=== +Default is 'Display Line'. + +The mouse tool can be changed from the 'Mouse Mode' menu button or picture button. The mouse tools listen to the arrow keys when the canvas has the focus. Clicking in the canvas gives the canvas the focus, and when the canvas has the focus a thick black border is drawn around the canvas. + +====Display Line==== +The 'Display Line' tool will display the highlight the selected line, and display the file line count, counting from one, and the gcode line itself. When the 'Display Line' tool is active, clicking the canvas will select the nearest line to the mouse click. + +====Viewpoint Move==== +The 'Viewpoint Move' tool will move the viewpoint in the xy plane when the mouse is clicked and dragged on the canvas. + +===Numeric Pointer=== +Default is on. + +When selected, the distance along the ruler of the arrow pointers will be drawn next to the pointers. + +===Scale=== +Default is ten. + +The scale setting is the scale of the image in pixels per millimeter, the higher the number, the greater the size of the display. + +The zoom in mouse tool will zoom in the display at the point where the mouse was clicked, increasing the scale by a factor of two. The zoom out tool will zoom out the display at the point where the mouse was clicked, decreasing the scale by a factor of two. + +===Screen Inset=== +====Screen Horizontal Inset==== +Default is one hundred. + +The "Screen Horizontal Inset" determines how much the canvas will be inset in the horizontal direction from the edge of screen, the higher the number the more it will be inset and the smaller it will be. + +====Screen Vertical Inset==== +Default is two hundred and twenty. + +The "Screen Vertical Inset" determines how much the canvas will be inset in the vertical direction from the edge of screen, the higher the number the more it will be inset and the smaller it will be. + +===Width=== +The width of each type of thread and of each axis can be changed. If the width is set to zero, the thread will not be visible. + +====Width of Extrusion Thread==== +Default is three. + +The "Width of Extrusion Thread" sets the width of the extrusion threads. + +====Width of Selection Thread==== +Default is six. + +The "Width of Selection Thread" sets the width of the selected line. + +====Width of Travel Thread==== +Default is one. + +The "Width of Travel Thread" sets the width of the grey extruder off travel threads. + +==Icons== +The dive, soar and zoom icons are from Mark James' soarSilk icon set 1.3 at: +http://www.famfamfam.com/lab/icons/silk/ + +==Gcodes== +An explanation of the gcodes is at: +http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter + +and at: +http://reprap.org/bin/view/Main/MCodeReference + +A gode example is at: +http://forums.reprap.org/file.php?12,file=565 + +==Examples== +Below are examples of skeinlayer being used. These examples are run in a terminal in the folder which contains Screw Holder_penultimate.gcode and skeinlayer.py. + +> python skeinlayer.py +This brings up the skeinlayer dialog. + +> python skeinlayer.py Screw Holder_penultimate.gcode +This brings up the skeinlayer viewer to view each layer of a gcode file. + +""" + +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 fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import display_line +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import tableau +from skeinforge_application.skeinforge_plugins.analyze_plugins.analyze_utilities import view_move +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return SkeinlayerRepository() + +def getRankIndex( rulingSeparationWidthMillimeters, screenOrdinate ): + "Get rank index." + return int( round( screenOrdinate / rulingSeparationWidthMillimeters ) ) + +def getWindowAnalyzeFile(fileName): + "Display a gcode file in a skeinlayer window." + gcodeText = archive.getFileText(fileName) + return getWindowAnalyzeFileGivenText(fileName, gcodeText) + +def getWindowAnalyzeFileGivenText( fileName, gcodeText, repository=None): + "Display a gcode file in a skeinlayer window given the text." + if gcodeText == '': + return None + if repository == None: + repository = settings.getReadRepository( SkeinlayerRepository() ) + skeinWindow = getWindowGivenTextRepository( fileName, gcodeText, repository ) + skeinWindow.updateDeiconify() + return skeinWindow + +def getWindowGivenTextRepository( fileName, gcodeText, repository ): + "Display a gcode file in a skeinlayer window given the text and settings." + skein = SkeinlayerSkein() + skein.parseGcode( fileName, gcodeText, repository ) + return SkeinWindow( repository, skein ) + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + "Display a skeinlayered gcode file for a skeinforge gcode file, if 'Activate Skeinlayer' is selected." + try: + import Tkinter + except: + print('Warning, skeinlayer will do nothing because Tkinter is not installed.') + return + repository = settings.getReadRepository( SkeinlayerRepository() ) + if repository.activateSkeinlayer.value: + gcodeText = archive.getTextIfEmpty( fileNameSuffix, gcodeText ) + return getWindowAnalyzeFileGivenText( fileNameSuffix, gcodeText, repository ) + + +class SkeinlayerRepository( tableau.TableauRepository ): + "A class to handle the skeinlayer settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.skeinlayer.html', self) + self.baseNameSynonym = 'skeinview.csv' + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File for Skeinlayer', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Skeinlayer') + self.activateSkeinlayer = settings.BooleanSetting().getFromValue('Activate Skeinlayer', self, True ) + self.addAnimation() + self.drawArrows = settings.BooleanSetting().getFromValue('Draw Arrows', self, True ) + self.goAroundExtruderOffTravel = settings.BooleanSetting().getFromValue('Go Around Extruder Off Travel', self, False ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Layers -', self ) + self.layer = settings.IntSpinNotOnMenu().getSingleIncrementFromValue( 0, 'Layer (index):', self, 912345678, 0 ) + self.layerExtraSpan = settings.IntSpinUpdate().getSingleIncrementFromValue( - 3, 'Layer Extra Span (integer):', self, 3, 0 ) + settings.LabelSeparator().getFromRepository(self) + self.line = settings.IntSpinNotOnMenu().getSingleIncrementFromValue( 0, 'Line (index):', self, 912345678, 0 ) + self.mouseMode = settings.MenuButtonDisplay().getFromName('Mouse Mode:', self ) + self.displayLine = settings.MenuRadio().getFromMenuButtonDisplay( self.mouseMode, 'Display Line', self, True ) + self.viewMove = settings.MenuRadio().getFromMenuButtonDisplay( self.mouseMode, 'View Move', self, False ) + self.addScaleScreenSlide() + self.showPosition = settings.BooleanSetting().getFromValue('Show Position', self, True ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Width -', self ) + self.widthOfExtrusionThread = settings.IntSpinUpdate().getSingleIncrementFromValue( 0, 'Width of Extrusion Thread (pixels):', self, 5, 3 ) + self.widthOfSelectionThread = settings.IntSpinUpdate().getSingleIncrementFromValue( 0, 'Width of Selection Thread (pixels):', self, 10, 6 ) + self.widthOfTravelThread = settings.IntSpinUpdate().getSingleIncrementFromValue( 0, 'Width of Travel Thread (pixels):', self, 5, 1 ) + self.executeTitle = 'Skeinlayer' + + def execute(self): + "Write button has been clicked." + fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled ) + for fileName in fileNames: + getWindowAnalyzeFile(fileName) + + +class SkeinlayerSkein: + "A class to write a get a scalable vector graphics text for a gcode skein." + def __init__(self): + 'Initialize.' + self.extrusionNumber = 0 + self.feedRateMinute = 960.1 + self.isThereALayerStartWord = False + self.layerCount = settings.LayerCount() + self.oldZ = - 999987654321.0 + self.skeinPane = None + self.skeinPanes = [] + + def addToPath( self, line, location ): + "Add a point to travel and maybe extrusion." + if self.oldLocation == None: + return + colorName = 'gray' + locationComplex = location.dropAxis() + oldLocationComplex = self.oldLocation.dropAxis() + begin = self.getScreenCoordinates( oldLocationComplex ) + end = self.getScreenCoordinates( locationComplex ) + if self.extruderActive: + colorName = self.colorNames[ self.extrusionNumber % len( self.colorNames ) ] + displayString = '%s %s' % ( self.lineIndex + 1, line ) + tagString = 'colored_line_index: %s %s' % ( len( self.skeinPane ), len( self.skeinPanes ) - 1 ) + coloredLine = tableau.ColoredLine( begin, colorName, displayString, end, tagString ) + coloredLine.isExtrusionThread = self.extruderActive + self.skeinPane.append( coloredLine ) + + def getModelCoordinates( self, screenCoordinates ): + "Get the model coordinates." + modelCoordinates = ( screenCoordinates + self.marginCornerLow ) / self.scale + return complex( modelCoordinates.real, self.cornerImaginaryTotal - modelCoordinates.imag ) + + def getScreenCoordinates( self, pointComplex ): + "Get the screen coordinates." + pointComplex = complex( pointComplex.real, self.cornerImaginaryTotal - pointComplex.imag ) + return self.scale * pointComplex - self.marginCornerLow + + def initializeActiveLocation(self): + "Set variables to default." + self.extruderActive = False + self.oldLocation = None + + def linearCorner( self, splitLine ): + "Update the bounding corners." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.extruderActive or self.repository.goAroundExtruderOffTravel.value: + self.cornerMaximum.maximize(location) + self.cornerMinimum.minimize(location) + self.oldLocation = location + + def linearMove( self, line, location ): + "Get statistics for a linear move." + if self.skeinPane != None: + self.addToPath(line, location) + + def parseCorner(self, line): + "Parse a gcode line and use the location to update the bounding corners." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearCorner(splitLine) + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + + def parseGcode( self, fileName, gcodeText, repository ): + "Parse gcode text and store the vector output." + self.fileName = fileName + self.gcodeText = gcodeText + self.repository = repository + self.initializeActiveLocation() + self.cornerMaximum = Vector3(-987654321.0, -987654321.0, -987654321.0) + self.cornerMinimum = Vector3(987654321.0, 987654321.0, 987654321.0) + self.lines = archive.getTextLines(gcodeText) + self.isThereALayerStartWord = (gcodec.getFirstWordIndexReverse('(', self.lines, 1) > -1) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseCorner(line) + self.cornerMaximumComplex = self.cornerMaximum.dropAxis() + self.cornerMinimumComplex = self.cornerMinimum.dropAxis() + self.scale = repository.scale.value + self.scaleCornerHigh = self.scale * self.cornerMaximumComplex + self.scaleCornerLow = self.scale * self.cornerMinimumComplex + self.cornerImaginaryTotal = self.cornerMaximum.y + self.cornerMinimum.y + self.margin = complex( 10.0, 10.0 ) + self.marginCornerHigh = self.scaleCornerHigh + self.margin + self.marginCornerLow = self.scaleCornerLow - self.margin + self.screenSize = self.marginCornerHigh - self.marginCornerLow + self.initializeActiveLocation() + self.colorNames = ['brown', 'red', 'orange', 'yellow', 'green', 'blue', 'purple'] + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '()': + return + elif firstWord == '(': + self.feedRateMinute = 60.0 * float(splitLine[1]) + self.lineIndex = 0 + + def parseLine(self, line): + "Parse a gcode line and add it to the vector output." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if tableau.getIsLayerStart(firstWord, self, splitLine): + self.extrusionNumber = 0 + self.layerCount.printProgressIncrement('skeinlayer') + self.skeinPane = [] + self.skeinPanes.append( self.skeinPane ) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.linearMove(line, location) + self.oldLocation = location + elif firstWord == 'M101': + self.extruderActive = True + self.extrusionNumber += 1 + elif firstWord == 'M103': + self.extruderActive = False + if firstWord == 'G2' or firstWord == 'G3': + relativeLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + relativeLocation.z = 0.0 + location = self.oldLocation + relativeLocation + self.linearMove(line, location) + self.oldLocation = location + + +class SkeinWindow( tableau.TableauWindow ): + def __init__(self, repository, skein): + "Initialize the skein window.setWindowNewMouseTool" + self.addCanvasMenuRootScrollSkein(repository, skein, '_skeinlayer', 'Skeinlayer') + horizontalRulerBoundingBox = (0, 0, int( skein.screenSize.real ), self.rulingExtent) + self.horizontalRulerCanvas = settings.Tkinter.Canvas(self.root, width = self.canvasWidth, height = self.rulingExtent, scrollregion=horizontalRulerBoundingBox) + self.horizontalRulerCanvas.grid(row=1, column=2, columnspan=96, sticky=settings.Tkinter.E+settings.Tkinter.W) + self.horizontalRulerCanvas['xscrollcommand'] = self.xScrollbar.set + verticalRulerBoundingBox = (0, 0, self.rulingExtent, int(skein.screenSize.imag)) + self.verticalRulerCanvas = settings.Tkinter.Canvas(self.root, width=self.rulingExtent, height=self.canvasHeight, scrollregion=verticalRulerBoundingBox) + self.verticalRulerCanvas.grid(row=2, rowspan=96, column=1, sticky=settings.Tkinter.N+settings.Tkinter.S) + self.verticalRulerCanvas['yscrollcommand'] = self.yScrollbar.set + self.xStringVar = settings.Tkinter.StringVar(self.root) + self.xLabel = settings.Tkinter.Label(self.root, textvariable=self.xStringVar) + self.xLabel.grid(row=0, column=3, sticky=settings.Tkinter.W) + self.yStringVar = settings.Tkinter.StringVar(self.root) + self.yLabel = settings.Tkinter.Label(self.root, textvariable=self.yStringVar) + self.yLabel.grid(row=0, column=4, sticky=settings.Tkinter.W) + self.setWindowNewMouseTool(display_line.getNewMouseTool, repository.displayLine) + self.setWindowNewMouseTool(view_move.getNewMouseTool, repository.viewMove) + repository.showPosition.setUpdateFunction(self.setWindowToDisplaySaveUpdate) + repository.widthOfExtrusionThread.setUpdateFunction(self.setWindowToDisplaySaveUpdate) + self.addMouseToolsBind() + self.createRulers() + + def addHorizontalRulerRuling( self, xMillimeters ): + "Add a ruling to the horizontal ruler." + xPixel = self.skein.getScreenCoordinates( complex( xMillimeters, 0.0 ) ).real + self.createVerticalLine( 0.0, xPixel ) + self.horizontalRulerCanvas.create_text( xPixel + 2, 0, anchor = settings.Tkinter.NW, text = self.getRoundedRulingText( 1, xMillimeters ) ) + cumulativeDistance = xMillimeters + self.createVerticalLine( self.rulingExtentTiny, self.skein.getScreenCoordinates( complex( xMillimeters + self.separationWidthMillimetersTenth, 0.0 ) ).real ) + for subRulingIndex in xrange(4): + cumulativeDistance += self.separationWidthMillimetersFifth + self.createVerticalLine( self.rulingExtentShort, self.skein.getScreenCoordinates( complex( cumulativeDistance, 0.0 ) ).real ) + self.createVerticalLine( self.rulingExtentTiny, self.skein.getScreenCoordinates( complex( cumulativeDistance + self.separationWidthMillimetersTenth, 0.0 ) ).real ) + + def addVerticalRulerRuling( self, yMillimeters ): + "Add a ruling to the vertical ruler." + fontHeight = 12 + yPixel = self.skein.getScreenCoordinates( complex( 0.0, yMillimeters ) ).imag + self.createHorizontalLine( 0.0, yPixel ) + yPixel += 2 + roundedRulingText = self.getRoundedRulingText( 1, yMillimeters ) + effectiveRulingTextLength = len( roundedRulingText ) + if roundedRulingText.find('.') != - 1: + effectiveRulingTextLength -= 1 + cumulativeDistance = yMillimeters + self.createHorizontalLine( self.rulingExtentTiny, self.skein.getScreenCoordinates( complex( 0.0, yMillimeters + self.separationWidthMillimetersTenth ) ).imag ) + for subRulingIndex in xrange(4): + cumulativeDistance += self.separationWidthMillimetersFifth + self.createHorizontalLine( self.rulingExtentShort, self.skein.getScreenCoordinates( complex( 0.0, cumulativeDistance ) ).imag ) + self.createHorizontalLine( self.rulingExtentTiny, self.skein.getScreenCoordinates( complex( 0.0, cumulativeDistance + self.separationWidthMillimetersTenth ) ).imag ) + if effectiveRulingTextLength < 4: + self.verticalRulerCanvas.create_text( 0, yPixel, anchor = settings.Tkinter.NW, text = roundedRulingText ) + return + for character in roundedRulingText: + if character == '.': + yPixel -= fontHeight * 2 / 3 + self.verticalRulerCanvas.create_text( 0, yPixel, anchor = settings.Tkinter.NW, text = character ) + yPixel += fontHeight + + def createHorizontalLine( self, begin, yPixel ): + "Create a horizontal line for the horizontal ruler." + self.verticalRulerCanvas.create_line( begin, yPixel, self.rulingExtent, yPixel, fill = 'black') + + def createRulers(self): + "Create the rulers.." + self.rulingExtentShort = 0.382 * self.rulingExtent + self.rulingExtentTiny = 0.764 * self.rulingExtent + self.rulingExtentPointer = 0.5 * ( self.rulingExtentShort + self.rulingExtentTiny ) + self.rulingPointerRadius = self.rulingExtent - self.rulingExtentPointer + self.textBoxHeight = int( 0.8 * self.rulingExtent ) + self.textBoxWidth = int( 2.5 * self.rulingExtent ) + self.separationWidthMillimetersFifth = 0.2 * self.rulingSeparationWidthMillimeters + self.separationWidthMillimetersTenth = 0.1 * self.rulingSeparationWidthMillimeters + rulingSeparationWidthPixels = self.getRulingSeparationWidthPixels( self.rank ) + marginOverScale = self.skein.margin / self.skein.scale + cornerMaximumMargin = self.skein.cornerMaximumComplex + marginOverScale + cornerMinimumMargin = self.skein.cornerMinimumComplex - marginOverScale + xRankIndexHigh = getRankIndex( self.rulingSeparationWidthMillimeters, cornerMaximumMargin.real ) + xRankIndexLow = getRankIndex( self.rulingSeparationWidthMillimeters, cornerMinimumMargin.real ) + for xRankIndex in xrange( xRankIndexLow - 2, xRankIndexHigh + 2 ): # 1 is enough, 2 is to be on the safe side + self.addHorizontalRulerRuling( xRankIndex * self.rulingSeparationWidthMillimeters ) + yRankIndexHigh = getRankIndex( self.rulingSeparationWidthMillimeters, cornerMaximumMargin.imag ) + yRankIndexLow = getRankIndex( self.rulingSeparationWidthMillimeters, cornerMinimumMargin.imag ) + for yRankIndex in xrange( yRankIndexLow - 2, yRankIndexHigh + 2 ): # 1 is enough, 2 is to be on the safe side + self.addVerticalRulerRuling( yRankIndex * self.rulingSeparationWidthMillimeters ) + + def createVerticalLine( self, begin, xPixel ): + "Create a vertical line for the horizontal ruler." + self.horizontalRulerCanvas.create_line( xPixel, begin, xPixel, self.rulingExtent, fill = 'black') + + def getColoredLines(self): + "Get the colored lines from the skein pane." + return self.skeinPanes[self.repository.layer.value] + + def getCopy(self): + "Get a copy of this window." + return SkeinWindow(self.repository, self.skein) + + def getCopyWithNewSkein(self): + "Get a copy of this window with a new skein." + return getWindowGivenTextRepository( self.skein.fileName, self.skein.gcodeText, self.repository ) + + def getDrawnColoredLine( self, coloredLine, tags, width ): + "Get the drawn colored line." + return self.canvas.create_line( + coloredLine.begin.real, + coloredLine.begin.imag, + coloredLine.end.real, + coloredLine.end.imag, + fill = coloredLine.colorName, + arrow = self.arrowType, + tags = tags, + width = width ) + + def getDrawnColoredLineIfThick( self, coloredLine, width ): + "Get the drawn colored line if it has a positive thickness." + if width > 0: + return self.getDrawnColoredLine( coloredLine, coloredLine.tagString, width ) + + def getDrawnSelectedColoredLine(self, coloredLine): + "Get the drawn selected colored line." + return self.getDrawnColoredLine(coloredLine, 'selection_line', self.repository.widthOfSelectionThread.value) + + def motion(self, event): + "The mouse moved." + self.mouseTool.motion(event) + xString = '' + yString = '' + x = self.canvas.canvasx( event.x ) + y = self.canvas.canvasy( event.y ) + self.horizontalRulerCanvas.delete('pointer') + self.horizontalRulerCanvas.create_polygon( x - self.rulingPointerRadius, self.rulingExtentPointer, x + self.rulingPointerRadius, self.rulingExtentPointer, x, self.rulingExtent, tag = 'pointer') + self.verticalRulerCanvas.delete('pointer') + self.verticalRulerCanvas.create_polygon( self.rulingExtentPointer, y - self.rulingPointerRadius, self.rulingExtentPointer, y + self.rulingPointerRadius, self.rulingExtent, y, tag = 'pointer') + if self.repository.showPosition.value: + motionCoordinate = complex(x, y) + modelCoordinates = self.skein.getModelCoordinates( motionCoordinate ) + roundedXText = self.getRoundedRulingText(3, modelCoordinates.real) + roundedYText = self.getRoundedRulingText(3, modelCoordinates.imag) + xString = 'X: ' + roundedXText + yString = 'Y: ' + roundedYText + self.xStringVar.set(xString) + self.yStringVar.set(yString) + + def qqqmotion(self, event): + "The mouse moved." + self.mouseTool.motion(event) + x = self.canvas.canvasx( event.x ) + y = self.canvas.canvasy( event.y ) + self.horizontalRulerCanvas.delete('pointer') + self.horizontalRulerCanvas.create_polygon( x - self.rulingPointerRadius, self.rulingExtentPointer, x + self.rulingPointerRadius, self.rulingExtentPointer, x, self.rulingExtent, tag = 'pointer') + self.verticalRulerCanvas.delete('pointer') + self.verticalRulerCanvas.create_polygon( self.rulingExtentPointer, y - self.rulingPointerRadius, self.rulingExtentPointer, y + self.rulingPointerRadius, self.rulingExtent, y, tag = 'pointer') + if not self.repository.numericPointer.value: + return + motionCoordinate = complex(x, y) + modelCoordinates = self.skein.getModelCoordinates( motionCoordinate ) + roundedXText = self.getRoundedRulingText( 3, modelCoordinates.real ) + yStart = self.canvas.canvasy( 0 ) + self.canvas.create_rectangle( x - 2, yStart, x + self.textBoxWidth, yStart + self.textBoxHeight + 5, fill = self.canvas['background'], tag = 'pointer') + self.canvas.create_text( x, yStart + 5, anchor = settings.Tkinter.NW, tag = 'pointer', text = roundedXText ) + roundedYText = self.getRoundedRulingText( 3, modelCoordinates.imag ) + xStart = self.canvas.canvasx( 0 ) + self.canvas.create_rectangle( xStart, y - 2, xStart + self.textBoxWidth + 5, y + self.textBoxHeight, fill = self.canvas['background'], tag = 'pointer') + self.canvas.create_text( xStart + 5, y, anchor = settings.Tkinter.NW, tag = 'pointer', text = roundedYText ) + xString = '' + xString = 'X: ' + roundedXText + self.xStringVar.set(xString) + + def relayXview( self, *args ): + "Relay xview changes." + self.canvas.xview( *args ) + self.horizontalRulerCanvas.xview( *args ) + + def relayYview( self, *args ): + "Relay yview changes." + self.canvas.yview( *args ) + self.verticalRulerCanvas.yview( *args ) + + def update(self): + "Update the window." + if len( self.skeinPanes ) < 1: + return + self.limitIndexSetArrowMouseDeleteCanvas() + for coloredLines in self.getUpdateSkeinPanes(): + for coloredLine in coloredLines: + if coloredLine.isExtrusionThread: + self.getDrawnColoredLineIfThick( coloredLine, self.repository.widthOfExtrusionThread.value ) + else: + self.getDrawnColoredLineIfThick( coloredLine, self.repository.widthOfTravelThread.value ) + self.setDisplayLayerIndex() + + +def main(): + "Display the skeinlayer dialog." + if len(sys.argv) > 1: + settings.startMainLoopFromWindow(getWindowAnalyzeFile(' '.join(sys.argv[1 :]))) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.pyc new file mode 100644 index 0000000..56dc825 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/skeinlayer.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py new file mode 100644 index 0000000..dd320dd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.py @@ -0,0 +1,404 @@ +""" +This page is in the table of contents. +Statistic is an extremely valuable analyze plugin to print and/or save the statistics of the generated gcode. + +The statistic manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Statistic + +==Operation== +The default 'Activate Statistic' checkbox is on. When it is on, the functions described below will work when called from the 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. + +==Settings== +===Extrusion Diameter over Thickness=== +Default is 1.25. + +The 'Extrusion Diameter over Thickness is the ratio of the extrusion diameter over the layer thickness, the default is 1.25. 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 fill density ratio 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 fill density ratio means the filaments will be far away from each other, the object will be leaky and light. The fill density ratio with the default extrusion settings is around 0.68. + +===Print Statistics=== +Default is on. + +When the 'Print Statistics' checkbox is on, the statistics will be printed to the console. + +===Save Statistics=== +Default is off. + +When the 'Save Statistics' checkbox is on, the statistics will be saved as a .txt file. + +==Gcodes== +An explanation of the gcodes is at: +http://reprap.org/bin/view/Main/Arduino_GCode_Interpreter + +and at: +http://reprap.org/bin/view/Main/MCodeReference + +A gode example is at: +http://forums.reprap.org/file.php?12,file=565 + +==Examples== +Below are examples of statistic being used. These examples are run in a terminal in the folder which contains Screw Holder_penultimate.gcode and statistic.py. The 'Save Statistics' checkbox is selected. + +> python statistic.py +This brings up the statistic dialog. + +> python statistic.py Screw Holder_penultimate.gcode +Statistics are being generated for the file /home/enrique/Desktop/backup/babbleold/script/reprap/fabmetheus/models/Screw Holder_penultimate.gcode + +Cost +Machine time cost is 0.31$. +Material cost is 0.2$. +Total cost is 0.51$. + +Extent +X axis extrusion starts at 61 mm and ends at 127 mm, for a width of 65 mm. +Y axis extrusion starts at 81 mm and ends at 127 mm, for a depth of 45 mm. +Z axis extrusion starts at 0 mm and ends at 15 mm, for a height of 15 mm. + +Extruder +Build time is 18 minutes 47 seconds. +Distance extruded is 46558.4 mm. +Distance traveled is 58503.3 mm. +Extruder speed is 50.0 +Extruder was extruding 79.6 percent of the time. +Extruder was toggled 1688 times. +Operating flow rate is 9.8 mm3/s. +Feed rate average is 51.9 mm/s, (3113.8 mm/min). + +Filament +Cross section area is 0.2 mm2. +Extrusion diameter is 0.5 mm. +Extrusion fill density ratio is 0.68 + +Material +Mass extruded is 9.8 grams. +Volume extruded is 9.1 cc. + +Meta +Text has 33738 lines and a size of 1239.0 KB. +Version is 11.09.28 + +Procedures +carve +bottom +preface +inset +fill +multiply +speed +temperature +raft +skirt +dimension +bookend + +Profile +UM-PLA-HighQuality + +Slice +Layer thickness is 0.4 mm. +Perimeter width is 0.72 mm. + +""" + +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 fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import cStringIO +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return StatisticRepository() + +def getWindowAnalyzeFile(fileName): + "Write statistics for a gcode file." + return getWindowAnalyzeFileGivenText( fileName, archive.getFileText(fileName) ) + +def getWindowAnalyzeFileGivenText( fileName, gcodeText, repository=None): + "Write statistics for a gcode file." + print('') + print('') + print('Statistics are being generated for the file ' + archive.getSummarizedFileName(fileName) ) + if repository == None: + repository = settings.getReadRepository( StatisticRepository() ) + skein = StatisticSkein() + statisticGcode = skein.getCraftedGcode(gcodeText, repository) + if repository.printStatistics.value: + print( statisticGcode ) + if repository.saveStatistics.value: + archive.writeFileMessageEnd('.txt', fileName, statisticGcode, 'The statistics file is saved as ') + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + "Write statistics for a skeinforge gcode file, if 'Write Statistics File for Skeinforge Chain' is selected." + repository = settings.getReadRepository( StatisticRepository() ) + if gcodeText == '': + gcodeText = archive.getFileText( fileNameSuffix ) + if repository.activateStatistic.value: + getWindowAnalyzeFileGivenText( fileNameSuffix, gcodeText, repository ) + + +class StatisticRepository: + "A class to handle the statistics settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.statistic.html', self) + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Statistic') + self.activateStatistic = settings.BooleanSetting().getFromValue('Activate Statistic', self, True ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Cost -', self ) + self.machineTime = settings.FloatSpin().getFromValue( 0.0, 'Machine Time ($/hour):', self, 5.0, 1.0 ) + self.material = settings.FloatSpin().getFromValue( 0.0, 'Material ($/kg):', self, 40.0, 20.0 ) + settings.LabelSeparator().getFromRepository(self) + self.density = settings.FloatSpin().getFromValue( 500.0, 'Density (kg/m3):', self, 2000.0, 930.0 ) + self.extrusionDiameterOverThickness = settings.FloatSpin().getFromValue( 1.0, 'Extrusion Diameter over Thickness (ratio):', self, 1.5, 1.25 ) + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File to Generate Statistics for', self, '') + self.printStatistics = settings.BooleanSetting().getFromValue('Print Statistics', self, True ) + self.saveStatistics = settings.BooleanSetting().getFromValue('Save Statistics', self, False ) + self.executeTitle = 'Generate Statistics' + + def execute(self): + "Write button has been clicked." + fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled, ['_comment'] ) + for fileName in fileNames: + getWindowAnalyzeFile(fileName) + + +class StatisticSkein: + "A class to get statistics for a gcode skein." + def __init__(self): + self.extrusionDiameter = None + self.oldLocation = None + self.operatingFeedRatePerSecond = None + self.output = cStringIO.StringIO() + self.profileName = None + self.version = None + + def addLine(self, line): + "Add a line of text and a newline to the output." + self.output.write(line + '\n') + + def addToPath(self, location): + "Add a point to travel and maybe extrusion." + if self.oldLocation != None: + travel = location.distance( self.oldLocation ) + if self.feedRateMinute > 0.0: + self.totalBuildTime += 60.0 * travel / self.feedRateMinute + self.totalDistanceTraveled += travel + if self.extruderActive: + self.totalDistanceExtruded += travel + self.cornerMaximum.maximize(location) + self.cornerMinimum.minimize(location) + self.oldLocation = location + + def extruderSet( self, active ): + "Maybe increment the number of times the extruder was toggled." + if self.extruderActive != active: + self.extruderToggled += 1 + self.extruderActive = active + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the statistics." + self.absolutePerimeterWidth = 0.4 + self.characters = 0 + self.cornerMaximum = Vector3(-987654321.0, -987654321.0, -987654321.0) + self.cornerMinimum = Vector3(987654321.0, 987654321.0, 987654321.0) + self.extruderActive = False + self.extruderSpeed = None + self.extruderToggled = 0 + self.feedRateMinute = 600.0 + self.layerThickness = 0.4 + self.numberOfLines = 0 + self.procedures = [] + self.repository = repository + self.totalBuildTime = 0.0 + self.totalDistanceExtruded = 0.0 + self.totalDistanceTraveled = 0.0 + lines = archive.getTextLines(gcodeText) + for line in lines: + self.parseLine(line) + averageFeedRate = self.totalDistanceTraveled / self.totalBuildTime + self.characters += self.numberOfLines + kilobytes = round( self.characters / 1024.0 ) + halfPerimeterWidth = 0.5 * self.absolutePerimeterWidth + halfExtrusionCorner = Vector3( halfPerimeterWidth, halfPerimeterWidth, halfPerimeterWidth ) + self.cornerMaximum += halfExtrusionCorner + self.cornerMinimum -= halfExtrusionCorner + extent = self.cornerMaximum - self.cornerMinimum + roundedHigh = euclidean.getRoundedPoint( self.cornerMaximum ) + roundedLow = euclidean.getRoundedPoint( self.cornerMinimum ) + roundedExtent = euclidean.getRoundedPoint( extent ) + axisString = " axis extrusion starts at " + crossSectionArea = 0.9 * self.absolutePerimeterWidth * self.layerThickness # 0.9 if from the typical fill density + if self.extrusionDiameter != None: + crossSectionArea = math.pi / 4.0 * self.extrusionDiameter * self.extrusionDiameter + volumeExtruded = 0.001 * crossSectionArea * self.totalDistanceExtruded + mass = volumeExtruded / repository.density.value + machineTimeCost = repository.machineTime.value * self.totalBuildTime / 3600.0 + materialCost = repository.material.value * mass + self.addLine(' ') + self.addLine('Cost') + self.addLine( "Machine time cost is %s$." % round( machineTimeCost, 2 ) ) + self.addLine( "Material cost is %s$." % round( materialCost, 2 ) ) + self.addLine( "Total cost is %s$." % round( machineTimeCost + materialCost, 2 ) ) + self.addLine(' ') + self.addLine('Extent') + self.addLine( "X%s%s mm and ends at %s mm, for a width of %s mm." % ( axisString, int( roundedLow.x ), int( roundedHigh.x ), int( extent.x ) ) ) + self.addLine( "Y%s%s mm and ends at %s mm, for a depth of %s mm." % ( axisString, int( roundedLow.y ), int( roundedHigh.y ), int( extent.y ) ) ) + self.addLine( "Z%s%s mm and ends at %s mm, for a height of %s mm." % ( axisString, int( roundedLow.z ), int( roundedHigh.z ), int( extent.z ) ) ) + self.addLine(' ') + self.addLine('Extruder') + self.addLine( "Build time is %s." % euclidean.getDurationString( self.totalBuildTime ) ) + self.addLine( "Distance extruded is %s mm." % euclidean.getThreeSignificantFigures( self.totalDistanceExtruded ) ) + self.addLine( "Distance traveled is %s mm." % euclidean.getThreeSignificantFigures( self.totalDistanceTraveled ) ) + if self.extruderSpeed != None: + self.addLine( "Extruder speed is %s" % euclidean.getThreeSignificantFigures( self.extruderSpeed ) ) + self.addLine( "Extruder was extruding %s percent of the time." % euclidean.getThreeSignificantFigures( 100.0 * self.totalDistanceExtruded / self.totalDistanceTraveled ) ) + self.addLine( "Extruder was toggled %s times." % self.extruderToggled ) + if self.operatingFeedRatePerSecond != None: + flowRate = crossSectionArea * self.operatingFeedRatePerSecond + self.addLine( "Operating flow rate is %s mm3/s." % euclidean.getThreeSignificantFigures( flowRate ) ) + self.addLine( "Feed rate average is %s mm/s, (%s mm/min)." % ( euclidean.getThreeSignificantFigures( averageFeedRate ), euclidean.getThreeSignificantFigures( 60.0 * averageFeedRate ) ) ) + self.addLine(' ') + self.addLine('Filament') + self.addLine( "Cross section area is %s mm2." % euclidean.getThreeSignificantFigures( crossSectionArea ) ) + if self.extrusionDiameter != None: + self.addLine( "Extrusion diameter is %s mm." % euclidean.getThreeSignificantFigures( self.extrusionDiameter ) ) + self.addLine('Extrusion fill density ratio is %s' % euclidean.getThreeSignificantFigures( crossSectionArea / self.absolutePerimeterWidth / self.layerThickness ) ) + self.addLine(' ') + self.addLine('Material') + self.addLine( "Mass extruded is %s grams." % euclidean.getThreeSignificantFigures( 1000.0 * mass ) ) + self.addLine( "Volume extruded is %s cc." % euclidean.getThreeSignificantFigures( volumeExtruded ) ) + self.addLine(' ') + self.addLine('Meta') + self.addLine( "Text has %s lines and a size of %s KB." % ( self.numberOfLines, kilobytes ) ) + if self.version != None: + self.addLine( "Version is " + self.version ) + self.addLine(' ') + self.addLine( "Procedures" ) + for procedure in self.procedures: + self.addLine(procedure) + if self.profileName != None: + self.addLine(' ') + self.addLine( 'Profile' ) + self.addLine(self.profileName) + self.addLine(' ') + self.addLine('Slice') + self.addLine( "Layer thickness is %s mm." % euclidean.getThreeSignificantFigures( self.layerThickness ) ) + self.addLine( "Perimeter width is %s mm." % euclidean.getThreeSignificantFigures( self.absolutePerimeterWidth ) ) + self.addLine(' ') + return self.output.getvalue() + + def getLocationSetFeedRateToSplitLine( self, splitLine ): + "Get location ans set feed rate to the plsit line." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + indexOfF = gcodec.getIndexOfStartingWithSecond( "F", splitLine ) + if indexOfF > 0: + self.feedRateMinute = gcodec.getDoubleAfterFirstLetter( splitLine[indexOfF] ) + return location + + def helicalMove( self, isCounterclockwise, splitLine ): + "Get statistics for a helical move." + if self.oldLocation == None: + return + location = self.getLocationSetFeedRateToSplitLine(splitLine) + location += self.oldLocation + center = self.oldLocation.copy() + indexOfR = gcodec.getIndexOfStartingWithSecond( "R", splitLine ) + if indexOfR > 0: + radius = gcodec.getDoubleAfterFirstLetter( splitLine[ indexOfR ] ) + halfLocationMinusOld = location - self.oldLocation + halfLocationMinusOld *= 0.5 + halfLocationMinusOldLength = halfLocationMinusOld.magnitude() + centerMidpointDistanceSquared = radius * radius - halfLocationMinusOldLength * halfLocationMinusOldLength + centerMidpointDistance = math.sqrt( max( centerMidpointDistanceSquared, 0.0 ) ) + centerMinusMidpoint = euclidean.getRotatedWiddershinsQuarterAroundZAxis( halfLocationMinusOld ) + centerMinusMidpoint.normalize() + centerMinusMidpoint *= centerMidpointDistance + if isCounterclockwise: + center.setToVector3( halfLocationMinusOld + centerMinusMidpoint ) + else: + center.setToVector3( halfLocationMinusOld - centerMinusMidpoint ) + else: + center.x = gcodec.getDoubleForLetter( "I", splitLine ) + center.y = gcodec.getDoubleForLetter( "J", splitLine ) + curveSection = 0.5 + center += self.oldLocation + afterCenterSegment = location - center + beforeCenterSegment = self.oldLocation - center + afterCenterDifferenceAngle = euclidean.getAngleAroundZAxisDifference( afterCenterSegment, beforeCenterSegment ) + absoluteDifferenceAngle = abs( afterCenterDifferenceAngle ) + steps = int( round( 0.5 + max( absoluteDifferenceAngle * 2.4, absoluteDifferenceAngle * beforeCenterSegment.magnitude() / curveSection ) ) ) + stepPlaneAngle = euclidean.getWiddershinsUnitPolar( afterCenterDifferenceAngle / steps ) + zIncrement = ( afterCenterSegment.z - beforeCenterSegment.z ) / float( steps ) + for step in xrange( 1, steps ): + beforeCenterSegment = euclidean.getRoundZAxisByPlaneAngle( stepPlaneAngle, beforeCenterSegment ) + beforeCenterSegment.z += zIncrement + arcPoint = center + beforeCenterSegment + self.addToPath( arcPoint ) + self.addToPath( location ) + + def linearMove( self, splitLine ): + "Get statistics for a linear move." + location = self.getLocationSetFeedRateToSplitLine(splitLine) + self.addToPath( location ) + + def parseLine(self, line): + "Parse a gcode line and add it to the statistics." + self.characters += len(line) + self.numberOfLines += 1 + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + elif firstWord == 'G2': + self.helicalMove( False, splitLine ) + elif firstWord == 'G3': + self.helicalMove( True, splitLine ) + elif firstWord == 'M101': + self.extruderSet( True ) + elif firstWord == 'M102': + self.extruderSet( False ) + elif firstWord == 'M103': + self.extruderSet( False ) + elif firstWord == 'M108': + self.extruderSpeed = gcodec.getDoubleAfterFirstLetter(splitLine[1]) + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + self.extrusionDiameter = self.repository.extrusionDiameterOverThickness.value * self.layerThickness + elif firstWord == '(': + self.operatingFeedRatePerSecond = float(splitLine[1]) + elif firstWord == '(': + self.absolutePerimeterWidth = abs(float(splitLine[1])) + elif firstWord == '(': + self.procedures.append(splitLine[1]) + elif firstWord == '(': + self.profileName = line.replace('(', '').replace(')', '').strip() + elif firstWord == '(': + self.version = splitLine[1] + + +def main(): + "Display the statistics dialog." + if len(sys.argv) > 1: + getWindowAnalyzeFile(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.pyc new file mode 100644 index 0000000..2182b2e Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/statistic.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/synopsis.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/synopsis.py new file mode 100644 index 0000000..98be978 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/synopsis.py @@ -0,0 +1,207 @@ +""" +This page is in the table of contents. +Synopsis is an analyze plugin to export the profile from a skeinforge gcode file as a csv or zip file. + +The synopsis manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Synopsis + +==Operation== +The default 'Activate Synopsis' checkbox is off. When it is on, the functions described below will work when called from the 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 Synopsis' checkbox is on, when synopsis is run directly. + +==Settings== +===Export Profile As CSV File=== +Default is on. + +If 'Export Profile As CSV File' is selected, the profile from a skeinforge gcode file with comments will be exported as a csv (comma separated values) file. + +===Export Profile As Zip File=== +Default is off. + +If 'Export Profile As Zip File' is selected, the profile from a skeinforge gcode file with comments will be exported as a zip file. + +==Examples== +Below are examples of synopsis being used. These examples are run in a terminal in the folder which contains Screw Holder_penultimate.gcode and synopsis.py. + +> python synopsis.py +This brings up the synopsis dialog. + +> python synopsis.py Screw Holder_penultimate.gcode +The synopsis file is saved as Screw_Holder_penultimate_synopsis.csv + +""" + + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys +import time +import zipfile + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Gary Hodgson ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addAbridgedSettings(abridgedSettings, repositoryWriter): + 'Add the abridged settings to a repository writer.' + for abridgedSetting in abridgedSettings: + repositoryWriter.write('%s\n' % abridgedSetting.__repr__()) + +def exportProfileAsCSVFile(abridgedSettings, suffixFileNameWithoutExtension): + 'Export the profile from the gcode text as a csv file.' + if len(abridgedSettings) < 1: + print('Warning, the synopsis csv file could not be generated because there are no setting comments in the file.') + return + repositoryWriter = settings.getRepositoryWriter('profile') + suffixFileName = suffixFileNameWithoutExtension + 'csv' + addAbridgedSettings(abridgedSettings, repositoryWriter) + archive.writeFileText(suffixFileName, repositoryWriter.getvalue()) + print('The synopsis csv file is saved as ' + archive.getSummarizedFileName(suffixFileName)) + +def exportProfileAsZipFile(abridgedSettings, suffixDirectoryPath, suffixFileNameWithoutExtension): + 'Export the profile from the gcode text as a zip file.' + if len(abridgedSettings) < 1: + print('Warning, the synopsis zip file could not be generated because there are no setting comments in the file.') + return + suffixFileName = suffixFileNameWithoutExtension + 'zip' + abridgedSettingsDictionary = {} + for abridgedSetting in abridgedSettings: + euclidean.addElementToListDictionary(abridgedSetting, abridgedSetting.procedure, abridgedSettingsDictionary) + abridgedSettingFileNamePaths = [] + for abridgedSettingsKey in abridgedSettingsDictionary: + abridgedSettings = abridgedSettingsDictionary[abridgedSettingsKey] + repositoryWriter = settings.getRepositoryWriter(abridgedSettingsKey) + addAbridgedSettings(abridgedSettings, repositoryWriter) + abridgedSettingFileNamePath = FileNamePath(suffixDirectoryPath, abridgedSettingsKey + '.csv') + abridgedSettingFileNamePaths.append(abridgedSettingFileNamePath) + archive.writeFileText(abridgedSettingFileNamePath.path, repositoryWriter.getvalue()) + time.sleep(0.2) # the sleep is so that the file system is sure to be consistent + zipArchive = zipfile.ZipFile(suffixFileName, 'w', compression=zipfile.ZIP_DEFLATED) + for abridgedSettingFileNamePath in abridgedSettingFileNamePaths: + zipArchive.write(abridgedSettingFileNamePath.path, abridgedSettingFileNamePath.fileName) + zipArchive.close() + time.sleep(0.2) # the sleep is so that the file system is sure to be consistent + for abridgedSettingFileNamePath in abridgedSettingFileNamePaths: + os.remove(abridgedSettingFileNamePath.path) + print('The synopsis zip file is saved as ' + archive.getSummarizedFileName(suffixFileName)) + +def getAbridgedSettings(gcodeText): + 'Get the abridged settings from the gcode text.' + lines = archive.getTextLines(gcodeText) + abridgedSettings = [] + settingsStart = False + for line in lines: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = None + if len(splitLine) > 0: + firstWord = splitLine[0] + if firstWord == '(' and settingsStart: + if len(splitLine) > 4: + abridgedSettings.append(AbridgedSetting(splitLine)) + valueString = ' '.join(splitLine[3 : -1]) + elif firstWord == '()': + settingsStart = True + elif firstWord == '()': + return abridgedSettings + return [] + +def getNewRepository(): + 'Get new repository.' + return SynopsisRepository() + +def getWindowAnalyzeFile(fileName): + 'Write scalable vector graphics for a gcode file.' + gcodeText = archive.getFileText(fileName) + return getWindowAnalyzeFileGivenText(fileName, gcodeText) + +def getWindowAnalyzeFileGivenText(fileName, gcodeText, repository=None): + 'Write scalable vector graphics for a gcode file given the settings.' + if gcodeText == '': + return None + if repository == None: + repository = settings.getReadRepository(SynopsisRepository()) + startTime = time.time() + suffixFileNameWithoutExtension = fileName[: fileName.rfind('.')] + '_synopsis.' + suffixDirectoryPath = os.path.dirname(suffixFileNameWithoutExtension) + suffixReplacedBaseNameWithoutExtension = os.path.basename(suffixFileNameWithoutExtension).replace(' ', '_') + suffixFileNameWithoutExtension = os.path.join(suffixDirectoryPath, suffixReplacedBaseNameWithoutExtension) + abridgedSettings = getAbridgedSettings(gcodeText) + if repository.exportProfileAsCSVFile.value: + exportProfileAsCSVFile(abridgedSettings, suffixFileNameWithoutExtension) + if repository.exportProfileAsZipFile.value: + exportProfileAsZipFile(abridgedSettings, suffixDirectoryPath, suffixFileNameWithoutExtension) + print('It took %s for synopsis to analyze the file.' % euclidean.getDurationString(time.time() - startTime)) + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + 'Write scalable vector graphics for a skeinforge gcode file, if activate synopsis is selected.' + repository = settings.getReadRepository( SynopsisRepository() ) + if not repository.activateSynopsis.value: + return + gcodeText = archive.getTextIfEmpty( fileNameSuffix, gcodeText ) + getWindowAnalyzeFileGivenText( fileNameSuffix, gcodeText, repository ) + + +class AbridgedSetting: + 'A class to handle an abridged setting.' + def __init__(self, splitLine): + 'Initialize.' + self.procedure = splitLine[1] + self.name = splitLine[2].replace('_', ' ') + self.value = ' '.join(splitLine[3 : -1]) + + def __repr__(self): + 'Get the tab separated representation of this AbridgedSetting.' + return '%s\t%s\t%s' % (self.procedure, self.name, self.value) + + +class FileNamePath: + 'A class to handle a file name and path.' + def __init__(self, directoryName, fileName): + 'Initialize.' + self.fileName = fileName + self.path = os.path.join(directoryName, fileName) + + def __repr__(self): + 'Get the tab separated representation of this FileNamePath.' + return '%s\t%s' % (self.fileName, self.path) + + +class SynopsisRepository: + 'A class to handle the synopsis settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.synopsis.html', self ) + self.activateSynopsis = settings.BooleanSetting().getFromValue('Activate Synopsis', self, False ) + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File to Write Synopsis for', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Synopsis') + self.exportProfileAsCSVFile = settings.BooleanSetting().getFromValue('Export Profile As CSV File', self, True) + self.exportProfileAsZipFile = settings.BooleanSetting().getFromValue('Export Profile As Zip File', self, False) + self.executeTitle = 'Synopsis' + + def execute(self): + 'Write button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled ) + for fileName in fileNames: + getWindowAnalyzeFile(fileName) + + +def main(): + 'Display the synopsis dialog.' + if len(sys.argv) > 1: + getWindowAnalyzeFile(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/synopsis.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/synopsis.pyc new file mode 100644 index 0000000..e1a9232 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/synopsis.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/vectorwrite.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/vectorwrite.py new file mode 100644 index 0000000..a0479fd --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/vectorwrite.py @@ -0,0 +1,358 @@ +""" +This page is in the table of contents. +Vectorwrite is a very interesting analyze plugin that will create an SVG vector image for each layer that you can then use in some other printing system. + +The Scalable Vector Graphics file can be opened by an SVG viewer or an SVG capable browser like Mozilla: +http://www.mozilla.com/firefox/ + +The vectorwrite manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Vectorwrite + +==Operation== +The default 'Activate Vectorwrite' checkbox is off. When it is on, the functions described below will work when called from the 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 Vectorwrite' checkbox is on, when vectorwrite is run directly. + +==Settings== +===Add Loops=== +Default is on. + +If 'Add Loops' is selected, the loops will be added in yellow to the the scalable vector graphics output. + +===Add Paths=== +Default is on. + +If 'Add Paths' is selected, the paths will be added in pink to the the scalable vector graphics output. + +===Add Perimeters=== +Default is on. + +If 'Add Perimeters' is selected, the perimeters will be added to the the scalable vector graphics output. The outer perimeters will be red and the inner perimeters will be orange. + +===Layers=== +====Layers From==== +Default is zero. + +The "Layers From" is the index of the bottom layer that will be displayed. If the layer from is the default zero, the display will start from the lowest layer. If the the layer from index is negative, then the display will start from the layer from index below the top layer. + +====Layers To==== +Default is a huge number, which will be limited to the highest index layer. + +The "Layers To" is the index of the top layer that will be displayed. If the layer to index is a huge number like the default, the display will go to the top of the model, at least until we model habitats:) If the layer to index is negative, then the display will go to the layer to index below the top layer. The layer from until layer to index is a python slice. + +===SVG Viewer=== +Default is webbrowser. + +If the 'SVG Viewer' is set to the default 'webbrowser', the scalable vector graphics file will be sent to the default browser to be opened. If the 'SVG Viewer' is set to a program name, the scalable vector graphics file will be sent to that program to be opened. + +==Examples== +Below are examples of vectorwrite being used. These examples are run in a terminal in the folder which contains Screw Holder_penultimate.gcode and vectorwrite.py. + +> python vectorwrite.py +This brings up the vectorwrite dialog. + +> python vectorwrite.py Screw Holder_penultimate.gcode +The vectorwrite file is saved as Screw_Holder_penultimate_vectorwrite.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 fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import cStringIO +import os +import sys +import time + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Nophead ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return VectorwriteRepository() + +def getWindowAnalyzeFile(fileName): + 'Write scalable vector graphics for a gcode file.' + gcodeText = archive.getFileText(fileName) + return getWindowAnalyzeFileGivenText(fileName, gcodeText) + +def getWindowAnalyzeFileGivenText( fileName, gcodeText, repository=None): + 'Write scalable vector graphics for a gcode file given the settings.' + if gcodeText == '': + return None + if repository == None: + repository = settings.getReadRepository( VectorwriteRepository() ) + startTime = time.time() + vectorwriteGcode = VectorwriteSkein().getCarvedSVG( fileName, gcodeText, repository ) + if vectorwriteGcode == '': + return None + suffixFileName = fileName[ : fileName.rfind('.') ] + '_vectorwrite.svg' + suffixDirectoryName = os.path.dirname(suffixFileName) + suffixReplacedBaseName = os.path.basename(suffixFileName).replace(' ', '_') + suffixFileName = os.path.join( suffixDirectoryName, suffixReplacedBaseName ) + archive.writeFileText( suffixFileName, vectorwriteGcode ) + print('The vectorwrite file is saved as ' + archive.getSummarizedFileName(suffixFileName) ) + print('It took %s to vectorwrite the file.' % euclidean.getDurationString( time.time() - startTime ) ) + settings.openSVGPage( suffixFileName, repository.svgViewer.value ) + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + 'Write scalable vector graphics for a skeinforge gcode file, if activate vectorwrite is selected.' + repository = settings.getReadRepository( VectorwriteRepository() ) + if not repository.activateVectorwrite.value: + return + gcodeText = archive.getTextIfEmpty( fileNameSuffix, gcodeText ) + getWindowAnalyzeFileGivenText( fileNameSuffix, gcodeText, repository ) + + +class SVGWriterVectorwrite( svg_writer.SVGWriter ): + 'A class to vectorwrite a carving.' + def addPaths( self, colorName, paths, transformString ): + 'Add paths to the output.' + pathString = '' + for path in paths: + pathString += self.getSVGStringForPath(path) + ' ' + if len( pathString ) < 1: + return + pathElementNodeCopy = self.pathElementNode.getCopy('', self.pathElementNode.parentNode ) + pathCopyDictionary = pathElementNodeCopy.attributes + pathCopyDictionary['d'] = pathString[ : - 1 ] + pathCopyDictionary['fill'] = 'none' + pathCopyDictionary['stroke'] = colorName + pathCopyDictionary['transform'] = transformString + + def addRotatedLoopLayerToOutput( self, layerIndex, threadLayer ): + 'Add rotated boundary layer to the output.' + self.addLayerBegin( layerIndex, threadLayer ) + transformString = self.getTransformString() + self.pathDictionary['d'] = self.getSVGStringForLoops( threadLayer.boundaryLoops ) + self.pathDictionary['transform'] = transformString + self.addPaths('#fa0', threadLayer.innerPerimeters, transformString ) #orange + self.addPaths('#ff0', threadLayer.loops, transformString ) #yellow + self.addPaths('#f00', threadLayer.outerPerimeters, transformString ) #red + self.addPaths('#f5c', threadLayer.paths, transformString ) #light violetred + + +class ThreadLayer: + 'Threads with a z.' + def __init__( self, z ): + self.boundaryLoops = [] + self.innerPerimeters = [] + self.loops = [] + self.outerPerimeters = [] + self.paths = [] + self.z = z + + def __repr__(self): + 'Get the string representation of this loop layer.' + return str(self.__dict__) + + def getTotalNumberOfThreads(self): + 'Get the total number of loops, paths and perimeters.' + return len(self.boundaryLoops) + len(self.innerPerimeters) + len(self.loops) + len(self.outerPerimeters) + len(self.paths) + + def maximize(self, vector3): + 'Maximize the vector3 over the loops, paths and perimeters.' + pointComplex = vector3.dropAxis() + pointComplex = euclidean.getMaximum(euclidean.getMaximumByComplexPaths(self.boundaryLoops), pointComplex) + pointComplex = euclidean.getMaximum(euclidean.getMaximumByComplexPaths(self.innerPerimeters), pointComplex) + pointComplex = euclidean.getMaximum(euclidean.getMaximumByComplexPaths(self.loops), pointComplex) + pointComplex = euclidean.getMaximum(euclidean.getMaximumByComplexPaths(self.outerPerimeters), pointComplex) + pointComplex = euclidean.getMaximum(euclidean.getMaximumByComplexPaths(self.paths), pointComplex) + vector3.setToXYZ(pointComplex.real, pointComplex.imag, max(self.z, vector3.z)) + + def minimize(self, vector3): + 'Minimize the vector3 over the loops, paths and perimeters.' + pointComplex = vector3.dropAxis() + pointComplex = euclidean.getMinimum(euclidean.getMinimumByComplexPaths(self.boundaryLoops), pointComplex) + pointComplex = euclidean.getMinimum(euclidean.getMinimumByComplexPaths(self.innerPerimeters), pointComplex) + pointComplex = euclidean.getMinimum(euclidean.getMinimumByComplexPaths(self.loops), pointComplex) + pointComplex = euclidean.getMinimum(euclidean.getMinimumByComplexPaths(self.outerPerimeters), pointComplex) + pointComplex = euclidean.getMinimum(euclidean.getMinimumByComplexPaths(self.paths), pointComplex) + vector3.setToXYZ(pointComplex.real, pointComplex.imag, min(self.z, vector3.z)) + + +class VectorwriteRepository: + 'A class to handle the vectorwrite settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.analyze_plugins.vectorwrite.html', self ) + self.activateVectorwrite = settings.BooleanSetting().getFromValue('Activate Vectorwrite', self, False ) + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File to Write Vector Graphics for', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Vectorwrite') + self.addLoops = settings.BooleanSetting().getFromValue('Add Loops', self, True) + self.addPaths = settings.BooleanSetting().getFromValue('Add Paths', self, True) + self.addPerimeters = settings.BooleanSetting().getFromValue('Add Perimeters', self, True) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Layers -', self ) + self.layersFrom = settings.IntSpin().getFromValue( 0, 'Layers From (index):', self, 20, 0 ) + self.layersTo = settings.IntSpin().getSingleIncrementFromValue( 0, 'Layers To (index):', self, 912345678, 912345678 ) + settings.LabelSeparator().getFromRepository(self) + self.svgViewer = settings.StringSetting().getFromValue('SVG Viewer:', self, 'webbrowser') + settings.LabelSeparator().getFromRepository(self) + self.executeTitle = 'Vectorwrite' + + def execute(self): + 'Write button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrGcodeDirectory( self.fileNameInput.value, self.fileNameInput.wasCancelled ) + for fileName in fileNames: + getWindowAnalyzeFile(fileName) + + +class VectorwriteSkein: + 'A class to vectorwrite a carving.' + def __init__(self): + 'Initialize.' + self.layerCount = settings.LayerCount() + + def addRotatedLoopLayer(self, z): + 'Add rotated loop layer.' + self.layerCount.printProgressIncrement('vectorwrite') + self.threadLayer = ThreadLayer(z) + self.threadLayers.append(self.threadLayer) + + def addToLoops(self): + 'Add the thread to the loops.' + self.isLoop = False + if len(self.thread) < 1: + return + if self.repository.addLoops.value: + self.threadLayer.loops.append(self.thread) + self.thread = [] + + def addToPerimeters(self): + 'Add the thread to the perimeters.' + self.isPerimeter = False + if len(self.thread) < 1: + return + if self.repository.addPerimeters.value: + if self.isOuter: + self.threadLayer.outerPerimeters.append(self.thread) + else: + self.threadLayer.innerPerimeters.append(self.thread) + self.thread = [] + + def getCarvedSVG(self, fileName, gcodeText, repository): + 'Parse gnu triangulated surface text and store the vectorwrite gcode.' + cornerMaximum = Vector3(-987654321.0, -987654321.0, -987654321.0) + cornerMinimum = Vector3(987654321.0, 987654321.0, 987654321.0) + self.boundaryLoop = None + self.extruderActive = False + self.isLoop = False + self.isOuter = False + self.isPerimeter = False + self.lines = archive.getTextLines(gcodeText) + self.oldLocation = None + self.thread = [] + self.threadLayers = [] + self.repository = repository + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + self.removeEmptyLayers() + for threadLayer in self.threadLayers: + threadLayer.maximize(cornerMaximum) + threadLayer.minimize(cornerMinimum) + halfLayerThickness = 0.5 * self.layerThickness + cornerMaximum.z += halfLayerThickness + cornerMinimum.z -= halfLayerThickness + svgWriter = SVGWriterVectorwrite( + True, cornerMaximum, cornerMinimum, self.decimalPlacesCarried, self.layerThickness, self.perimeterWidth) + return svgWriter.getReplacedSVGTemplate(fileName, 'vectorwrite', self.threadLayers) + + def getCarveLayerThickness(self): + 'Get the layer thickness.' + return self.layerThickness + + def linearMove( self, splitLine ): + 'Get statistics for a linear move.' + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.extruderActive: + if len(self.thread) == 0: + self.thread = [ self.oldLocation.dropAxis() ] + self.thread.append(location.dropAxis()) + self.oldLocation = location + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '(': + self.decimalPlacesCarried = int(splitLine[1]) + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + elif firstWord == '()': + return + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + + def parseLine(self, line): + 'Parse a gcode line and add it to the outset skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + if self.isLoop: + self.addToLoops() + return + if self.isPerimeter: + self.addToPerimeters() + return + if self.repository.addPaths.value: + self.threadLayer.paths.append(self.thread) + self.thread = [] + elif firstWord == '()': + self.boundaryLoop = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if self.boundaryLoop == None: + self.boundaryLoop = [] + self.threadLayer.boundaryLoops.append( self.boundaryLoop ) + self.boundaryLoop.append(location.dropAxis()) + elif firstWord == '(': + self.addRotatedLoopLayer(float(splitLine[1])) + elif firstWord == '()': + self.addToLoops() + elif firstWord == '(': + self.isLoop = True + elif firstWord == '(': + self.isPerimeter = True + self.isOuter = ( splitLine[1] == 'outer') + elif firstWord == '()': + self.addToPerimeters() + + def removeEmptyLayers(self): + 'Remove empty layers.' + for threadLayerIndex, threadLayer in enumerate(self.threadLayers): + if threadLayer.getTotalNumberOfThreads() > 0: + self.threadLayers = self.threadLayers[threadLayerIndex :] + return + + +def main(): + 'Display the vectorwrite dialog.' + if len(sys.argv) > 1: + getWindowAnalyzeFile(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/vectorwrite.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/vectorwrite.pyc new file mode 100644 index 0000000..d5859a9 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/analyze_plugins/vectorwrite.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft.py new file mode 100644 index 0000000..61b8103 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft.py @@ -0,0 +1,128 @@ +""" +This page is in the table of contents. +Craft is a script to access the plugins which craft a gcode file. + +The plugin buttons which are commonly used are bolded and the ones which are rarely used have normal font weight. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addSubmenus( menu, pluginFileName, pluginFolderPath, pluginPath ): + "Add a tool plugin menu." + submenu = settings.Tkinter.Menu( menu, tearoff = 0 ) + menu.add_cascade( label = pluginFileName.capitalize(), menu = submenu ) + settings.ToolDialog().addPluginToMenu( submenu, pluginPath ) + submenu.add_separator() + submenuFileNames = archive.getPluginFileNamesFromDirectoryPath( pluginFolderPath ) + for submenuFileName in submenuFileNames: + settings.ToolDialog().addPluginToMenu( submenu, os.path.join( pluginFolderPath, submenuFileName ) ) + +def addToCraftMenu( menu ): + "Add a craft plugin menu." + settings.ToolDialog().addPluginToMenu(menu, archive.getUntilDot(archive.getSkeinforgePluginsPath('craft.py'))) + menu.add_separator() + directoryPath = skeinforge_craft.getPluginsDirectoryPath() + directoryFolders = settings.getFolders(directoryPath) + pluginFileNames = skeinforge_craft.getPluginFileNames() + for pluginFileName in pluginFileNames: + pluginFolderName = pluginFileName + '_plugins' + pluginPath = os.path.join( directoryPath, pluginFileName ) + if pluginFolderName in directoryFolders: + addSubmenus( menu, pluginFileName, os.path.join( directoryPath, pluginFolderName ), pluginPath ) + else: + settings.ToolDialog().addPluginToMenu( menu, pluginPath ) + +def addToMenu( master, menu, repository, window ): + "Add a tool plugin menu." + CraftMenuSaveListener( menu, window ) + +def getNewRepository(): + 'Get new repository.' + return skeinforge_craft.CraftRepository() + +def writeOutput(fileName): + "Craft a gcode file." + return skeinforge_craft.writeOutput(fileName) + + +class CraftMenuSaveListener: + "A class to update a craft menu." + def __init__( self, menu, window ): + "Set the menu." + self.menu = menu + addToCraftMenu( menu ) + euclidean.addElementToListDictionaryIfNotThere( self, window, settings.globalProfileSaveListenerListTable ) + + def save(self): + "Profile has been saved and profile menu should be updated." + settings.deleteMenuItems( self.menu ) + addToCraftMenu( self.menu ) + + +class CraftRadioButtonsSaveListener: + "A class to update the craft radio buttons." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + euclidean.addElementToListDictionaryIfNotThere( self, self.repository.repositoryDialog, settings.globalProfileSaveListenerListTable ) + self.gridPosition = gridPosition.getCopy() + self.gridPosition.increment() + self.gridPosition.row = gridPosition.rowStart + self.setRadioButtons() + + def getFromRadioPlugins( self, radioPlugins, repository ): + "Initialize." + self.name = 'CraftRadioButtonsSaveListener' + self.radioPlugins = radioPlugins + self.repository = repository + repository.displayEntities.append(self) + return self + + def save(self): + "Profile has been saved and craft radio plugins should be updated." + self.setRadioButtons() + + def setRadioButtons(self): + "Profile has been saved and craft radio plugins should be updated." + craftSequence = skeinforge_profile.getCraftTypePluginModule().getCraftSequence() + gridPosition = self.gridPosition.getCopy() + maximumValue = False + activeRadioPlugins = [] + for radioPlugin in self.radioPlugins: + if radioPlugin.name in craftSequence: + activeRadioPlugins.append( radioPlugin ) + radioPlugin.incrementGridPosition(gridPosition) + maximumValue = max( radioPlugin.value, maximumValue ) + else: + radioPlugin.radiobutton.grid_remove() + if not maximumValue: + selectedRadioPlugin = settings.getSelectedRadioPlugin( self.repository.importantFileNames + [ activeRadioPlugins[0].name ], activeRadioPlugins ).setSelect() + self.repository.pluginFrame.update() + + +def main(): + "Display the craft dialog." + if len(sys.argv) > 1: + settings.startMainLoopFromWindow(writeOutput(' '.join(sys.argv[1 :]))) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft.pyc new file mode 100644 index 0000000..beb5d2d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__init__.py new file mode 100644 index 0000000..1121e8a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 3 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/bottom.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/bottom.cpython-32.pyc new file mode 100644 index 0000000..70d4745 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/bottom.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/carve.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/carve.cpython-32.pyc new file mode 100644 index 0000000..fbffbf9 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/carve.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/export.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/export.cpython-32.pyc new file mode 100644 index 0000000..d162054 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/export.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/inset.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/inset.cpython-32.pyc new file mode 100644 index 0000000..ef576a5 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/inset.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/multiply.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/multiply.cpython-32.pyc new file mode 100644 index 0000000..915c5fc Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/multiply.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/preface.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/preface.cpython-32.pyc new file mode 100644 index 0000000..a74a095 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/preface.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/scale.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/scale.cpython-32.pyc new file mode 100644 index 0000000..6aab8fe Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/scale.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/speed.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/speed.cpython-32.pyc new file mode 100644 index 0000000..3778437 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/speed.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/widen.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/widen.cpython-32.pyc new file mode 100644 index 0000000..bb62e8d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/__pycache__/widen.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bookend.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bookend.py new file mode 100644 index 0000000..a6de8f5 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bookend.py @@ -0,0 +1,145 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Bookend adds the start and end files to the gcode. + +The bookend manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Bookend + +==Operation== +The default 'Activate Bookend' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +Bookend looks for alteration files in the alterations folder in the .skeinforge folder in the home directory. Bookend 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. If it doesn't find the file it then looks in the alterations folder in the skeinforge_plugins folder. + +===Name of End File=== +Default is 'end.gcode'. + +If there is a file with the name of the "Name of End File" setting, it will be added to the very end of the gcode. + +===Name of Start File=== +Default is 'start.gcode'. + +If there is a file with the name of the "Name of Start File" setting, it will be added to the very beginning of the gcode. + +==Examples== +The following examples add the bookend information to the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and bookend.py. + +> python bookend.py +This brings up the bookend dialog. + +> python bookend.py Screw Holder Bottom.stl +The bookend tool is parsing the file: +Screw Holder Bottom.stl +.. +The bookend tool has created the file: +.. Screw Holder Bottom_bookend.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, text='', repository=None): + 'Bookend a gcode linear move text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Bookend a gcode linear move text.' + if gcodec.isProcedureDoneOrFileIsEmpty(gcodeText, 'bookend'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(BookendRepository()) + if not repository.activateBookend.value: + return gcodeText + return BookendSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return BookendRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Bookend a gcode linear move file. Chain bookend the gcode if the bookend procedure has not been done.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'bookend', shouldAnalyze) + + +class BookendRepository: + "A class to handle the bookend settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.bookend.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName(fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Bookend', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Bookend') + self.activateBookend = settings.BooleanSetting().getFromValue('Activate Bookend', self, True) + self.nameOfEndFile = settings.StringSetting().getFromValue('Name of End File:', self, 'end.gcode') + self.nameOfStartFile = settings.StringSetting().getFromValue('Name of Start File:', self, 'start.gcode') + self.executeTitle = 'Bookend' + + def execute(self): + 'Bookend button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class BookendSkein: + "A class to bookend a skein of extrusions." + def __init__(self): + 'Initialize.' + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.lineIndex = 0 + + 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." + self.distanceFeedRate.addLinesSetAbsoluteDistanceMode(settings.getAlterationFileLines(fileName)) + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the bevel gcode." + self.lines = archive.getTextLines(gcodeText) + self.addFromUpperLowerFile(repository.nameOfStartFile.value) # Add a start file if it exists. + self.parseInitialization() + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.distanceFeedRate.addLine(line) + self.addFromUpperLowerFile(repository.nameOfEndFile.value) # Add an end file if it exists. + return self.distanceFeedRate.output.getvalue() + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('bookend') + return + self.distanceFeedRate.addLine(line) + + + +def main(): + "Display the bookend dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bookend.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bookend.pyc new file mode 100644 index 0000000..f02e409 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bookend.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bottom.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bottom.py new file mode 100644 index 0000000..9cd1907 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bottom.py @@ -0,0 +1,159 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Bottom sets the bottom of the carving to the defined altitude. + +The bottom manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Bottom + +==Operation== +The default 'Activate Bottom' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Additional Height over Layer Thickness=== +Default is half. + +The layers will start at the altitude plus the 'Additional Height over Layer Thickness' times the layer thickness. The default value of half means that the bottom layer is at the height of the bottom slice, because each slice is made through the middle of each layer. Raft expects the layers to start at an additional half layer thickness. You should only change 'Additional Height over Layer Thickness' if you are manipulating the skeinforge output with your own program which does not use the raft tool. + +===Altitude=== +Default is zero. + +Defines the altitude of the bottom of the model. The bottom slice has a z of the altitude plus the 'Additional Height over Layer Thickness' times the layer thickness. + +===SVG Viewer=== +Default is webbrowser. + +If the 'SVG Viewer' is set to the default 'webbrowser', the scalable vector graphics file will be sent to the default browser to be opened. If the 'SVG Viewer' is set to a program name, the scalable vector graphics file will be sent to that program to be opened. + +==Examples== +The following examples bottom the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and bottom.py. + +> python bottom.py +This brings up the bottom dialog. + +> python bottom.py Screw Holder Bottom.stl +The bottom tool is parsing the file: +Screw Holder Bottom.stl +.. +The bottom tool has created the file: +.. Screw Holder Bottom_bottom.gcode + +""" + +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 datetime import date +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.svg_reader import SVGReader +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +from fabmetheus_utilities import xml_simple_writer +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import cStringIO +import os +import sys +import time + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, svgText='', repository=None): + "Bottom and convert an svg file or svgText." + return getCraftedTextFromText(fileName, archive.getTextIfEmpty(fileName, svgText), repository) + +def getCraftedTextFromText(fileName, svgText, repository=None): + "Bottom and convert an svgText." + if gcodec.isProcedureDoneOrFileIsEmpty(svgText, 'bottom'): + return svgText + if repository == None: + repository = settings.getReadRepository(BottomRepository()) + if not repository.activateBottom.value: + return svgText + return BottomSkein().getCraftedGcode(fileName, repository, svgText) + +def getNewRepository(): + 'Get new repository.' + return BottomRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Bottom the carving.' + skeinforge_craft.writeSVGTextWithNounMessage(fileName, BottomRepository(), shouldAnalyze) + + +class BottomRepository: + "A class to handle the bottom settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository( + 'skeinforge_application.skeinforge_plugins.craft_plugins.bottom.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( + fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Bottom', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Bottom') + self.activateBottom = settings.BooleanSetting().getFromValue('Activate Bottom', self, True) + self.additionalHeightOverLayerThickness = settings.FloatSpin().getFromValue( + 0.0, 'Additional Height over Layer Thickness (ratio):', self, 1.0, 0.5) + self.altitude = settings.FloatSpin().getFromValue(-1.0, 'Altitude (mm):', self, 1.0, 0.0) + self.svgViewer = settings.StringSetting().getFromValue('SVG Viewer:', self, 'webbrowser') + self.executeTitle = 'Bottom' + + def execute(self): + "Bottom button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class BottomSkein: + "A class to bottom a skein of extrusions." + def getCraftedGcode(self, fileName, repository, svgText): + "Parse svgText and store the bottom svgText." + svgReader = SVGReader() + svgReader.parseSVG('', svgText) + if svgReader.sliceDictionary == None: + print('Warning, nothing will be done because the sliceDictionary could not be found getCraftedGcode in preface.') + return '' + decimalPlacesCarried = int(svgReader.sliceDictionary['decimalPlacesCarried']) + layerThickness = float(svgReader.sliceDictionary['layerThickness']) + perimeterWidth = float(svgReader.sliceDictionary['perimeterWidth']) + rotatedLoopLayers = svgReader.rotatedLoopLayers + zMinimum = 987654321.0 + for rotatedLoopLayer in rotatedLoopLayers: + zMinimum = min(rotatedLoopLayer.z, zMinimum) + deltaZ = repository.altitude.value + repository.additionalHeightOverLayerThickness.value * layerThickness - zMinimum + for rotatedLoopLayer in rotatedLoopLayers: + rotatedLoopLayer.z += deltaZ + cornerMaximum = Vector3(-912345678.0, -912345678.0, -912345678.0) + cornerMinimum = Vector3(912345678.0, 912345678.0, 912345678.0) + svg_writer.setSVGCarvingCorners(cornerMaximum, cornerMinimum, layerThickness, rotatedLoopLayers) + svgWriter = svg_writer.SVGWriter( + True, + cornerMaximum, + cornerMinimum, + decimalPlacesCarried, + layerThickness, + perimeterWidth) + commentElement = svg_writer.getCommentElement(svgReader.documentElement) + procedureNameString = svgReader.sliceDictionary['procedureName'] + ',bottom' + return svgWriter.getReplacedSVGTemplate(fileName, procedureNameString, rotatedLoopLayers, commentElement) + + +def main(): + "Display the bottom dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bottom.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bottom.pyc new file mode 100644 index 0000000..5b67720 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/bottom.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py new file mode 100644 index 0000000..9aff4c3 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/carve.py @@ -0,0 +1,232 @@ +""" +This page is in the table of contents. +Carve is the most important plugin to define for your printer. + +It carves a shape into svg slice layers. It also sets the layer thickness and perimeter width for the rest of the tool chain. + +The carve manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Carve + +On the Arcol Blog a method of deriving the layer thickness is posted. That article "Machine Calibrating" is at: +http://blog.arcol.hu/?p=157 + +==Settings== +===Add Layer Template to SVG=== +Default is on. + +When selected, the layer template will be added to the svg output, which adds javascript control boxes. So 'Add Layer Template to SVG' should be selected when the svg will be viewed in a browser. + +When off, no controls will be added, the svg output will only include the fabrication paths. So 'Add Layer Template to SVG' should be deselected when the svg will be used by other software, like Inkscape. + +===Extra Decimal Places=== +Default is two. + +Defines the number of extra decimal places export will output compared to the number of decimal places in the layer thickness. The higher the 'Extra Decimal Places', the more significant figures the output numbers will have. + +===Import Coarseness=== +Default is one. + +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' setting, the wider the gaps in the mesh it will span. An import coarseness of one means it will span gaps of the perimeter width. + +===Infill in Direction of Bridge=== +Default is on. + +When selected, the infill will be in the direction of any bridge across a gap, so that the fill will be able to span a bridge easier. + +===Layer Thickness=== +Default is 0.4 mm. + +Defines the the thickness of the layers skeinforge will cut your object into, in the z direction. This is the most important carve setting, many values in the toolchain are derived from the layer thickness. + +For a 0.5 mm nozzle usable values are 0.3 mm to 0.5 mm. Note; if you are using thinner layers make sure to adjust the extrusion speed as well. + +===Layers=== +Carve slices from bottom to top. To get a single layer, set the "Layers From" to zero and the "Layers To" to one. The 'Layers From' until 'Layers To' range is a python slice. + +====Layers From==== +Default is zero. + +Defines the index of the bottom layer that will be carved. If the 'Layers From' is the default zero, the carving will start from the lowest layer. If the 'Layers From' index is negative, then the carving will start from the 'Layers From' index below the top layer. + +For example if your object is 5 mm tall and your layer thicknes is 1 mm if you set layers from to 3 you will ignore the first 3 mm and start from 3 mm. + +====Layers To==== +Default is a huge number, which will be limited to the highest index layer. + +Defines the index of the top layer that will be carved. If the 'Layers To' index is a huge number like the default, the carving will go to the top of the model. If the 'Layers To' index is negative, then the carving will go to the 'Layers To' index below the top layer. + +This is the same as layers from, only it defines when to end the generation of gcode. + +===Mesh Type=== +Default is 'Correct Mesh'. + +====Correct Mesh==== +When selected, the mesh will be accurately carved, and if a hole is found, carve will switch over to the algorithm that spans gaps. + +====Unproven Mesh==== +When selected, 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 is not actually a gap in the model. + +===Perimeter Width over Thickness=== +Default is 1.8. + +Defines the ratio of the extrusion perimeter width to the layer thickness. This parameter tells skeinforge how wide the perimeter wall is expected to be in relation to the layer thickness. Default value of 1.8 for the default layer thickness of 0.4 states that a single filament perimeter wall should be 0.4 mm * 1.8 = 0.72 mm wide. The higher the value the more the perimeter will be inset. A ratio of one means the extrusion is a circle, the default ratio of 1.8 means the extrusion is a wide oval. + +This is an important value because if you are calibrating your machine you need to ensure that the speed of the head and the extrusion rate in combination produce a wall that is 'Layer Thickness' * 'Perimeter Width over Thickness' wide. To start with 'Perimeter Width over Thickness' is probably best left at the default of 1.8 and the extrusion rate adjusted to give the correct calculated wall thickness. + +Adjustment is in the 'Speed' section with 'Feed Rate' controlling speed of the head in X & Y and 'Flow Rate' controlling the extrusion rate. Initially it is probably easier to start adjusting the flow rate only a little at a time until you get a single filament of the correct width. If you change too many parameters at once you can get in a right mess. + +===SVG Viewer=== +Default is webbrowser. + +If the 'SVG Viewer' is set to the default 'webbrowser', the scalable vector graphics file will be sent to the default browser to be opened. If the 'SVG Viewer' is set to a program name, the scalable vector graphics file will be sent to that program to be opened. + +==Examples== +The following examples carve the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and carve.py. + +> python carve.py +This brings up the carve dialog. + +> python carve.py Screw Holder Bottom.stl +The carve tool is parsing the file: +Screw Holder Bottom.stl +.. +The carve tool has created the file: +.. Screw Holder Bottom_carve.svg + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys +import time + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText = '', repository=None): + "Get carved text." + if fileName.endswith('.svg'): + gcodeText = archive.getTextIfEmpty(fileName, gcodeText) + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'carve'): + return gcodeText + carving = svg_writer.getCarving(fileName) + if carving == None: + return '' + if repository == None: + repository = CarveRepository() + settings.getReadRepository(repository) + return CarveSkein().getCarvedSVG( carving, fileName, repository ) + +def getNewRepository(): + 'Get new repository.' + return CarveRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Carve a GNU Triangulated Surface file." + startTime = time.time() + print('File ' + archive.getSummarizedFileName(fileName) + ' is being carved.') + repository = CarveRepository() + settings.getReadRepository(repository) + carveGcode = getCraftedText(fileName, '', repository) + if carveGcode == '': + return + suffixFileName = archive.getFilePathWithUnderscoredBasename(fileName, '_carve.svg') + archive.writeFileText(suffixFileName, carveGcode) + print('The carved file is saved as ' + archive.getSummarizedFileName(suffixFileName)) + print('It took %s to carve the file.' % euclidean.getDurationString(time.time() - startTime)) + if shouldAnalyze: + settings.openSVGPage(suffixFileName, repository.svgViewer.value) + + +class CarveRepository: + "A class to handle the carve settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.carve.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getTranslatorFileTypeTuples(), 'Open File for Carve', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Carve') + self.addLayerTemplateToSVG = settings.BooleanSetting().getFromValue('Add Layer Template to SVG', self, True) + self.extraDecimalPlaces = settings.FloatSpin().getFromValue(0.0, 'Extra Decimal Places (float):', self, 3.0, 2.0) + self.importCoarseness = settings.FloatSpin().getFromValue( 0.5, 'Import Coarseness (ratio):', self, 2.0, 1.0 ) + self.infillInDirectionOfBridge = settings.BooleanSetting().getFromValue('Infill in Direction of Bridge', self, True ) + self.layerThickness = settings.FloatSpin().getFromValue( 0.1, 'Layer Thickness (mm):', self, 1.0, 0.4 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Layers -', self ) + self.layersFrom = settings.IntSpin().getFromValue( 0, 'Layers From (index):', self, 20, 0 ) + self.layersTo = settings.IntSpin().getSingleIncrementFromValue( 0, 'Layers To (index):', self, 912345678, 912345678 ) + settings.LabelSeparator().getFromRepository(self) + self.meshTypeLabel = settings.LabelDisplay().getFromName('Mesh Type: ', self ) + importLatentStringVar = settings.LatentStringVar() + self.correctMesh = settings.Radio().getFromRadio( importLatentStringVar, 'Correct Mesh', self, True ) + self.unprovenMesh = settings.Radio().getFromRadio( importLatentStringVar, 'Unproven Mesh', self, False ) + self.perimeterWidthOverThickness = settings.FloatSpin().getFromValue( 1.4, 'Perimeter Width over Thickness (ratio):', self, 2.2, 1.8 ) + self.svgViewer = settings.StringSetting().getFromValue('SVG Viewer:', self, 'webbrowser') + settings.LabelSeparator().getFromRepository(self) + self.executeTitle = 'Carve' + + def execute(self): + "Carve button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypes(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class CarveSkein: + "A class to carve a carving." + def getCarvedSVG(self, carving, fileName, repository): + "Parse gnu triangulated surface text and store the carved gcode." + layerThickness = repository.layerThickness.value + perimeterWidth = repository.perimeterWidthOverThickness.value * layerThickness + carving.setCarveInfillInDirectionOfBridge(repository.infillInDirectionOfBridge.value) + carving.setCarveLayerThickness(layerThickness) + importRadius = 0.5 * repository.importCoarseness.value * abs(perimeterWidth) + carving.setCarveImportRadius(max(importRadius, 0.01 * layerThickness)) + carving.setCarveIsCorrectMesh(repository.correctMesh.value) + rotatedLoopLayers = carving.getCarveRotatedBoundaryLayers() + if len(rotatedLoopLayers) < 1: + print('Warning, there are no slices for the model, this could be because the model is too small for the Layer Thickness.') + return '' + layerThickness = carving.getCarveLayerThickness() + decimalPlacesCarried = euclidean.getDecimalPlacesCarried(repository.extraDecimalPlaces.value, layerThickness) + perimeterWidth = repository.perimeterWidthOverThickness.value * layerThickness + svgWriter = svg_writer.SVGWriter( + repository.addLayerTemplateToSVG.value, + carving.getCarveCornerMaximum(), + carving.getCarveCornerMinimum(), + decimalPlacesCarried, + carving.getCarveLayerThickness(), + perimeterWidth) + truncatedRotatedBoundaryLayers = svg_writer.getTruncatedRotatedBoundaryLayers(repository, rotatedLoopLayers) + return svgWriter.getReplacedSVGTemplate( + fileName, 'carve', truncatedRotatedBoundaryLayers, carving.getFabmetheusXML()) + + +def main(): + "Display the carve dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/carve.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/carve.pyc new file mode 100644 index 0000000..972d65e Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/carve.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.py new file mode 100644 index 0000000..790803d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.py @@ -0,0 +1,269 @@ +""" +This page is in the table of contents. +Some filaments contract too much and warp the extruded object. To prevent this you have to print the object in a temperature regulated chamber and/or on a temperature regulated bed. The chamber tool allows you to control the bed and chamber temperature and the holding pressure. + +The chamber gcodes are also described at: + +http://reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes + +The chamber manual page is at: + +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Chamber + +==Operation== +The default 'Activate Chamber' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Bed Temperature=== +Default is 60C. + +Defines the print_bed temperature in Celcius by adding an M140 command. + +===Chamber Temperature=== +Default is 30C. + +Defines the chamber temperature in Celcius by adding an M141 command. + +===Holding Force=== +Default is zero. + +Defines the holding pressure of a mechanism, like a vacuum table or electromagnet, to hold the bed surface or object, by adding an M142 command. The holding pressure is in bars. For hardware which only has on/off holding, when the holding pressure is zero, turn off holding, when the holding pressure is greater than zero, turn on holding. + +==Heated Beds== +===Bothacker=== +A resistor heated aluminum plate by Bothacker: + +http://bothacker.com + +with an article at: + +http://bothacker.com/2009/12/18/heated-build-platform/ + +===Domingo=== +A heated copper build plate by Domingo: + +http://casainho-emcrepstrap.blogspot.com/ + +with articles at: + +http://casainho-emcrepstrap.blogspot.com/2010/01/first-time-with-pla-testing-it-also-on.html + +http://casainho-emcrepstrap.blogspot.com/2010/01/call-for-helpideas-to-develop-heated.html + +http://casainho-emcrepstrap.blogspot.com/2010/01/new-heated-build-platform.html + +http://casainho-emcrepstrap.blogspot.com/2010/01/no-acrylic-and-instead-kapton-tape-on.html + +http://casainho-emcrepstrap.blogspot.com/2010/01/problems-with-heated-build-platform-and.html + +http://casainho-emcrepstrap.blogspot.com/2010/01/perfect-build-platform.html + +http://casainho-emcrepstrap.blogspot.com/2009/12/almost-no-warp.html + +http://casainho-emcrepstrap.blogspot.com/2009/12/heated-base-plate.html + +===Jmil=== +A heated build stage by jmil, over at: + +http://www.hive76.org + +with articles at: + +http://www.hive76.org/handling-hot-build-surfaces + +http://www.hive76.org/heated-build-stage-success + +===Kulitorum=== +Kulitorum has made a heated bed. It is a 5mm Alu sheet with a pattern laid out in kapton tape. The wire is a 0.6mm2 Konstantin wire and it's held in place by small pieces of kapton tape. The description and picture is at: + +http://gallery.kulitorum.com/main.php?g2_itemId=283 + +===Metalab=== +A heated base by the Metalab folks: + +http://reprap.soup.io + +with information at: + +http://reprap.soup.io/?search=heated%20base + +===Nophead=== +A resistor heated aluminum bed by Nophead: + +http://hydraraptor.blogspot.com + +with articles at: + +http://hydraraptor.blogspot.com/2010/01/will-it-stick.html + +http://hydraraptor.blogspot.com/2010/01/hot-metal-and-serendipity.html + +http://hydraraptor.blogspot.com/2010/01/new-year-new-plastic.html + +http://hydraraptor.blogspot.com/2010/01/hot-bed.html + +===Prusajr=== +A resistive wire heated plexiglass plate by prusajr: + +http://prusadjs.cz/ + +with articles at: + +http://prusadjs.cz/2010/01/heated-reprap-print-bed-mk2/ + +http://prusadjs.cz/2009/11/look-ma-no-warping-heated-reprap-print-bed/ + +===Pumpernickel2=== +A resistor heated aluminum plate by Pumpernickel2: + +http://dev.forums.reprap.org/profile.php?14,844 + +with a picture at: + +http://dev.forums.reprap.org/file.php?14,file=1228,filename=heatedplate.jpg + +===Zaggo=== +A resistor heated aluminum plate by Zaggo at Pleasant Software: + +http://pleasantsoftware.com/developer/3d/ + +with articles at: + +http://pleasantsoftware.com/developer/3d/2009/12/05/raftless/ + +http://pleasantsoftware.com/developer/3d/2009/11/15/living-in-times-of-warp-free-printing/ + +http://pleasantsoftware.com/developer/3d/2009/11/12/canned-heat/ + +==Examples== +The following examples chamber the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and chamber.py. + +> python chamber.py +This brings up the chamber dialog. + +> python chamber.py Screw Holder Bottom.stl +The chamber tool is parsing the file: +Screw Holder Bottom.stl +.. +The chamber tool has created the file: +Screw Holder Bottom_chamber.gcode + +""" + + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, text='', repository=None): + "Chamber the file or text." + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + "Chamber a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'chamber'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(ChamberRepository()) + if not repository.activateChamber.value: + return gcodeText + return ChamberSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return ChamberRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Chamber a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'chamber', shouldAnalyze) + + +class ChamberRepository: + "A class to handle the chamber settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.chamber.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Chamber', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Chamber') + self.activateChamber = settings.BooleanSetting().getFromValue('Activate Chamber', self, True ) + self.bedTemperature = settings.FloatSpin().getFromValue( 20.0, 'Bed Temperature (Celcius):', self, 90.0, 60.0 ) + self.chamberTemperature = settings.FloatSpin().getFromValue( 20.0, 'Chamber Temperature (Celcius):', self, 90.0, 30.0 ) + self.holdingForce = settings.FloatSpin().getFromValue( 0.0, 'Holding Force (bar):', self, 100.0, 0.0 ) + self.executeTitle = 'Chamber' + + def execute(self): + "Chamber button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + + +class ChamberSkein: + "A class to chamber a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.lineIndex = 0 + self.lines = None + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the chamber gcode." + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('chamber') + return + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the chamber skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '()': + self.distanceFeedRate.addLine(line) + self.distanceFeedRate.addParameter('M140', self.repository.bedTemperature.value ) # Set bed temperature. + self.distanceFeedRate.addParameter('M141', self.repository.chamberTemperature.value ) # Set chamber temperature. + self.distanceFeedRate.addParameter('M142', self.repository.holdingForce.value ) # Set holding pressure. + return + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the chamber dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.pyc new file mode 100644 index 0000000..d556f6a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chamber.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chop.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chop.py new file mode 100644 index 0000000..a4039d0 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/chop.py @@ -0,0 +1,222 @@ +""" +This page is in the table of contents. +Chop is a script to chop a shape into svg slice layers. + +==Settings== +===Add Layer Template to SVG=== +Default is on. + +When selected, the layer template will be added to the svg output, which adds javascript control boxes. So 'Add Layer Template to SVG' should be selected when the svg will be viewed in a browser. + +When off, no controls will be added, the svg output will only include the fabrication paths. So 'Add Layer Template to SVG' should be deselected when the svg will be used by other software, like Inkscape. + +===Add Extra Top Layer if Necessary=== +Default is on. + +When selected, chop will add an extra layer at the very top of the object if the top of the object is more than half the layer thickness above the first slice. This is so the cutting tool doesn't cut too deeply through the top of the object on its first pass. + +===Extra Decimal Places=== +Default is two. + +Defines the number of extra decimal places export will output compared to the number of decimal places in the layer thickness. The higher the 'Extra Decimal Places', the more significant figures the output numbers will have. + +===Import Coarseness=== +Default is one. + +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' setting, the wider the gaps in the mesh it will span. An import coarseness of one means it will span gaps of the perimeter width. + +===Layer Thickness=== +Default is 0.4 mm. + +Defines the thickness of the layer, this is the most important chop setting. + +===Layers=== +Chop slices from top to bottom. To get only the bottom layer, set the "Layers From" to minus one. The 'Layers From' until 'Layers To' range is a python slice. + +====Layers From==== +Default is zero. + +Defines the index of the top layer that will be chopped. If the 'Layers From' is the default zero, the carving will start from the top layer. If the 'Layers From' index is negative, then the carving will start from the 'Layers From' index above the bottom layer. + +====Layers To==== +Default is a huge number, which will be limited to the highest index number. + +Defines the index of the bottom layer that will be chopped. If the 'Layers To' index is a huge number like the default, the carving will go to the bottom of the model. If the 'Layers To' index is negative, then the carving will go to the 'Layers To' index above the bottom layer. + +===Mesh Type=== +Default is 'Correct Mesh'. + +====Correct Mesh==== +When selected, the mesh will be accurately chopped, and if a hole is found, chop will switch over to the algorithm that spans gaps. + +====Unproven Mesh==== +When selected, chop 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 is not actually a gap in the model. + +===Perimeter Width=== +Default is 2 mm. + +Defines the width of the perimeter. + +===SVG Viewer=== +Default is webbrowser. + +If the 'SVG Viewer' is set to the default 'webbrowser', the scalable vector graphics file will be sent to the default browser to be opened. If the 'SVG Viewer' is set to a program name, the scalable vector graphics file will be sent to that program to be opened. + +==Examples== +The following examples chop the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and chop.py. + +> python chop.py +This brings up the chop dialog. + +> python chop.py Screw Holder Bottom.stl +The chop tool is parsing the file: +Screw Holder Bottom.stl +.. +The chop tool has created the file: +.. Screw Holder Bottom_chop.svg + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys +import time + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText = '', repository=None): + "Get chopped text." + if fileName.endswith('.svg'): + gcodeText = archive.getTextIfEmpty(fileName, gcodeText) + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'chop'): + return gcodeText + carving = svg_writer.getCarving(fileName) + if carving == None: + return '' + if repository == None: + repository = ChopRepository() + settings.getReadRepository(repository) + return ChopSkein().getCarvedSVG( carving, fileName, repository ) + +def getNewRepository(): + 'Get new repository.' + return ChopRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Chop a GNU Triangulated Surface file. If no fileName is specified, chop the first GNU Triangulated Surface file in this folder." + startTime = time.time() + print('File ' + archive.getSummarizedFileName(fileName) + ' is being chopped.') + repository = ChopRepository() + settings.getReadRepository(repository) + chopGcode = getCraftedText( fileName, '', repository ) + if chopGcode == '': + return + suffixFileName = fileName[ : fileName.rfind('.') ] + '_chop.svg' + suffixDirectoryName = os.path.dirname(suffixFileName) + suffixReplacedBaseName = os.path.basename(suffixFileName).replace(' ', '_') + suffixFileName = os.path.join( suffixDirectoryName, suffixReplacedBaseName ) + archive.writeFileText( suffixFileName, chopGcode ) + print('The chopped file is saved as ' + archive.getSummarizedFileName(suffixFileName) ) + print('It took %s to chop the file.' % euclidean.getDurationString( time.time() - startTime ) ) + if shouldAnalyze: + settings.openSVGPage( suffixFileName, repository.svgViewer.value ) + + +class ChopRepository: + "A class to handle the chop settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.chop.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getTranslatorFileTypeTuples(), 'Open File to be Chopped', self, '') + self.addExtraTopLayerIfNecessary = settings.BooleanSetting().getFromValue('Add Extra Top Layer if Necessary', self, True ) + self.addLayerTemplateToSVG = settings.BooleanSetting().getFromValue('Add Layer Template to SVG', self, True) + self.extraDecimalPlaces = settings.FloatSpin().getFromValue(0.0, 'Extra Decimal Places (float):', self, 3.0, 2.0) + self.importCoarseness = settings.FloatSpin().getFromValue( 0.5, 'Import Coarseness (ratio):', self, 2.0, 1.0 ) + self.layerThickness = settings.FloatSpin().getFromValue( 0.1, 'Layer Thickness (mm):', self, 1.0, 0.4 ) + self.layersFrom = settings.IntSpin().getFromValue( 0, 'Layers From (index):', self, 20, 0 ) + self.layersTo = settings.IntSpin().getSingleIncrementFromValue( 0, 'Layers To (index):', self, 912345678, 912345678 ) + self.meshTypeLabel = settings.LabelDisplay().getFromName('Mesh Type: ', self, ) + importLatentStringVar = settings.LatentStringVar() + self.correctMesh = settings.Radio().getFromRadio( importLatentStringVar, 'Correct Mesh', self, True ) + self.unprovenMesh = settings.Radio().getFromRadio( importLatentStringVar, 'Unproven Mesh', self, False ) + self.perimeterWidth = settings.FloatSpin().getFromValue( 0.4, 'Perimeter Width (mm):', self, 4.0, 2.0 ) + self.svgViewer = settings.StringSetting().getFromValue('SVG Viewer:', self, 'webbrowser') + settings.LabelSeparator().getFromRepository(self) + self.executeTitle = 'Chop' + + def execute(self): + "Chop button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypes(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class ChopSkein: + "A class to chop a carving." + def addExtraTopLayerIfNecessary( self, carving, layerThickness, rotatedLoopLayers ): + "Add extra top layer if necessary." + topRotatedBoundaryLayer = rotatedLoopLayers[-1] + cuttingSafeHeight = topRotatedBoundaryLayer.z + 0.5001 * layerThickness + if cuttingSafeHeight > carving.getCarveCornerMaximum().z: + return + extraTopRotatedBoundaryLayer = topRotatedBoundaryLayer.getCopyAtZ( topRotatedBoundaryLayer.z + layerThickness ) + rotatedLoopLayers.append( extraTopRotatedBoundaryLayer ) + + def getCarvedSVG( self, carving, fileName, repository ): + "Parse gnu triangulated surface text and store the chopped gcode." + layerThickness = repository.layerThickness.value + perimeterWidth = repository.perimeterWidth.value + carving.setCarveLayerThickness( layerThickness ) + importRadius = 0.5 * repository.importCoarseness.value * abs( perimeterWidth ) + carving.setCarveImportRadius( max( importRadius, 0.01 * layerThickness ) ) + carving.setCarveIsCorrectMesh( repository.correctMesh.value ) + rotatedLoopLayers = carving.getCarveRotatedBoundaryLayers() + if len( rotatedLoopLayers ) < 1: + print('Warning, there are no slices for the model, this could be because the model is too small for the Layer Thickness.') + return '' + if repository.addExtraTopLayerIfNecessary.value: + self.addExtraTopLayerIfNecessary( carving, layerThickness, rotatedLoopLayers ) + rotatedLoopLayers.reverse() + layerThickness = carving.getCarveLayerThickness() + decimalPlacesCarried = euclidean.getDecimalPlacesCarried(repository.extraDecimalPlaces.value, layerThickness) + svgWriter = svg_writer.SVGWriter( + repository.addLayerTemplateToSVG.value, + carving.getCarveCornerMaximum(), + carving.getCarveCornerMinimum(), + decimalPlacesCarried, + carving.getCarveLayerThickness(), + perimeterWidth) + truncatedRotatedBoundaryLayers = svg_writer.getTruncatedRotatedBoundaryLayers(repository, rotatedLoopLayers) + return svgWriter.getReplacedSVGTemplate( fileName, 'chop', truncatedRotatedBoundaryLayers, carving.getFabmetheusXML()) + + +def main(): + "Display the chop dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cleave.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cleave.py new file mode 100644 index 0000000..c0a219a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cleave.py @@ -0,0 +1,204 @@ +""" +This page is in the table of contents. +Cleave is a script to cleave a shape into svg slice layers. + +==Settings== +===Add Layer Template to SVG=== +Default is on. + +When selected, the layer template will be added to the svg output, which adds javascript control boxes. So 'Add Layer Template to SVG' should be selected when the svg will be viewed in a browser. + +When off, no controls will be added, the svg output will only include the fabrication paths. So 'Add Layer Template to SVG' should be deselected when the svg will be used by other software, like Inkscape. + +===Extra Decimal Places=== +Default is two. + +Defines the number of extra decimal places export will output compared to the number of decimal places in the layer thickness. The higher the 'Extra Decimal Places', the more significant figures the output numbers will have. + +===Import Coarseness=== +Default is one. + +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' setting, the wider the gaps in the mesh it will span. An import coarseness of one means it will span gaps of the perimeter width. + +===Layer Thickness=== +Default is 0.4 mm. + +Defines the thickness of the layer, this is the most important cleave setting. + +===Layers=== +Cleave slices from bottom to top. To get a single layer, set the "Layers From" to zero and the "Layers To" to one. The layer from until layer to range is a python slice. + +====Layers From==== +Default is zero. + +Defines the index of the bottom layer that will be cleaved. If the layer from is the default zero, the carving will start from the lowest layer. If the 'Layers From' index is negative, then the carving will start from the 'Layers From' index below the top layer. + +====Layers To==== +Default is a huge number, which will be limited to the highest index layer. + +Defines the index of the top layer that will be cleaved. If the 'Layers To' index is a huge number like the default, the carving will go to the top of the model. If the 'Layers To' index is negative, then the carving will go to the 'Layers To' index below the top layer. + +===Mesh Type=== +Default is 'Correct Mesh'. + +====Correct Mesh==== +When selected, the mesh will be accurately cleaved, and if a hole is found, cleave will switch over to the algorithm that spans gaps. + +====Unproven Mesh==== +When selected, cleave 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 is not actually a gap in the model. + +===Perimeter Width=== +Default is two millimeters. + +Defines the width of the perimeter. + +===SVG Viewer=== +Default is webbrowser. + +If the 'SVG Viewer' is set to the default 'webbrowser', the scalable vector graphics file will be sent to the default browser to be opened. If the 'SVG Viewer' is set to a program name, the scalable vector graphics file will be sent to that program to be opened. + +==Examples== +The following examples cleave the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and cleave.py. + +> python cleave.py +This brings up the cleave dialog. + +> python cleave.py Screw Holder Bottom.stl +The cleave tool is parsing the file: +Screw Holder Bottom.stl +.. +The cleave tool has created the file: +.. Screw Holder Bottom_cleave.svg + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys +import time + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText = '', repository=None): + "Get cleaved text." + if fileName.endswith('.svg'): + gcodeText = archive.getTextIfEmpty(fileName, gcodeText) + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'cleave'): + return gcodeText + carving = svg_writer.getCarving(fileName) + if carving == None: + return '' + if repository == None: + repository = CleaveRepository() + settings.getReadRepository(repository) + return CleaveSkein().getCarvedSVG( carving, fileName, repository ) + +def getNewRepository(): + 'Get new repository.' + return CleaveRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Cleave a GNU Triangulated Surface file." + startTime = time.time() + print('File ' + archive.getSummarizedFileName(fileName) + ' is being cleaved.') + repository = CleaveRepository() + settings.getReadRepository(repository) + cleaveGcode = getCraftedText( fileName, '', repository ) + if cleaveGcode == '': + return + suffixFileName = fileName[ : fileName.rfind('.') ] + '_cleave.svg' + suffixDirectoryName = os.path.dirname(suffixFileName) + suffixReplacedBaseName = os.path.basename(suffixFileName).replace(' ', '_') + suffixFileName = os.path.join( suffixDirectoryName, suffixReplacedBaseName ) + archive.writeFileText( suffixFileName, cleaveGcode ) + print('The cleaved file is saved as ' + archive.getSummarizedFileName(suffixFileName) ) + print('It took %s to cleave the file.' % euclidean.getDurationString( time.time() - startTime ) ) + if shouldAnalyze: + settings.openSVGPage( suffixFileName, repository.svgViewer.value ) + + +class CleaveRepository: + "A class to handle the cleave settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.cleave.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getTranslatorFileTypeTuples(), 'Open File to be Cleaved', self, '') + self.addLayerTemplateToSVG = settings.BooleanSetting().getFromValue('Add Layer Template to SVG', self, True) + self.extraDecimalPlaces = settings.FloatSpin().getFromValue(0.0, 'Extra Decimal Places (float):', self, 3.0, 2.0) + self.importCoarseness = settings.FloatSpin().getFromValue( 0.5, 'Import Coarseness (ratio):', self, 2.0, 1.0 ) + self.layerThickness = settings.FloatSpin().getFromValue( 0.1, 'Layer Thickness (mm):', self, 1.0, 0.4 ) + self.layersFrom = settings.IntSpin().getFromValue( 0, 'Layers From (index):', self, 20, 0 ) + self.layersTo = settings.IntSpin().getSingleIncrementFromValue( 0, 'Layers To (index):', self, 912345678, 912345678 ) + self.meshTypeLabel = settings.LabelDisplay().getFromName('Mesh Type: ', self, ) + importLatentStringVar = settings.LatentStringVar() + self.correctMesh = settings.Radio().getFromRadio( importLatentStringVar, 'Correct Mesh', self, True ) + self.unprovenMesh = settings.Radio().getFromRadio( importLatentStringVar, 'Unproven Mesh', self, False ) + self.perimeterWidth = settings.FloatSpin().getFromValue( 0.4, 'Perimeter Width (mm):', self, 4.0, 2.0 ) + self.svgViewer = settings.StringSetting().getFromValue('SVG Viewer:', self, 'webbrowser') + settings.LabelSeparator().getFromRepository(self) + self.executeTitle = 'Cleave' + + def execute(self): + "Cleave button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypes(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class CleaveSkein: + "A class to cleave a carving." + def getCarvedSVG( self, carving, fileName, repository ): + "Parse gnu triangulated surface text and store the cleaved gcode." + layerThickness = repository.layerThickness.value + perimeterWidth = repository.perimeterWidth.value + carving.setCarveLayerThickness( layerThickness ) + importRadius = 0.5 * repository.importCoarseness.value * abs( perimeterWidth ) + carving.setCarveImportRadius( max( importRadius, 0.01 * layerThickness ) ) + carving.setCarveIsCorrectMesh( repository.correctMesh.value ) + rotatedLoopLayers = carving.getCarveRotatedBoundaryLayers() + if len( rotatedLoopLayers ) < 1: + print('Warning, there are no slices for the model, this could be because the model is too small for the Layer Thickness.') + return '' + layerThickness = carving.getCarveLayerThickness() + decimalPlacesCarried = euclidean.getDecimalPlacesCarried(repository.extraDecimalPlaces.value, layerThickness) + svgWriter = svg_writer.SVGWriter( + repository.addLayerTemplateToSVG.value, + carving.getCarveCornerMaximum(), + carving.getCarveCornerMinimum(), + decimalPlacesCarried, + carving.getCarveLayerThickness(), + perimeterWidth) + truncatedRotatedBoundaryLayers = svg_writer.getTruncatedRotatedBoundaryLayers(repository, rotatedLoopLayers) + return svgWriter.getReplacedSVGTemplate( fileName, 'cleave', truncatedRotatedBoundaryLayers, carving.getFabmetheusXML()) + + +def main(): + "Display the cleave dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py new file mode 100644 index 0000000..389f59f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/clip.py @@ -0,0 +1,355 @@ +""" +This page is in the table of contents. +The clip plugin clips the loop ends to prevent bumps from forming, and connects loops. + +The clip manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Clip + +==Operation== +The default 'Activate Clip' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Clip Over Perimeter Width=== +Default is 0.2. + +Defines the ratio of the amount each end of the loop is clipped over the perimeter width. The total gap will therefore be twice the clip. If the ratio is too high loops will have a gap, if the ratio is too low there will be a bulge at the loop ends. + +This setting will affect the output of clip, and the output of the skin. In skin the half width perimeters will be clipped by according to this setting. + +===Maximum Connection Distance Over Perimeter Width=== +Default is ten. + +Defines the ratio of the maximum connection distance between loops over the perimeter width. + +Clip will attempt to connect loops that end close to each other, combining them into a spiral, so that the extruder does not stop and restart. This setting sets the maximum gap size to connect. This feature can reduce the amount of extra material or gaps formed at the loop end. + +Setting this to zero disables this feature, preventing the loops from being connected. + +==Examples== +The following examples clip the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and clip.py. + +> python clip.py +This brings up the clip dialog. + +> python clip.py Screw Holder Bottom.stl +The clip tool is parsing the file: +Screw Holder Bottom.stl +.. +The clip tool has created the file: +.. Screw Holder Bottom_clip.gcode + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, clipRepository = None ): + "Clip a gcode linear move file or text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), clipRepository ) + +def getCraftedTextFromText( gcodeText, clipRepository = None ): + "Clip a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'clip'): + return gcodeText + if clipRepository == None: + clipRepository = settings.getReadRepository( ClipRepository() ) + if not clipRepository.activateClip.value: + return gcodeText + return ClipSkein().getCraftedGcode( clipRepository, gcodeText ) + +def getNewRepository(): + 'Get new repository.' + return ClipRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Clip a gcode linear move file. Chain clip the gcode if it is not already clipped." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'clip', shouldAnalyze) + + +class ClipRepository: + "A class to handle the clip settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.clip.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Clip', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Clip') + self.activateClip = settings.BooleanSetting().getFromValue('Activate Clip', self, True ) + self.clipOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.1, 'Clip Over Perimeter Width (ratio):', self, 0.8, 0.5 ) + self.maximumConnectionDistanceOverPerimeterWidth = settings.FloatSpin().getFromValue( 1.0, 'Maximum Connection Distance Over Perimeter Width (ratio):', self, 20.0, 10.0 ) + self.executeTitle = 'Clip' + + def execute(self): + "Clip button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class ClipSkein: + "A class to clip a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.feedRateMinute = None + self.isLoopPerimeter = False + self.layerCount = settings.LayerCount() + self.loopPath = None + self.lineIndex = 0 + self.oldLocation = None + self.oldWiddershins = None + self.travelFeedRateMinute = None + + def addGcodeFromThreadZ( self, thread, z ): + "Add a gcode thread to the output." + if len(thread) > 0: + self.distanceFeedRate.addGcodeMovementZWithFeedRate( self.travelFeedRateMinute, thread[0], z ) + else: + print( "zero length vertex positions array which was skipped over, this should never happen" ) + if len(thread) < 2: + print( "thread of only one point in clip, this should never happen" ) + print(thread) + return + self.distanceFeedRate.addLine('M101') + for point in thread[1 :]: + self.distanceFeedRate.addGcodeMovementZWithFeedRate( self.feedRateMinute, point, z ) + + def addSegmentToPixelTables( self, location, maskPixelTable, oldLocation ): + "Add the segment to the layer and mask table." +# segmentTable = {} + euclidean.addValueSegmentToPixelTable( oldLocation.dropAxis(), location.dropAxis(), self.layerPixelTable, None, self.layerPixelWidth ) +# euclidean.addValueSegmentToPixelTable( oldLocation.dropAxis(), location.dropAxis(), segmentTable, None, self.layerPixelWidth ) +# euclidean.addPixelTableToPixelTable( segmentTable, self.layerPixelTable ) +# euclidean.addPixelTableToPixelTable( segmentTable, maskPixelTable ) +# self.maskPixelTableTable[ location ] = maskPixelTable +# self.maskPixelTableTable[ oldLocation ] = maskPixelTable + + def addTailoredLoopPath(self, line): + "Add a clipped loop path." + if self.clipLength > 0.0: + removeTable = {} + euclidean.addLoopToPixelTable( self.loopPath.path, removeTable, self.layerPixelWidth ) + euclidean.removePixelTableFromPixelTable( removeTable, self.layerPixelTable ) + self.loopPath.path = euclidean.getClippedSimplifiedLoopPath(self.clipLength, self.loopPath.path, self.perimeterWidth) + euclidean.addLoopToPixelTable( self.loopPath.path, self.layerPixelTable, self.layerPixelWidth ) + if self.oldWiddershins == None: + self.addGcodeFromThreadZ( self.loopPath.path, self.loopPath.z ) + else: + if self.oldWiddershins != euclidean.isWiddershins( self.loopPath.path ): + self.loopPath.path.reverse() +# self.addGcodeFromThreadZ( self.loopPath.path, self.loopPath.z ) + for point in self.loopPath.path: + self.distanceFeedRate.addGcodeMovementZWithFeedRate( self.feedRateMinute, point, self.loopPath.z ) + if self.getNextThreadIsACloseLoop( self.loopPath.path ) and self.maximumConnectionDistance > 0.0: + self.oldWiddershins = euclidean.isWiddershins( self.loopPath.path ) + else: + self.oldWiddershins = None + self.distanceFeedRate.addLine(line) + self.loopPath = None + + def getConnectionIsCloseWithoutOverlap( self, location, path ): + "Determine if the connection is close enough and does not overlap another thread." + if len(path) < 1: + return False + locationComplex = location.dropAxis() + segment = locationComplex - path[-1] + segmentLength = abs(segment) + if segmentLength <= 0.0: + return True + if segmentLength > self.maximumConnectionDistance: + return False + segment /= segmentLength + distance = self.connectingStepLength + segmentEndLength = segmentLength - self.connectingStepLength + while distance < segmentEndLength: + alongPoint = distance * segment + path[-1] + if not euclidean.getIsInFilledRegion( self.boundaryLoops, alongPoint ): + return False + distance += self.connectingStepLength +# removedLayerPixelTable = self.layerPixelTable.copy() +# if self.oldLocation in self.maskPixelTableTable: +# euclidean.removePixelTableFromPixelTable( self.maskPixelTableTable[ self.oldLocation ], removedLayerPixelTable ) +# euclidean.addPathToPixelTable( path[ : - 2 ], removedLayerPixelTable, None, self.layerPixelWidth ) + segmentTable = {} + euclidean.addSegmentToPixelTable( path[-1], locationComplex, segmentTable, 2.0, 2.0, self.layerPixelWidth ) +# euclidean.addValueSegmentToPixelTable( path[-1], locationComplex, segmentTable, None, self.layerPixelWidth ) +# euclidean.addValueSegmentToPixelTable( path[-1], locationComplex, segmentTable, None, self.layerPixelWidth ) +# maskPixelTable = {} +# if location in self.maskPixelTableTable: +# maskPixelTable = self.maskPixelTableTable[ location ] + if euclidean.isPixelTableIntersecting( self.layerPixelTable, segmentTable, {} ): +# if euclidean.isPixelTableIntersecting( removedLayerPixelTable, segmentTable, {} ): + return False + euclidean.addValueSegmentToPixelTable( path[-1], locationComplex, self.layerPixelTable, None, self.layerPixelWidth ) +# euclidean.addPixelTableToPixelTable( segmentTable, self.layerPixelTable ) + return True + + def getCraftedGcode( self, clipRepository, gcodeText ): + "Parse gcode text and store the clip gcode." + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization( clipRepository ) + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getNextThreadIsACloseLoop( self, path ): + "Determine if the next thread is a loop." + if self.oldLocation == None: + return False + isLoop = False + location = self.oldLocation + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '(' or firstWord == '(': + isLoop = True + elif firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + elif firstWord == 'M101': + if not isLoop: + return False + return self.getConnectionIsCloseWithoutOverlap( location, path ) + elif firstWord == '(': + return False + return False + + def isNextExtruderOn(self): + "Determine if there is an extruder on command before a move command." + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1' or firstWord == 'M103': + return False + elif firstWord == 'M101': + return True + return False + + def linearMove( self, splitLine ): + "Add to loop path if this is a loop or path." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + if self.isLoopPerimeter: + if self.isNextExtruderOn(): + self.loopPath = euclidean.PathZ(location.z) + if self.loopPath == None: + if self.extruderActive: + self.oldWiddershins = None + else: + self.loopPath.path.append(location.dropAxis()) + self.oldLocation = location + + def parseInitialization( self, clipRepository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('clip') + return + elif firstWord == '(': + self.distanceFeedRate.addTagBracketedLine('clipOverPerimeterWidth', clipRepository.clipOverPerimeterWidth.value) + self.perimeterWidth = float(splitLine[1]) + absolutePerimeterWidth = abs( self.perimeterWidth ) + self.clipLength = clipRepository.clipOverPerimeterWidth.value * self.perimeterWidth + self.connectingStepLength = 0.5 * absolutePerimeterWidth + self.layerPixelWidth = 0.1 * absolutePerimeterWidth + self.maximumConnectionDistance = clipRepository.maximumConnectionDistanceOverPerimeterWidth.value * absolutePerimeterWidth + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the clip skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + self.isLoopPerimeter = False + if self.loopPath != None: + self.addTailoredLoopPath(line) + return + elif firstWord == '(': + self.setLayerPixelTable() + if firstWord == '(' or firstWord == '(': + self.isLoopPerimeter = True + if self.loopPath == None: + self.distanceFeedRate.addLine(line) + + def setLayerPixelTable(self): + "Set the layer pixel table." + self.layerCount.printProgressIncrement('clip') + boundaryLoop = None + extruderActive = False + maskPixelTable = {} + self.boundaryLoops = [] + self.maskPixelTableTable = {} + self.lastInactiveLocation = None + self.layerPixelTable = {} + oldLocation = self.oldLocation + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(oldLocation, splitLine) + if extruderActive and oldLocation != None: + self.addSegmentToPixelTables( location, maskPixelTable, oldLocation ) + if not extruderActive: + self.lastInactiveLocation = location + oldLocation = location + elif firstWord == 'M101': + extruderActive = True + elif firstWord == 'M103': + if extruderActive and self.lastInactiveLocation != None: + self.addSegmentToPixelTables( self.lastInactiveLocation, maskPixelTable, oldLocation ) + extruderActive = False + maskPixelTable = {} + elif firstWord == '()': + boundaryLoop = None + elif firstWord == '(': + if boundaryLoop == None: + boundaryLoop = [] + self.boundaryLoops.append(boundaryLoop) + location = gcodec.getLocationFromSplitLine(None, splitLine) + boundaryLoop.append(location.dropAxis()) + elif firstWord == '()': + return + +def main(): + "Display the clip dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/clip.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/clip.pyc new file mode 100644 index 0000000..a96d24a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/clip.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/coil.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/coil.py new file mode 100644 index 0000000..5bb91a2 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/coil.py @@ -0,0 +1,252 @@ +""" +This page is in the table of contents. +Coil is a script to coil wire or filament around an object. + +==Operation== +The default 'Activate Coil' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Minimum Tool Distance=== +Default is twenty millimeters. + +Defines the minimum distance between the wire dispenser and the object. The 'Minimum Tool Distance' should be set to the maximum radius of the wire dispenser, times at least 1.3 to get a reasonable safety margin. + +==Examples== +The following examples coil the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and coil.py. + +> python coil.py +This brings up the coil dialog. + +> python coil.py Screw Holder Bottom.stl +The coil tool is parsing the file: +Screw Holder Bottom.stl +.. +The coil tool has created the file: +Screw Holder Bottom_coil.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText = '', repository=None): + "Coil the file or gcodeText." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, gcodeText), repository ) + +def getCraftedTextFromText(gcodeText, repository=None): + "Coil a gcode linear move gcodeText." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'coil'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( CoilRepository() ) + if not repository.activateCoil.value: + return gcodeText + return CoilSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return CoilRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Coil a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'coil', shouldAnalyze) + + +class CoilRepository: + "A class to handle the coil settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.coil.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Coil', self, '') + self.activateCoil = settings.BooleanSetting().getFromValue('Activate Coil', self, True ) + self.minimumToolDistance = settings.FloatSpin().getFromValue( 10.0, 'Minimum Tool Distance (millimeters):', self, 50.0, 20.0 ) + self.executeTitle = 'Coil' + + def execute(self): + "Coil button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + + +class CoilSkein: + "A class to coil a skein of extrusions." + def __init__(self): + self.boundaryLayers = [] + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.lineIndex = 0 + self.lines = None + self.oldLocationComplex = complex() + self.perimeterWidth = 0.6 + self.shutdownLines = [] + + def addCoilLayer( self, boundaryLayers, radius, z ): + "Add a coil layer." + self.distanceFeedRate.addLine('( %s )' % z ) # Indicate that a new layer is starting. + self.distanceFeedRate.addLine('()') + thread = [] + for boundaryLayerIndex in xrange(1, len(boundaryLayers) - 1): + boundaryLayer = boundaryLayers[boundaryLayerIndex] + boundaryLayerBegin = boundaryLayers[boundaryLayerIndex - 1] + boundaryLayerEnd = boundaryLayers[boundaryLayerIndex + 1] + beginLocation = Vector3(0.0, 0.0, 0.5 * (boundaryLayerBegin.z + boundaryLayer.z)) + outsetLoop = intercircle.getLargestInsetLoopFromLoop(boundaryLayer.loops[0], - radius) + self.addCoilToThread(beginLocation, 0.5 * (boundaryLayer.z + boundaryLayerEnd.z), outsetLoop, thread) + self.addGcodeFromThread(thread) + self.distanceFeedRate.addLine('()') + self.distanceFeedRate.addLine('()') + + def addCoilLayers(self): + "Add the coil layers." + numberOfLayersFloat = round( self.perimeterWidth / self.layerThickness ) + numberOfLayers = int( numberOfLayersFloat ) + halfLayerThickness = 0.5 * self.layerThickness + startOutset = self.repository.minimumToolDistance.value + halfLayerThickness + startZ = self.boundaryLayers[0].z + halfLayerThickness + zRange = self.boundaryLayers[-1].z - self.boundaryLayers[0].z + zIncrement = 0.0 + if zRange >= 0.0: + zIncrement = zRange / numberOfLayersFloat + for layerIndex in xrange( numberOfLayers ): + settings.printProgressByNumber(layerIndex, numberOfLayers, 'coil') + boundaryLayers = self.boundaryLayers + if layerIndex % 2 == 1: + boundaryLayers = self.boundaryReverseLayers + radius = startOutset + layerIndex * self.layerThickness + z = startZ + layerIndex * zIncrement + self.addCoilLayer( boundaryLayers, radius, z ) + + def addCoilToThread(self, beginLocation, endZ, loop, thread): + "Add a coil to the thread." + if len(loop) < 1: + return + loop = euclidean.getLoopStartingNearest(self.halfPerimeterWidth, self.oldLocationComplex, loop) + length = euclidean.getLoopLength(loop) + if length <= 0.0: + return + oldPoint = loop[0] + pathLength = 0.0 + for point in loop[1 :]: + pathLength += abs(point - oldPoint) + along = pathLength / length + z = (1.0 - along) * beginLocation.z + along * endZ + location = Vector3(point.real, point.imag, z) + thread.append(location) + oldPoint = point + self.oldLocationComplex = loop[-1] + + def addGcodeFromThread( self, thread ): + "Add a thread to the output." + if len(thread) > 0: + firstLocation = thread[0] + self.distanceFeedRate.addGcodeMovementZ( firstLocation.dropAxis(), firstLocation.z ) + else: + print( "zero length vertex positions array which was skipped over, this should never happen" ) + if len(thread) < 2: + print( "thread of only one point in addGcodeFromThread in coil, this should never happen" ) + print(thread) + return + self.distanceFeedRate.addLine('M101') # Turn extruder on. + for location in thread[1 :]: + self.distanceFeedRate.addGcodeMovementZ( location.dropAxis(), location.z ) + self.distanceFeedRate.addLine('M103') # Turn extruder off. + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the coil gcode." + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + self.parseBoundaries() + self.parseUntilLayer() + self.addCoilLayers() + self.distanceFeedRate.addLines( self.shutdownLines ) + return self.distanceFeedRate.output.getvalue() + + def parseBoundaries(self): + "Parse the boundaries and add them to the boundary layers." + boundaryLoop = None + boundaryLayer = None + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if len( self.shutdownLines ) > 0: + self.shutdownLines.append(line) + if firstWord == '()': + boundaryLoop = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if boundaryLoop == None: + boundaryLoop = [] + boundaryLayer.loops.append(boundaryLoop) + boundaryLoop.append(location.dropAxis()) + elif firstWord == '(': + boundaryLayer = euclidean.LoopLayer(float(splitLine[1])) + self.boundaryLayers.append(boundaryLayer) + elif firstWord == '()': + self.shutdownLines = [ line ] + for boundaryLayer in self.boundaryLayers: + if not euclidean.isWiddershins( boundaryLayer.loops[0] ): + boundaryLayer.loops[0].reverse() + self.boundaryReverseLayers = self.boundaryLayers[:] + self.boundaryReverseLayers.reverse() + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('coil') + return + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.halfPerimeterWidth = 0.5 * self.perimeterWidth + self.distanceFeedRate.addLine(line) + + def parseUntilLayer(self): + "Parse until the layer line and add it to the coil skein." + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '(': + return + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the coil dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py new file mode 100644 index 0000000..cec48e8 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/comb.py @@ -0,0 +1,417 @@ +""" +This page is in the table of contents. +Comb is a craft tool to comb the extrusion hair of a gcode file. + +The comb manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Comb + +Comb bends the extruder travel paths around holes in the slices, to avoid stringers. It moves the extruder to the inside of perimeters before turning the extruder on so any start up ooze will be inside the shape. + +==Operation== +The default 'Activate Comb' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Running Jump Space=== +Placeholder. + +==Examples== +The following examples comb the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and comb.py. + +> python comb.py +This brings up the comb dialog. + +> python comb.py Screw Holder Bottom.stl +The comb tool is parsing the file: +Screw Holder Bottom.stl +.. +The comb tool has created the file: +.. Screw Holder Bottom_comb.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, combRepository = None ): + "Comb a gcode linear move text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), combRepository ) + +def getCraftedTextFromText( gcodeText, combRepository = None ): + "Comb a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'comb'): + return gcodeText + if combRepository == None: + combRepository = settings.getReadRepository( CombRepository() ) + if not combRepository.activateComb.value: + return gcodeText + return CombSkein().getCraftedGcode( combRepository, gcodeText ) + +def getInsideness(path, loop): + "Get portion of the path which is inside the loop." + if len(path) < 2: + return 0.0 + pathLength = euclidean.getPathLength(path) + if pathLength <= 0.0: + return 0.0 + incrementRatio = 0.017 + increment = incrementRatio * pathLength + oldPoint = path[0] + numberOfPointsInside = float(euclidean.isPointInsideLoop(loop, oldPoint)) + for point in path[1 :]: + segment = point - oldPoint + distance = abs(segment) + numberOfPosts = int(math.ceil(distance / increment)) + if numberOfPosts > 0: + segmentIncrement = segment / float(numberOfPosts) + for post in xrange(numberOfPosts): + postPoint = oldPoint + float(post) * segmentIncrement + numberOfPointsInside += float(euclidean.isPointInsideLoop(loop, postPoint)) + oldPoint = point + return incrementRatio * numberOfPointsInside + +def getNewRepository(): + 'Get new repository.' + return CombRepository() + +def getPathsByIntersectedLoop( begin, end, loop ): + "Get both paths along the loop from the point nearest to the begin to the point nearest to the end." + nearestBeginDistanceIndex = euclidean.getNearestDistanceIndex( begin, loop ) + nearestEndDistanceIndex = euclidean.getNearestDistanceIndex( end, loop ) + beginIndex = ( nearestBeginDistanceIndex.index + 1 ) % len(loop) + endIndex = ( nearestEndDistanceIndex.index + 1 ) % len(loop) + nearestBegin = euclidean.getNearestPointOnSegment( loop[ nearestBeginDistanceIndex.index ], loop[ beginIndex ], begin ) + nearestEnd = euclidean.getNearestPointOnSegment( loop[ nearestEndDistanceIndex.index ], loop[ endIndex ], end ) + clockwisePath = [ nearestBegin ] + widdershinsPath = [ nearestBegin ] + if nearestBeginDistanceIndex.index != nearestEndDistanceIndex.index: + widdershinsPath += euclidean.getAroundLoop( beginIndex, endIndex, loop ) + clockwisePath += euclidean.getAroundLoop( endIndex, beginIndex, loop )[: : -1] + clockwisePath.append( nearestEnd ) + widdershinsPath.append( nearestEnd ) + return [ clockwisePath, widdershinsPath ] + +def writeOutput(fileName, shouldAnalyze=True): + "Comb a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'comb', shouldAnalyze) + + +class CombRepository: + "A class to handle the comb settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.comb.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Comb', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Comb') + self.activateComb = settings.BooleanSetting().getFromValue('Activate Comb', self, False ) + self.executeTitle = 'Comb' + + def execute(self): + "Comb button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class CombSkein: + "A class to comb a skein of extrusions." + def __init__(self): + 'Initialize' + self.betweenTable = {} + self.boundaryLoop = None + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.layer = None + self.layerCount = settings.LayerCount() + self.layerTable = {} + self.layerZ = None + self.lineIndex = 0 + self.lines = None + self.nextLayerZ = None + self.oldLocation = None + self.oldZ = None + self.operatingFeedRatePerMinute = None + self.travelFeedRateMinute = None + + def addGcodePathZ( self, feedRateMinute, path, z ): + "Add a gcode path, without modifying the extruder, to the output." + for point in path: + self.distanceFeedRate.addGcodeMovementZWithFeedRate(feedRateMinute, point, z) + + def addIfTravel( self, splitLine ): + "Add travel move around loops if the extruder is off." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if not self.extruderActive and self.oldLocation != None: + if len( self.getBoundaries() ) > 0: + highestZ = max( location.z, self.oldLocation.z ) + self.addGcodePathZ( self.travelFeedRateMinute, self.getPathsBetween( self.oldLocation.dropAxis(), location.dropAxis() ), highestZ ) + self.oldLocation = location + + def addToLoop(self, location): + "Add a location to loop." + if self.layer == None: + if not self.oldZ in self.layerTable: + self.layerTable[ self.oldZ ] = [] + self.layer = self.layerTable[ self.oldZ ] + if self.boundaryLoop == None: + self.boundaryLoop = [] #starting with an empty array because a closed loop does not have to restate its beginning + self.layer.append( self.boundaryLoop ) + if self.boundaryLoop != None: + self.boundaryLoop.append(location.dropAxis()) + + def getBetweens(self): + "Set betweens for the layer." + if self.layerZ in self.betweenTable: + return self.betweenTable[ self.layerZ ] + if self.layerZ not in self.layerTable: + return [] + self.betweenTable[ self.layerZ ] = [] + for boundaryLoop in self.layerTable[ self.layerZ ]: + self.betweenTable[ self.layerZ ] += intercircle.getInsetLoopsFromLoop(boundaryLoop, self.betweenInset) + return self.betweenTable[ self.layerZ ] + + def getBoundaries(self): + "Get boundaries for the layer." + if self.layerZ in self.layerTable: + return self.layerTable[ self.layerZ ] + return [] + + def getCraftedGcode( self, combRepository, gcodeText ): + "Parse gcode text and store the comb gcode." + self.combRepository = combRepository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization( combRepository ) + for lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[lineIndex] + self.parseBoundariesLayers( combRepository, line ) + for lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getIsAsFarAndNotIntersecting( self, begin, end ): + "Determine if the point on the line is at least as far from the loop as the center point." + if begin == end: + print('this should never happen but it does not really matter, begin == end in getIsAsFarAndNotIntersecting in comb.') + print(begin) + return True + return not euclidean.isLineIntersectingLoops( self.getBetweens(), begin, end ) + + def getIsRunningJumpPathAdded( self, betweens, end, lastPoint, nearestEndMinusLastSegment, pathAround, penultimatePoint, runningJumpSpace ): + "Add a running jump path if possible, and return if it was added." + jumpStartPoint = lastPoint - nearestEndMinusLastSegment * runningJumpSpace + if euclidean.isLineIntersectingLoops( betweens, penultimatePoint, jumpStartPoint ): + return False + pathAround[-1] = jumpStartPoint + return True + + def getPathBetween(self, loop, points): + "Add a path between the perimeter and the fill." + paths = getPathsByIntersectedLoop(points[1], points[2], loop) + shortestPath = paths[int(euclidean.getPathLength(paths[1]) < euclidean.getPathLength(paths[0]))] + if len(shortestPath) < 2: + return shortestPath + if abs(points[1] - shortestPath[0]) > abs(points[1] - shortestPath[-1]): + shortestPath.reverse() + loopWiddershins = euclidean.isWiddershins(loop) + pathBetween = [] + for pointIndex in xrange(len(shortestPath)): + center = shortestPath[pointIndex] + centerPerpendicular = None + beginIndex = pointIndex - 1 + if beginIndex >= 0: + begin = shortestPath[beginIndex] + centerPerpendicular = intercircle.getWiddershinsByLength(center, begin, self.combInset) + centerEnd = None + endIndex = pointIndex + 1 + if endIndex < len(shortestPath): + end = shortestPath[endIndex] + centerEnd = intercircle.getWiddershinsByLength(end, center, self.combInset) + if centerPerpendicular == None: + centerPerpendicular = centerEnd + elif centerEnd != None: + centerPerpendicular = 0.5 * (centerPerpendicular + centerEnd) + between = None + if centerPerpendicular == None: + between = center + if between == None: + centerSideWiddershins = center + centerPerpendicular + if euclidean.isPointInsideLoop(loop, centerSideWiddershins) == loopWiddershins: + between = centerSideWiddershins + if between == None: + centerSideClockwise = center - centerPerpendicular + if euclidean.isPointInsideLoop(loop, centerSideClockwise) == loopWiddershins: + between = centerSideClockwise + if between == None: + between = center + pathBetween.append(between) + return pathBetween + + def getPathsBetween(self, begin, end): + "Insert paths between the perimeter and the fill." + aroundBetweenPath = [] + points = [begin] + lineX = [] + switchX = [] + segment = euclidean.getNormalized(end - begin) + segmentYMirror = complex(segment.real, - segment.imag) + beginRotated = segmentYMirror * begin + endRotated = segmentYMirror * end + y = beginRotated.imag + boundaries = self.getBoundaries() + for boundaryIndex in xrange(len(boundaries)): + boundary = boundaries[ boundaryIndex ] + boundaryRotated = euclidean.getRotatedComplexes(segmentYMirror, boundary) + euclidean.addXIntersectionIndexesFromLoopY(boundaryRotated, boundaryIndex, switchX, y) + switchX.sort() + maximumX = max(beginRotated.real, endRotated.real) + minimumX = min(beginRotated.real, endRotated.real) + for xIntersection in switchX: + if xIntersection.x > minimumX and xIntersection.x < maximumX: + point = segment * complex(xIntersection.x, y) + points.append(point) + lineX.append(xIntersection) + points.append(end) + lineXIndex = 0 +# pathBetweenAdded = False + while lineXIndex < len(lineX) - 1: + lineXFirst = lineX[lineXIndex] + lineXSecond = lineX[lineXIndex + 1] + loopFirst = boundaries[lineXFirst.index] + if lineXSecond.index == lineXFirst.index: + pathBetween = self.getPathBetween(loopFirst, points[lineXIndex : lineXIndex + 4]) + pathBetween = self.getSimplifiedAroundPath(points[lineXIndex], points[lineXIndex + 3], loopFirst, pathBetween) + aroundBetweenPath += pathBetween + lineXIndex += 2 + else: + lineXIndex += 1 +# isLeavingPerimeter = False +# if lineXSecond.index != lineXFirst.index: +# isLeavingPerimeter = True +# pathBetween = self.getPathBetween( points[ lineXIndex + 1 ], points[ lineXIndex + 2 ], isLeavingPerimeter, loopFirst ) +# if isLeavingPerimeter: +# pathBetweenAdded = True +# else: +# pathBetween = self.getSimplifiedAroundPath( points[ lineXIndex ], points[ lineXIndex + 3 ], loopFirst, pathBetween ) +# pathBetweenAdded = True +# aroundBetweenPath += pathBetween +# lineXIndex += 2 + return aroundBetweenPath + + def getSimplifiedAroundPath( self, begin, end, loop, pathAround ): + "Get the simplified path between the perimeter and the fill." + pathAround = self.getSimplifiedBeginPath(begin, loop, pathAround) + return self.getSimplifiedEndPath(end, loop, pathAround) + + def getSimplifiedBeginPath( self, begin, loop, pathAround ): + "Get the simplified begin path between the perimeter and the fill." + if len(pathAround) < 2: + return pathAround + pathIndex = 0 + while pathIndex < len(pathAround) - 1: + if not self.getIsAsFarAndNotIntersecting(begin, pathAround[pathIndex + 1]): + return pathAround[pathIndex :] + pathIndex += 1 + return pathAround[-1 :] + + def getSimplifiedEndPath(self, end, loop, pathAround): + "Get the simplified end path between the perimeter and the fill." + if len(pathAround) < 2: + return pathAround + pathIndex = len(pathAround) - 1 + while pathIndex > 0: + if not self.getIsAsFarAndNotIntersecting(end, pathAround[pathIndex - 1]): + return pathAround[: pathIndex + 1] + pathIndex -= 1 + return pathAround[: 1] + + def parseBoundariesLayers( self, combRepository, line ): + "Parse a gcode line." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'M103': + self.boundaryLoop = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + self.addToLoop( location ) + elif firstWord == '(': + self.boundaryLoop = None + self.layer = None + self.oldZ = float(splitLine[1]) + + def parseInitialization( self, combRepository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('comb') + return + elif firstWord == '(': + perimeterWidth = float(splitLine[1]) + self.combInset = 0.7 * perimeterWidth + self.betweenInset = 0.4 * perimeterWidth + self.uTurnWidth = 0.5 * self.betweenInset + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the comb skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if self.distanceFeedRate.getIsAlteration(line): + return + if firstWord == 'G1': + self.addIfTravel(splitLine) + self.layerZ = self.nextLayerZ + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + elif firstWord == '(': + self.layerCount.printProgressIncrement('comb') + self.nextLayerZ = float(splitLine[1]) + if self.layerZ == None: + self.layerZ = self.nextLayerZ + self.distanceFeedRate.addLineCheckAlteration(line) + + +def main(): + "Display the comb dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/comb.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/comb.pyc new file mode 100644 index 0000000..1a53af0 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/comb.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py new file mode 100644 index 0000000..b5a5b3a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cool.py @@ -0,0 +1,409 @@ +""" +This page is in the table of contents. +Cool is a craft tool to cool the shape. + +Cool works well with a stepper extruder, it does not work well with a DC motor extruder. + +If enabled, before each layer that takes less then "Minimum Layer Time" to print the tool head will orbit around the printed area for 'Minimum Layer Time' minus 'the time it takes to print the layer' before it starts printing the layer. This is great way to let layers with smaller area cool before you start printing on top of them (so you do not overheat the area). + +The cool manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Cool + +Allan Ecker aka The Masked Retriever's has written the "Skeinforge Quicktip: Cool" at: +http://blog.thingiverse.com/2009/07/28/skeinforge-quicktip-cool/ + +==Operation== +The default 'Activate Cool' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Bridge Cool=== +Default is one degree Celcius. + +If the layer is a bridge layer, then cool will lower the temperature by 'Bridge Cool' degrees Celcius. + +===Cool Type=== +Default is 'Slow Down'. + +====Orbit==== +When selected, cool will add orbits with the extruder off to give the layer time to cool, so that the next layer is not extruded on a molten base. The orbits will be around the largest island on that layer. Orbit should only be chosen if you can not upgrade to a stepper extruder. + +====Slow Down==== +When selected, cool will slow down the extruder so that it will take the minimum layer time to extrude the layer. DC motors do not operate properly at slow flow rates, so if you have a DC motor extruder, you should upgrade to a stepper extruder, but if you can't do that, you can try using the 'Orbit' option. + +===Maximum Cool=== +Default is 2 degrees Celcius. + +If it takes less time to extrude the layer than the minimum layer time, then cool will lower the temperature by the 'Maximum Cool' setting times the layer time over the minimum layer time. + +===Minimum Layer Time=== +Default is 60 seconds. + +Defines the minimum amount of time the extruder will spend on a layer, this is an important setting. + +===Minimum Orbital Radius=== +Default is 10 millimeters. + +When the orbit cool type is selected, if the area of the largest island is as large as the square of the "Minimum Orbital Radius" then the orbits will be just within the island. If the island is smaller, then the orbits will be in a square of the "Minimum Orbital Radius" around the center of the island. This is so that the hot extruder does not stay too close to small islands. + +===Name of Alteration Files=== +Cool looks for alteration files in the alterations folder in the .skeinforge folder in the home directory. Cool 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. If it doesn't find the file it then looks in the alterations folder in the skeinforge_plugins folder. The cool start and end text idea is from: +http://makerhahn.blogspot.com/2008/10/yay-minimug.html + +====Name of Cool End File==== +Default is cool_end.gcode. + +If there is a file with the name of the "Name of Cool End File" setting, it will be added to the end of the orbits. + +====Name of Cool Start File==== +Default is cool_start.gcode. + +If there is a file with the name of the "Name of Cool Start File" setting, it will be added to the start of the orbits. + +===Orbital Outset=== +Default is 2 millimeters. + +When the orbit cool type is selected, the orbits will be outset around the largest island by 'Orbital Outset' millimeters. If 'Orbital Outset' is negative, the orbits will be inset instead. + +===Turn Fan On at Beginning=== +Default is on. + +When selected, cool will turn the fan on at the beginning of the fabrication by adding the M106 command. + +===Turn Fan Off at Ending=== +Default is on. + +When selected, cool will turn the fan off at the ending of the fabrication by adding the M107 command. + +==Examples== +The following examples cool the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and cool.py. + +> python cool.py +This brings up the cool dialog. + +> python cool.py Screw Holder Bottom.stl +The cool tool is parsing the file: +Screw Holder Bottom.stl +.. +The cool tool has created the file: +.. Screw Holder Bottom_cool.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, text, repository=None): + 'Cool a gcode linear move text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Cool a gcode linear move text.' + if gcodec.isProcedureDoneOrFileIsEmpty(gcodeText, 'cool'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(CoolRepository()) + if not repository.activateCool.value: + return gcodeText + return CoolSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return CoolRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Cool a gcode linear move file. Chain cool the gcode if it is not already cooled.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'cool', shouldAnalyze) + + +class CoolRepository: + 'A class to handle the cool settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.cool.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( + fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Cool', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute( + 'http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Cool') + self.activateCool = settings.BooleanSetting().getFromValue('Activate Cool', self, True) + self.bridgeCool = settings.FloatSpin().getFromValue(0.0, 'Bridge Cool (Celcius):', self, 10.0, 1.0) + self.coolType = settings.MenuButtonDisplay().getFromName('Cool Type:', self) + self.orbit = settings.MenuRadio().getFromMenuButtonDisplay(self.coolType, 'Orbit', self, False) + self.slowDown = settings.MenuRadio().getFromMenuButtonDisplay(self.coolType, 'Slow Down', self, True) + self.maximumCool = settings.FloatSpin().getFromValue(0.0, 'Maximum Cool (Celcius):', self, 10.0, 2.0) + self.minimumLayerTime = settings.FloatSpin().getFromValue(0.0, 'Minimum Layer Time (seconds):', self, 120.0, 60.0) + self.minimumOrbitalRadius = settings.FloatSpin().getFromValue( + 0.0, 'Minimum Orbital Radius (millimeters):', self, 20.0, 10.0) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Name of Alteration Files -', self ) + self.nameOfCoolEndFile = settings.StringSetting().getFromValue('Name of Cool End File:', self, 'cool_end.gcode') + self.nameOfCoolStartFile = settings.StringSetting().getFromValue('Name of Cool Start File:', self, 'cool_start.gcode') + settings.LabelSeparator().getFromRepository(self) + self.orbitalOutset = settings.FloatSpin().getFromValue(1.0, 'Orbital Outset (millimeters):', self, 5.0, 2.0) + self.turnFanOnAtBeginning = settings.BooleanSetting().getFromValue('Turn Fan On at Beginning', self, True) + self.turnFanOffAtEnding = settings.BooleanSetting().getFromValue('Turn Fan Off at Ending', self, True) + self.executeTitle = 'Cool' + + def execute(self): + 'Cool button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( + self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class CoolSkein: + 'A class to cool a skein of extrusions.' + def __init__(self): + self.boundaryLayer = None + self.coolTemperature = None + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = 960.0 + self.highestZ = 1.0 + self.isBridgeLayer = False + self.isExtruderActive = False + self.layerCount = settings.LayerCount() + self.lineIndex = 0 + self.lines = None + self.multiplier = 1.0 + self.oldFlowRate = None + self.oldFlowRateString = None + self.oldLocation = None + self.oldTemperature = None + + def addCoolOrbits(self, remainingOrbitTime): + 'Add the minimum radius cool orbits.' + if len(self.boundaryLayer.loops) < 1: + return + insetBoundaryLoops = self.boundaryLayer.loops + if abs(self.repository.orbitalOutset.value) > 0.1 * abs(self.perimeterWidth): + insetBoundaryLoops = intercircle.getInsetLoopsFromLoops(-self.repository.orbitalOutset.value, self.boundaryLayer.loops) + if len(insetBoundaryLoops) < 1: + insetBoundaryLoops = self.boundaryLayer.loops + largestLoop = euclidean.getLargestLoop(insetBoundaryLoops) + loopArea = euclidean.getAreaLoopAbsolute(largestLoop) + if loopArea < self.minimumArea: + center = 0.5 * (euclidean.getMaximumByComplexPath(largestLoop) + euclidean.getMinimumByComplexPath(largestLoop)) + centerXBounded = max(center.real, self.boundingRectangle.cornerMinimum.real) + centerXBounded = min(centerXBounded, self.boundingRectangle.cornerMaximum.real) + centerYBounded = max(center.imag, self.boundingRectangle.cornerMinimum.imag) + centerYBounded = min(centerYBounded, self.boundingRectangle.cornerMaximum.imag) + center = complex(centerXBounded, centerYBounded) + maximumCorner = center + self.halfCorner + minimumCorner = center - self.halfCorner + largestLoop = euclidean.getSquareLoopWiddershins(minimumCorner, maximumCorner) + pointComplex = euclidean.getXYComplexFromVector3(self.oldLocation) + if pointComplex != None: + largestLoop = euclidean.getLoopStartingNearest(self.perimeterWidth, pointComplex, largestLoop) + intercircle.addOrbitsIfLarge( + self.distanceFeedRate, largestLoop, self.orbitalFeedRatePerSecond, remainingOrbitTime, self.highestZ) + + def addCoolTemperature(self, remainingOrbitTime): + 'Parse a gcode line and add it to the cool skein.' + layerCool = self.repository.maximumCool.value * remainingOrbitTime / self.repository.minimumLayerTime.value + if self.isBridgeLayer: + layerCool = max(self.repository.bridgeCool.value, layerCool) + if self.oldTemperature != None and layerCool != 0.0: + self.coolTemperature = self.oldTemperature - layerCool + self.addTemperature(self.coolTemperature) + + def addFlowRate(self, flowRate): + 'Add a multipled line of flow rate if different.' + self.distanceFeedRate.addLine('M108 S' + euclidean.getFourSignificantFigures(flowRate)) + + def addGcodeFromFeedRateMovementZ(self, feedRateMinute, point, z): + 'Add a movement to the output.' + self.distanceFeedRate.addLine(self.distanceFeedRate.getLinearGcodeMovementWithFeedRate(feedRateMinute, point, z)) + + def addOrbitsIfNecessary(self, remainingOrbitTime): + 'Parse a gcode line and add it to the cool skein.' + if remainingOrbitTime > 0.0 and self.boundaryLayer != None: + self.addCoolOrbits(remainingOrbitTime) + + def addTemperature(self, temperature): + 'Add a line of temperature.' + self.distanceFeedRate.addLine('M104 S' + euclidean.getRoundedToThreePlaces(temperature)) + + def getCoolMove(self, line, location, splitLine): + 'Get cool line according to time spent on layer.' + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + self.addFlowRate(self.multiplier * self.oldFlowRate) + return self.distanceFeedRate.getLineWithFeedRate(self.multiplier * self.feedRateMinute, line, splitLine) + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the cool gcode.' + self.repository = repository + self.coolEndLines = settings.getAlterationFileLines(repository.nameOfCoolEndFile.value) + self.coolStartLines = settings.getAlterationFileLines(repository.nameOfCoolStartFile.value) + self.halfCorner = complex(repository.minimumOrbitalRadius.value, repository.minimumOrbitalRadius.value) + self.lines = archive.getTextLines(gcodeText) + self.minimumArea = 4.0 * repository.minimumOrbitalRadius.value * repository.minimumOrbitalRadius.value + self.parseInitialization() + self.boundingRectangle = gcodec.BoundingRectangle().getFromGcodeLines( + self.lines[self.lineIndex :], 0.5 * self.perimeterWidth) + margin = 0.2 * self.perimeterWidth + halfCornerMargin = self.halfCorner + complex(margin, margin) + self.boundingRectangle.cornerMaximum -= halfCornerMargin + self.boundingRectangle.cornerMinimum += halfCornerMargin + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + if repository.turnFanOffAtEnding.value: + self.distanceFeedRate.addLine('M107') + return gcodec.getGcodeWithoutDuplication('M108', self.distanceFeedRate.output.getvalue()) + + def getLayerTime(self): + 'Get the time the extruder spends on the layer.' + feedRateMinute = self.feedRateMinute + layerTime = 0.0 + lastThreadLocation = self.oldLocation + for lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(lastThreadLocation, splitLine) + feedRateMinute = gcodec.getFeedRateMinute(feedRateMinute, splitLine) + if lastThreadLocation != None: + feedRateSecond = feedRateMinute / 60.0 + layerTime += location.distance(lastThreadLocation) / feedRateSecond + lastThreadLocation = location + elif firstWord == '(': + self.isBridgeLayer = True + elif firstWord == '()': + return layerTime + return layerTime + + def getLayerTimeActive(self): + 'Get the time the extruder spends on the layer while active.' + feedRateMinute = self.feedRateMinute + isExtruderActive = self.isExtruderActive + layerTime = 0.0 + lastThreadLocation = self.oldLocation + for lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(lastThreadLocation, splitLine) + feedRateMinute = gcodec.getFeedRateMinute(feedRateMinute, splitLine) + if lastThreadLocation != None and isExtruderActive: + feedRateSecond = feedRateMinute / 60.0 + layerTime += location.distance(lastThreadLocation) / feedRateSecond + lastThreadLocation = location + elif firstWord == 'M101': + isExtruderActive = True + elif firstWord == 'M103': + isExtruderActive = False + elif firstWord == '(': + self.isBridgeLayer = True + elif firstWord == '()': + return layerTime + return layerTime + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == 'M108': + self.oldFlowRate = float(splitLine[1][1 :]) + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + if self.repository.turnFanOnAtBeginning.value: + self.distanceFeedRate.addLine('M106') + elif firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('cool') + return + elif firstWord == '(': + self.oldFlowRate = float(splitLine[1]) + elif firstWord == '(': + self.orbitalFeedRatePerSecond = float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line and add it to the cool skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.highestZ = max(location.z, self.highestZ) + if self.isExtruderActive: + line = self.getCoolMove(line, location, splitLine) + self.oldLocation = location + elif firstWord == 'M101': + self.isExtruderActive = True + elif firstWord == 'M103': + self.isExtruderActive = False + elif firstWord == 'M104': + self.oldTemperature = gcodec.getDoubleAfterFirstLetter(splitLine[1]) + elif firstWord == 'M108': + self.oldFlowRate = float(splitLine[1][1 :]) + elif firstWord == '(': + self.boundaryLoop.append(gcodec.getLocationFromSplitLine(None, splitLine).dropAxis()) + elif firstWord == '(': + self.layerCount.printProgressIncrement('cool') + self.distanceFeedRate.addLine(line) + self.distanceFeedRate.addLinesSetAbsoluteDistanceMode(self.coolStartLines) + layerTime = self.getLayerTime() + remainingOrbitTime = max(self.repository.minimumLayerTime.value - layerTime, 0.0) + self.addCoolTemperature(remainingOrbitTime) + if self.repository.orbit.value: + self.addOrbitsIfNecessary(remainingOrbitTime) + else: + self.setMultiplier(remainingOrbitTime) + z = float(splitLine[1]) + self.boundaryLayer = euclidean.LoopLayer(z) + self.highestZ = max(z, self.highestZ) + self.distanceFeedRate.addLinesSetAbsoluteDistanceMode(self.coolEndLines) + return + elif firstWord == '()': + self.isBridgeLayer = False + self.multiplier = 1.0 + if self.coolTemperature != None: + self.addTemperature(self.oldTemperature) + self.coolTemperature = None + self.addFlowRate(self.oldFlowRate) + elif firstWord == '()': + self.boundaryLoop = [] + self.boundaryLayer.loops.append(self.boundaryLoop) + self.distanceFeedRate.addLine(line) + + def setMultiplier(self, remainingOrbitTime): + 'Set the feed and flow rate multiplier.' + layerTimeActive = self.getLayerTimeActive() + self.multiplier = min(1.0, layerTimeActive / (remainingOrbitTime + layerTimeActive)) + + + +def main(): + 'Display the cool dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cool.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cool.pyc new file mode 100644 index 0000000..44663ce Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/cool.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py new file mode 100644 index 0000000..932990c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.py @@ -0,0 +1,397 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Dimension adds Adrian's extruder distance E value so firmware does not have to calculate it on it's own and can set the extruder speed in relation to the distance that needs to be extruded. Some printers don't support this. Extruder distance is described at: + +http://blog.reprap.org/2009/05/4d-printing.html + +and in Erik de Bruijn's conversion script page at: + +http://objects.reprap.org/wiki/3D-to-5D-Gcode.php + +The dimension manual page is at: + +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Dimension + +Nophead wrote an excellent article on how to set the filament parameters: + +http://hydraraptor.blogspot.com/2011/03/spot-on-flow-rate.html + +==Operation== +The default 'Activate Dimension' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Extrusion Distance Format Choice=== +Default is 'Absolute Extrusion Distance' because in Adrian's description the distance is absolute. In future, because the relative distances are smaller than the cumulative absolute distances, hopefully the firmware will be able to use relative distance. + +====Absolute Extrusion Distance==== +When selected, the extrusion distance output will be the total extrusion distance to that gcode line. + +====Relative Extrusion Distance==== +When selected, the extrusion distance output will be the extrusion distance from the last gcode line. + +===Extruder Retraction Speed=== +Default is 13.3 mm/s. + +Defines the extruder retraction feed rate. A high value will allow the retraction operation to complete before much material oozes out. If your extruder can handle it, this value should be much larger than your feed rate. + +As an example, I have a feed rate of 48 mm/s and a 'Extruder Retraction Speed' of 150 mm/s. + +===Filament=== +====Filament Diameter==== +Default is 2.8 millimeters. + +Defines the filament diameter. + +====Filament Packing Density==== +Default is 0.85. This is for ABS. + +Defines the effective filament packing density. + +The default value is so low for ABS because ABS is relatively soft and with a pinch wheel extruder the teeth of the pinch dig in farther, so it sees a smaller effective diameter. With a hard plastic like PLA the teeth of the pinch wheel don't dig in as far, so it sees a larger effective diameter, so feeds faster, so for PLA the value should be around 0.97. This is with Wade's hobbed bolt. The effect is less significant with larger pinch wheels. + +Overall, you'll have to find the optimal filament packing density by experiment. + +===Retract Within Island=== +Default is off. + +When selected, retraction will work even when the next thread is within the same island. If it is not selected, retraction will only work when crossing a boundary. + +===Retraction Distance=== +Default is zero. + +Defines the amount the extruder retracts (sucks back) the extruded filament whenever an extruder stop is commanded. Using this seems to help prevent stringing. e.g. If set to 10 the extruder reverses the distance required to pull back 10mm of filament. In fact this does not actually happen but if you set this distance by trial and error you can get to a point where there is very little ooze from the extruder when it stops which is not normally the case. + +===Restart Extra Distance=== +Default is zero. + +Defines the restart extra distance when the thread restarts. The restart distance will be the retraction distance plus the restart extra distance. + +If this is greater than zero when the extruder starts this distance is added to the retract value giving extra filament. It can be a negative value in which case it is subtracted from the retraction distance. On some Repstrap machines a negative value can stop the build up of plastic that can occur at the start of perimeters. + +==Examples== +The following examples dimension the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and dimension.py. + +> python dimension.py +This brings up the dimension dialog. + +> python dimension.py Screw Holder Bottom.stl +The dimension tool is parsing the file: +Screw Holder Bottom.stl +.. +The dimension tool has created the file: +.. Screw Holder Bottom_dimension.gcode + +""" + +#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 datetime import date +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText = '', repository=None): + 'Dimension a gcode file or text.' + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, gcodeText), repository ) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Dimension a gcode text.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'dimension'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( DimensionRepository() ) + if not repository.activateDimension.value: + return gcodeText + return DimensionSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return DimensionRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Dimension a gcode file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'dimension', shouldAnalyze) + + +class DimensionRepository: + 'A class to handle the dimension settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.dimension.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Dimension', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Dimension') + self.activateDimension = settings.BooleanSetting().getFromValue('Activate Dimension', self, False ) + extrusionDistanceFormatLatentStringVar = settings.LatentStringVar() + self.extrusionDistanceFormatChoiceLabel = settings.LabelDisplay().getFromName('Extrusion Distance Format Choice: ', self ) + settings.Radio().getFromRadio( extrusionDistanceFormatLatentStringVar, 'Absolute Extrusion Distance', self, True ) + self.relativeExtrusionDistance = settings.Radio().getFromRadio( extrusionDistanceFormatLatentStringVar, 'Relative Extrusion Distance', self, False ) + self.extruderRetractionSpeed = settings.FloatSpin().getFromValue( 4.0, 'Extruder Retraction Speed (mm/s):', self, 34.0, 13.3 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Filament -', self ) + self.filamentDiameter = settings.FloatSpin().getFromValue(1.0, 'Filament Diameter (mm):', self, 6.0, 2.8) + self.filamentPackingDensity = settings.FloatSpin().getFromValue(0.7, 'Filament Packing Density (ratio):', self, 1.0, 0.85) + settings.LabelSeparator().getFromRepository(self) + self.minimumTravelForRetraction = settings.FloatSpin().getFromValue(0.0, 'Minimum Travel for Retraction (millimeters):', self, 2.0, 1.0) + self.retractWithinIsland = settings.BooleanSetting().getFromValue('Retract Within Island', self, False) + self.retractionDistance = settings.FloatSpin().getFromValue( 0.0, 'Retraction Distance (millimeters):', self, 100.0, 0.0 ) + self.restartExtraDistance = settings.FloatSpin().getFromValue( 0.0, 'Restart Extra Distance (millimeters):', self, 100.0, 0.0 ) + self.executeTitle = 'Dimension' + + def execute(self): + 'Dimension button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class DimensionSkein: + 'A class to dimension a skein of extrusions.' + def __init__(self): + 'Initialize.' + self.absoluteDistanceMode = True + self.boundaryLayers = [] + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = None + self.isExtruderActive = False + self.layerIndex = -1 + self.lineIndex = 0 + self.maximumZTravelFeedRatePerSecond = None + self.oldLocation = None + self.operatingFlowRate = None + self.retractionRatio = 1.0 + self.totalExtrusionDistance = 0.0 + self.travelFeedRatePerSecond = None + self.zDistanceRatio = 5.0 + + def addLinearMoveExtrusionDistanceLine(self, extrusionDistance): + 'Get the extrusion distance string from the extrusion distance.' + if self.repository.extruderRetractionSpeed.value != 0.0: + self.distanceFeedRate.output.write('G1 F%s\n' % self.extruderRetractionSpeedMinuteString) + self.distanceFeedRate.output.write('G1%s\n' % self.getExtrusionDistanceStringFromExtrusionDistance(extrusionDistance)) + self.distanceFeedRate.output.write('G1 F%s\n' % self.distanceFeedRate.getRounded(self.feedRateMinute)) + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the dimension gcode.' + self.repository = repository + filamentRadius = 0.5 * repository.filamentDiameter.value + filamentPackingArea = math.pi * filamentRadius * filamentRadius * repository.filamentPackingDensity.value + self.minimumTravelForRetraction = self.repository.minimumTravelForRetraction.value + self.doubleMinimumTravelForRetraction = self.minimumTravelForRetraction + self.minimumTravelForRetraction + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + if not self.repository.retractWithinIsland.value: + self.parseBoundaries() + self.flowScaleSixty = 60.0 * self.layerThickness * self.perimeterWidth / filamentPackingArea + if self.operatingFlowRate == None: + print('There is no operatingFlowRate so dimension will do nothing.') + return gcodeText + self.restartDistance = self.repository.retractionDistance.value + self.repository.restartExtraDistance.value + self.extruderRetractionSpeedMinuteString = self.distanceFeedRate.getRounded(60.0 * self.repository.extruderRetractionSpeed.value) + if self.maximumZTravelFeedRatePerSecond != None and self.travelFeedRatePerSecond != None: + self.zDistanceRatio = self.travelFeedRatePerSecond / self.maximumZTravelFeedRatePerSecond + for lineIndex in xrange(self.lineIndex, len(self.lines)): + self.parseLine( lineIndex ) + return self.distanceFeedRate.output.getvalue() + + def getDimensionedArcMovement(self, line, splitLine): + 'Get a dimensioned arc movement.' + if self.oldLocation == None: + return line + relativeLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.oldLocation += relativeLocation + distance = gcodec.getArcDistance(relativeLocation, splitLine) + return line + self.getExtrusionDistanceString(distance, splitLine) + + def getDimensionedLinearMovement( self, line, splitLine ): + 'Get a dimensioned linear movement.' + distance = 0.0 + if self.absoluteDistanceMode: + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.oldLocation != None: + distance = abs( location - self.oldLocation ) + self.oldLocation = location + else: + if self.oldLocation == None: + print('Warning: There was no absolute location when the G91 command was parsed, so the absolute location will be set to the origin.') + self.oldLocation = Vector3() + location = gcodec.getLocationFromSplitLine(None, splitLine) + distance = abs( location ) + self.oldLocation += location + return line + self.getExtrusionDistanceString( distance, splitLine ) + + def getDistanceToNextThread(self, lineIndex): + 'Get the travel distance to the next thread.' + if self.oldLocation == None: + return None + isActive = False + location = self.oldLocation + for afterIndex in xrange(lineIndex + 1, len(self.lines)): + line = self.lines[afterIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + if isActive: + location = gcodec.getLocationFromSplitLine(location, splitLine) + if not self.repository.retractWithinIsland.value: + locationEnclosureIndex = self.getSmallestEnclosureIndex(location.dropAxis()) + if locationEnclosureIndex != self.getSmallestEnclosureIndex(self.oldLocation.dropAxis()): + return None + locationMinusOld = location - self.oldLocation + xyTravel = abs(locationMinusOld.dropAxis()) + zTravelMultiplied = locationMinusOld.z * self.zDistanceRatio + return math.sqrt(xyTravel * xyTravel + zTravelMultiplied * zTravelMultiplied) + elif firstWord == 'M101': + isActive = True + elif firstWord == 'M103': + isActive = False + return None + + def getExtrusionDistanceString( self, distance, splitLine ): + 'Get the extrusion distance string.' + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + if not self.isExtruderActive: + return '' + if distance == 0.0: + return '' + if distance < 0.0: + print('Warning, the distance is less than zero in getExtrusionDistanceString in dimension; so there will not be an E value') + print(distance) + print(splitLine) + return '' + scaledFlowRate = self.flowRate * self.flowScaleSixty + return self.getExtrusionDistanceStringFromExtrusionDistance(scaledFlowRate / self.feedRateMinute * distance) + + def getExtrusionDistanceStringFromExtrusionDistance( self, extrusionDistance ): + 'Get the extrusion distance string from the extrusion distance.' + if self.repository.relativeExtrusionDistance.value: + return ' E' + self.distanceFeedRate.getRounded( extrusionDistance ) + self.totalExtrusionDistance += extrusionDistance + return ' E' + self.distanceFeedRate.getRounded( self.totalExtrusionDistance ) + + def getRetractionRatio(self, lineIndex): + 'Get the retraction ratio.' + distanceToNextThread = self.getDistanceToNextThread(lineIndex) + if distanceToNextThread == None: + return 1.0 + if distanceToNextThread >= self.doubleMinimumTravelForRetraction: + return 1.0 + if distanceToNextThread <= self.minimumTravelForRetraction: + return 0.0 + return (distanceToNextThread - self.minimumTravelForRetraction) / self.minimumTravelForRetraction + + def getSmallestEnclosureIndex(self, point): + 'Get the index of the smallest boundary loop which encloses the point.' + boundaryLayer = self.boundaryLayers[self.layerIndex] + for loopIndex, loop in enumerate(boundaryLayer.loops): + if euclidean.isPointInsideLoop(loop, point): + return loopIndex + return None + + def parseBoundaries(self): + 'Parse the boundaries and add them to the boundary layers.' + boundaryLoop = None + boundaryLayer = None + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '()': + boundaryLoop = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if boundaryLoop == None: + boundaryLoop = [] + boundaryLayer.loops.append(boundaryLoop) + boundaryLoop.append(location.dropAxis()) + elif firstWord == '(': + boundaryLayer = euclidean.LoopLayer(float(splitLine[1])) + self.boundaryLayers.append(boundaryLayer) + for boundaryLayer in self.boundaryLayers: + triangle_mesh.sortLoopsInOrderOfArea(False, boundaryLayer.loops) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('dimension') + return + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + elif firstWord == '(': + self.maximumZTravelFeedRatePerSecond = float(splitLine[1]) + elif firstWord == '(': + self.maximumZTravelFeedRatePerSecond = float(splitLine[1]) + elif firstWord == '(': + self.feedRateMinute = 60.0 * float(splitLine[1]) + elif firstWord == '(': + self.operatingFlowRate = float(splitLine[1]) + self.flowRate = self.operatingFlowRate + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + elif firstWord == '(': + self.travelFeedRatePerSecond = float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine( self, lineIndex ): + 'Parse a gcode line and add it to the dimension skein.' + line = self.lines[lineIndex].lstrip() + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G2' or firstWord == 'G3': + line = self.getDimensionedArcMovement( line, splitLine ) + if firstWord == 'G1': + line = self.getDimensionedLinearMovement( line, splitLine ) + if firstWord == 'G90': + self.absoluteDistanceMode = True + elif firstWord == 'G91': + self.absoluteDistanceMode = False + elif firstWord == '(': + self.layerIndex += 1 + elif firstWord == 'M101': + self.addLinearMoveExtrusionDistanceLine(self.restartDistance * self.retractionRatio) + if self.totalExtrusionDistance > 999999.0: + if not self.repository.relativeExtrusionDistance.value: + self.distanceFeedRate.addLine('G92 E0') + self.totalExtrusionDistance = 0.0 + self.isExtruderActive = True + elif firstWord == 'M103': + self.retractionRatio = self.getRetractionRatio(lineIndex) + self.addLinearMoveExtrusionDistanceLine(-self.repository.retractionDistance.value * self.retractionRatio) + self.isExtruderActive = False + elif firstWord == 'M108': + self.flowRate = float( splitLine[1][1 :] ) + self.distanceFeedRate.addLine(line) + + +def main(): + 'Display the dimension dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.pyc new file mode 100644 index 0000000..72770f8 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/dimension.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/drill.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/drill.py new file mode 100644 index 0000000..c05429d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/drill.py @@ -0,0 +1,258 @@ +""" +This page is in the table of contents. +Drill is a script to drill down small holes. + +==Operation== +The default 'Activate Drill' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Drilling Margin=== +The drill script will move the tool from the top of the hole plus the 'Drilling Margin on Top', to the bottom of the hole minus the 'Drilling Margin on Bottom'. + +===Drilling Margin on Top=== +Default is three millimeters. + +===Drilling Margin on Bottom=== +Default is one millimeter. + +==Examples== +The following examples drill the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and drill.py. + +> python drill.py +This brings up the drill dialog. + +> python drill.py Screw Holder Bottom.stl +The drill tool is parsing the file: +Screw Holder Bottom.stl +.. +The drill tool has created the file: +.. Screw Holder Bottom_drill.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + +def getCraftedText( fileName, text, repository=None): + "Drill a gcode linear move file or text." + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + "Drill a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'drill'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( DrillRepository() ) + if not repository.activateDrill.value: + return gcodeText + return DrillSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return DrillRepository() + +def getPolygonCenter( polygon ): + "Get the centroid of a polygon." + pointSum = complex() + areaSum = 0.0 + for pointIndex in xrange( len( polygon ) ): + pointBegin = polygon[pointIndex] + pointEnd = polygon[ (pointIndex + 1) % len( polygon ) ] + area = pointBegin.real * pointEnd.imag - pointBegin.imag * pointEnd.real + areaSum += area + pointSum += complex( pointBegin.real + pointEnd.real, pointBegin.imag + pointEnd.imag ) * area + return pointSum / 3.0 / areaSum + +def writeOutput(fileName, shouldAnalyze=True): + "Drill a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'drill', shouldAnalyze) + + +class ThreadLayer: + "A layer of loops and paths." + def __init__( self, z ): + "Thread layer constructor." + self.points = [] + self.z = z + + def __repr__(self): + "Get the string representation of this thread layer." + return '%s, %s' % ( self.z, self.points ) + + +class DrillRepository: + "A class to handle the drill settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.drill.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Drill', self, '') + self.activateDrill = settings.BooleanSetting().getFromValue('Activate Drill', self, True ) + self.drillingMarginOnBottom = settings.FloatSpin().getFromValue( 0.0, 'Drilling Margin on Bottom (millimeters):', self, 5.0, 1.0 ) + self.drillingMarginOnTop = settings.FloatSpin().getFromValue( 0.0, 'Drilling Margin on Top (millimeters):', self, 20.0, 3.0 ) + self.executeTitle = 'Drill' + + def execute(self): + "Drill button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class DrillSkein: + "A class to drill a skein of extrusions." + def __init__(self): + self.boundary = None + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.halfLayerThickness = 0.4 + self.isDrilled = False + self.lineIndex = 0 + self.lines = None + self.maximumDistance = 0.06 + self.oldLocation = None + self.threadLayer = None + self.threadLayers = [] + + def addDrillHoles(self): + "Parse a gcode line." + self.isDrilled = True + if len( self.threadLayers ) < 1: + return + topThreadLayer = self.threadLayers[0] + drillPoints = topThreadLayer.points + for drillPoint in drillPoints: + zTop = topThreadLayer.z + self.halfLayerThickness + self.repository.drillingMarginOnTop.value + drillingCenterDepth = self.getDrillingCenterDepth( topThreadLayer.z, drillPoint ) + zBottom = drillingCenterDepth - self.halfLayerThickness - self.repository.drillingMarginOnBottom.value + self.addGcodeFromVerticalThread( drillPoint, zTop, zBottom ) + + def addGcodeFromVerticalThread( self, point, zBegin, zEnd ): + "Add a thread to the output." + self.distanceFeedRate.addGcodeMovementZ( point, zBegin ) + self.distanceFeedRate.addLine('M101') # Turn extruder on. + self.distanceFeedRate.addGcodeMovementZ( point, zEnd ) + self.distanceFeedRate.addLine('M103') # Turn extruder off. + + def addThreadLayerIfNone(self): + "Add a thread layer if it is none." + if self.threadLayer != None: + return + self.threadLayer = ThreadLayer( self.layerZ ) + self.threadLayers.append( self.threadLayer ) + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the drill gcode." + self.lines = archive.getTextLines(gcodeText) + self.repository = repository + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseNestedRing(line) + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getDrillingCenterDepth( self, drillingCenterDepth, drillPoint ): + "Get the drilling center depth." + for threadLayer in self.threadLayers[1 :]: + if self.isPointClose( drillPoint, threadLayer.points ): + drillingCenterDepth = threadLayer.z + else: + return drillingCenterDepth + return drillingCenterDepth + + def isPointClose( self, drillPoint, points ): + "Determine if a point on the thread layer is close." + for point in points: + if abs( point - drillPoint ) < self.maximumDistance: + return True + return False + + def linearMove( self, splitLine ): + "Add a linear move to the loop." + self.addThreadLayerIfNone() + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.extruderActive: + self.boundary = None + self.oldLocation = location + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('drill') + return + elif firstWord == '(': + self.halfLayerThickness = 0.5 * float(splitLine[1]) + elif firstWord == '(': + self.maximumDistance = 0.1 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + self.distanceFeedRate.addLine(line) + if firstWord == '(': + if not self.isDrilled: + self.addDrillHoles() + + def parseNestedRing(self, line): + "Parse a nested ring." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + if firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if self.boundary == None: + self.boundary = [] + self.boundary.append(location.dropAxis()) + elif firstWord == '(': + self.layerZ = float(splitLine[1]) + self.threadLayer = None + elif firstWord == '()': + self.addThreadLayerIfNone() + elif firstWord == '()': + if self.boundary != None: + self.threadLayer.points.append( getPolygonCenter( self.boundary ) ) + self.boundary = None + + +def main(): + "Display the drill dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export.py new file mode 100644 index 0000000..9d2941a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export.py @@ -0,0 +1,436 @@ +""" +This page is in the table of contents. +Export is a craft tool to pick an export plugin, add information to the file name, and delete comments. + +The export manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Export + +==Operation== +The default 'Activate Export' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Add Descriptive Extension=== +Default is off. + +When selected, key profile values will be added as an extension to the gcode file. For example: +test.04hx06w_03fill_2cx2r_33EL.gcode + +would mean: + +* . (Carve section.) +* 04h = 'Layer Thickness (mm):' 0.4 +* x +* 06w = 0.6 width i.e. 0.4 times 'Perimeter Width over Thickness (ratio):' 1.5 +* _ (Fill section.) +* 03fill = 'Infill Solidity (ratio):' 0.3 +* _ (Multiply section; if there is one column and one row then this section is not shown.) +* 2c = 'Number of Columns (integer):' 2 +* x +* 2r = 'Number of Rows (integer):' 2. +* _ (Speed section.) +* 33EL = 'Feed Rate (mm/s):' 33.0 and 'Flow Rate Setting (float):' 33.0. If either value has a positive value after the decimal place then this is also shown, but if it is zero it is hidden. Also, if the values differ (which they shouldn't with 5D volumetrics) then each should be displayed separately. For example, 35.2E30L = 'Feed Rate (mm/s):' 35.2 and 'Flow Rate Setting (float):' 30.0. + +===Add Profile Extension=== +Default is off. + +When selected, the current profile will be added to the file extension. For example: +test.my_profile_name.gcode + +===Add Timestamp Extension=== +Default is off. + +When selected, the current date and time is added as an extension in format YYYYmmdd_HHMMSS (so it is sortable if one has many files). For example: +test.my_profile_name.20110613_220113.gcode + +===Also Send Output To=== +Default is empty. + +Defines the output name for sending to a file or pipe. A common choice is stdout to print the output in the shell screen. Another common choice is stderr. With the empty default, nothing will be done. If the value is anything else, the output will be written to that file name. + +===Analyze Gcode=== +Default is on. + +When selected, the penultimate gcode will be sent to the analyze plugins to be analyzed and viewed. + +===Comment Choice=== +Default is 'Delete All Comments'. + +====Do Not Delete Comments==== +When selected, export will not delete comments. Crafting comments slow down the processing in many firmware types, which leads to pauses and therefore a lower quality print. + +====Delete Crafting Comments==== +When selected, export will delete the time consuming crafting comments, but leave the initialization comments. Since the crafting comments are deleted, there are no pauses during extrusion. The remaining initialization comments provide some useful information for the analyze tools. + +====Delete All Comments==== +When selected, export will delete all comments. The comments are not necessary to run a fabricator. Some printers do not support comments at all so the safest way is choose this option. + +===Export Operations=== +Export presents the user with a choice of the export plugins in the export_plugins folder. The chosen plugin will then modify the gcode or translate it into another format. There is also the "Do Not Change Output" choice, which will not change the output. An export plugin is a script in the export_plugins folder which has the getOutput function, the globalIsReplaceable variable and if it's output is not replaceable, the writeOutput function. + +===File Extension=== +Default is gcode. + +Defines the file extension added to the name of the output file. The output file will be named as originalname_export.extension so if you are processing XYZ.stl the output will by default be XYZ_export.gcode + +===Name of Replace File=== +Default is replace.csv. + +When export is exporting the code, if there is a tab separated file with the name of the "Name of Replace File" setting, it will replace the string in the first column by its replacement in the second column. If there is nothing in the second column, the first column string will be deleted, if this leads to an empty line, the line will be deleted. If there are replacement columns after the second, they will be added as extra lines of text. There is an example file replace_example.csv to demonstrate the tab separated format, which can be edited in a text editor or a spreadsheet. + +Export looks for the alteration file in the alterations folder in the .skeinforge folder in the home directory. Export 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. If it doesn't find the file it then looks in the alterations folder in the skeinforge_plugins folder. + +===Save Penultimate Gcode=== +Default is off. + +When selected, export will save the gcode file with the suffix '_penultimate.gcode' just before it is exported. This is useful because the code after it is exported could be in a form which the viewers can not display well. + +==Examples== +The following examples export the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and export.py. + +> python export.py +This brings up the export dialog. + +> python export.py Screw Holder Bottom.stl +The export tool is parsing the file: +Screw Holder Bottom.stl +.. +The export tool has created the file: +.. Screw Holder Bottom_export.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_analyze +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import io +import os +import sys +import time + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__credits__ = 'Gary Hodgson ' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedTextFromText(gcodeText, repository=None): + 'Export a gcode linear move text.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'export'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(ExportRepository()) + if not repository.activateExport.value: + return gcodeText + return ExportSkein().getCraftedGcode(repository, gcodeText) + +def getDescriptionCarve(lines): + 'Get the description for carve.' + descriptionCarve = '' + layerThicknessString = getSettingString(lines, 'carve', 'Layer Thickness') + if layerThicknessString != None: + descriptionCarve += layerThicknessString.replace('.', '') + 'h' + perimeterWidthString = getSettingString(lines, 'carve', 'Perimeter Width over Thickness') + if perimeterWidthString != None: + descriptionCarve += 'x%sw' % str(float(perimeterWidthString) * float(layerThicknessString)).replace('.', '') + return descriptionCarve + +def getDescriptionFill(lines): + 'Get the description for fill.' + activateFillString = getSettingString(lines, 'fill', 'Activate Fill') + if activateFillString == None or activateFillString == 'False': + return '' + infillSolidityString = getSettingString(lines, 'fill', 'Infill Solidity') + return '_' + infillSolidityString.replace('.', '') + 'fill' + +def getDescriptionMultiply(lines): + 'Get the description for multiply.' + activateMultiplyString = getSettingString(lines, 'multiply', 'Activate Multiply') + if activateMultiplyString == None or activateMultiplyString == 'False': + return '' + columnsString = getSettingString(lines, 'multiply', 'Number of Columns') + rowsString = getSettingString(lines, 'multiply', 'Number of Rows') + if columnsString == '1' and rowsString == '1': + return '' + return '_%scx%sr' % (columnsString, rowsString) + +def getDescriptionSpeed(lines): + 'Get the description for speed.' + activateSpeedString = getSettingString(lines, 'speed', 'Activate Speed') + if activateSpeedString == None or activateSpeedString == 'False': + return '' + feedRateString = getSettingString(lines, 'speed', 'Feed Rate') + flowRateString = getSettingString(lines, 'speed', 'Flow Rate') + if feedRateString == flowRateString: + return '_%sEL' % feedRateString.replace('.0', '') + return '_%sE%sL' % (feedRateString.replace('.0', ''), flowRateString.replace('.0', '')) + +def getDescriptiveExtension(gcodeText): + 'Get the descriptive extension.' + lines = archive.getTextLines(gcodeText) + return '.' + getDescriptionCarve(lines) + getDescriptionFill(lines) + getDescriptionMultiply(lines) + getDescriptionSpeed(lines) + +def getDistanceGcode(exportText): + 'Get gcode lines with distance variable added.' + lines = archive.getTextLines(exportText) + oldLocation = None + for line in lines: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = None + if len(splitLine) > 0: + firstWord = splitLine[0] + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(oldLocation, splitLine) + if oldLocation != None: + distance = location.distance(oldLocation) + print( distance ) + oldLocation = location + return exportText + +def getFirstValue(gcodeText, word): + 'Get the value from the first line which starts with the given word.' + for line in archive.getTextLines(gcodeText): + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if gcodec.getFirstWord(splitLine) == word: + return splitLine[1] + return '' + +def getNewRepository(): + 'Get new repository.' + return ExportRepository() + +def getReplaceableExportGcode(nameOfReplaceFile, replaceableExportGcode): + 'Get text with strings replaced according to replace.csv file.' + replaceLines = settings.getAlterationLines(nameOfReplaceFile) + if len(replaceLines) < 1: + return replaceableExportGcode + for replaceLine in replaceLines: + splitLine = replaceLine.replace('\\n', '\t').split('\t') + if len(splitLine) > 0: + replaceableExportGcode = replaceableExportGcode.replace(splitLine[0], '\n'.join(splitLine[1 :])) + output = io.BytesIO() + gcodec.addLinesToCString(output, archive.getTextLines(replaceableExportGcode)) + return output.getvalue() + +def getSelectedPluginModule( plugins ): + 'Get the selected plugin module.' + for plugin in plugins: + if plugin.value: + return archive.getModuleWithDirectoryPath( plugin.directoryPath, plugin.name ) + return None + +def getSettingString(lines, procedureName, settingNameStart): + 'Get the setting value from the lines, return None if there is no setting starting with that name.' + settingNameStart = settingNameStart.replace(' ', '_') + for line in lines: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = None + if len(splitLine) > 0: + firstWord = splitLine[0] + if firstWord == '(': + if len(splitLine) > 4: + if splitLine[1] == procedureName and splitLine[2].startswith(settingNameStart): + return splitLine[3] + elif firstWord == '()': + return None + return None + +def sendOutputTo(outputTo, text): + 'Send output to a file or a standard output.' + if outputTo.endswith('stderr'): + sys.stderr.write(text) + sys.stderr.write('\n') + sys.stderr.flush() + return + if outputTo.endswith('stdout'): + sys.stdout.write(text) + sys.stdout.write('\n') + sys.stdout.flush() + return + archive.writeFileText(outputTo, text) + +def writeOutput(fileName, shouldAnalyze=True): + 'Export a gcode linear move file.' + if fileName == '': + return None + repository = ExportRepository() + settings.getReadRepository(repository) + startTime = time.time() + print('File ' + archive.getSummarizedFileName(fileName) + ' is being chain exported.') + fileNameSuffix = fileName[: fileName.rfind('.')] + if repository.addExportSuffix.value: + fileNameSuffix += '_export' + gcodeText = gcodec.getGcodeFileText(fileName, '') + procedures = skeinforge_craft.getProcedures('export', gcodeText) + gcodeText = skeinforge_craft.getChainTextFromProcedures(fileName, procedures[: -1], gcodeText) + if gcodeText == '': + return None + if repository.addProfileExtension.value: + fileNameSuffix += '.' + getFirstValue(gcodeText, '(') + if repository.addDescriptiveExtension.value: + print( 'getDescriptiveExtension(gcodeText)') + print( getDescriptiveExtension(gcodeText)) + fileNameSuffix += getDescriptiveExtension(gcodeText) + if repository.addTimestampExtension.value: + fileNameSuffix += '.' + getFirstValue(gcodeText, '(') + fileNameSuffix += '.' + repository.fileExtension.value + fileNamePenultimate = fileName[: fileName.rfind('.')] + '_penultimate.gcode' + filePenultimateWritten = False + if repository.savePenultimateGcode.value: + archive.writeFileText(fileNamePenultimate, gcodeText) + filePenultimateWritten = True + print('The penultimate file is saved as ' + archive.getSummarizedFileName(fileNamePenultimate)) + exportGcode = getCraftedTextFromText(gcodeText, repository) + window = None + if shouldAnalyze and repository.analyzeGcode.value: + window = skeinforge_analyze.writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText) + replaceableExportGcode = None + selectedPluginModule = getSelectedPluginModule(repository.exportPlugins) + if selectedPluginModule == None: + replaceableExportGcode = exportGcode + else: + if selectedPluginModule.globalIsReplaceable: + replaceableExportGcode = selectedPluginModule.getOutput(exportGcode) + else: + selectedPluginModule.writeOutput(fileNameSuffix, exportGcode) + if replaceableExportGcode != None: + replaceableExportGcode = getReplaceableExportGcode(repository.nameOfReplaceFile.value, replaceableExportGcode) + archive.writeFileText( fileNameSuffix, replaceableExportGcode ) + print('The exported file is saved as ' + archive.getSummarizedFileName(fileNameSuffix)) + if repository.alsoSendOutputTo.value != '': + if replaceableExportGcode == None: + replaceableExportGcode = selectedPluginModule.getOutput(exportGcode) + sendOutputTo(repository.alsoSendOutputTo.value, replaceableExportGcode) + print('It took %s to export the file.' % euclidean.getDurationString(time.time() - startTime)) + return window + + +class ExportRepository: + 'A class to handle the export settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.export.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Export', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Export') + self.activateExport = settings.BooleanSetting().getFromValue('Activate Export', self, True) + self.addDescriptiveExtension = settings.BooleanSetting().getFromValue('Add Descriptive Extension', self, False) + self.addExportSuffix = settings.BooleanSetting().getFromValue('Add Export Suffix', self, True) + self.addProfileExtension = settings.BooleanSetting().getFromValue('Add Profile Extension', self, False) + self.addTimestampExtension = settings.BooleanSetting().getFromValue('Add Timestamp Extension', self, False) + self.alsoSendOutputTo = settings.StringSetting().getFromValue('Also Send Output To:', self, '') + self.analyzeGcode = settings.BooleanSetting().getFromValue('Analyze Gcode', self, True) + self.commentChoice = settings.MenuButtonDisplay().getFromName('Comment Choice:', self) + self.doNotDeleteComments = settings.MenuRadio().getFromMenuButtonDisplay(self.commentChoice, 'Do Not Delete Comments', self, False) + self.deleteCraftingComments = settings.MenuRadio().getFromMenuButtonDisplay(self.commentChoice, 'Delete Crafting Comments', self, False) + self.deleteAllComments = settings.MenuRadio().getFromMenuButtonDisplay(self.commentChoice, 'Delete All Comments', self, True) + exportPluginsFolderPath = archive.getAbsoluteFrozenFolderPath(archive.getCraftPluginsDirectoryPath('export.py'), 'export_plugins') + exportStaticDirectoryPath = os.path.join(exportPluginsFolderPath, 'static_plugins') + exportPluginFileNames = archive.getPluginFileNamesFromDirectoryPath(exportPluginsFolderPath) + exportStaticPluginFileNames = archive.getPluginFileNamesFromDirectoryPath(exportStaticDirectoryPath) + self.exportLabel = settings.LabelDisplay().getFromName('Export Operations: ', self) + self.exportPlugins = [] + exportLatentStringVar = settings.LatentStringVar() + self.doNotChangeOutput = settings.RadioCapitalized().getFromRadio(exportLatentStringVar, 'Do Not Change Output', self, True) + self.doNotChangeOutput.directoryPath = None + allExportPluginFileNames = exportPluginFileNames + exportStaticPluginFileNames + for exportPluginFileName in allExportPluginFileNames: + exportPlugin = None + if exportPluginFileName in exportPluginFileNames: + path = os.path.join(exportPluginsFolderPath, exportPluginFileName) + exportPlugin = settings.RadioCapitalizedButton().getFromPath(exportLatentStringVar, exportPluginFileName, path, self, False) + exportPlugin.directoryPath = exportPluginsFolderPath + else: + exportPlugin = settings.RadioCapitalized().getFromRadio(exportLatentStringVar, exportPluginFileName, self, False) + exportPlugin.directoryPath = exportStaticDirectoryPath + self.exportPlugins.append(exportPlugin) + self.fileExtension = settings.StringSetting().getFromValue('File Extension:', self, 'gcode') + self.nameOfReplaceFile = settings.StringSetting().getFromValue('Name of Replace File:', self, 'replace.csv') + self.savePenultimateGcode = settings.BooleanSetting().getFromValue('Save Penultimate Gcode', self, False) + self.executeTitle = 'Export' + + def execute(self): + 'Export button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class ExportSkein: + 'A class to export a skein of extrusions.' + def __init__(self): + self.crafting = False + self.decimalPlacesExported = 2 + self.output = cStringIO.StringIO() + + def addLine(self, line): + 'Add a line of text and a newline to the output.' + if line != '': + self.output.write(line + '\n') + + def getCraftedGcode( self, repository, gcodeText ): + 'Parse gcode text and store the export gcode.' + self.repository = repository + lines = archive.getTextLines(gcodeText) + for line in lines: + self.parseLine(line) + return self.output.getvalue() + + def getLineWithTruncatedNumber(self, character, line, splitLine): + 'Get a line with the number after the character truncated.' + numberString = gcodec.getStringFromCharacterSplitLine(character, splitLine) + if numberString == None: + return line + roundedNumberString = euclidean.getRoundedToPlacesString(self.decimalPlacesExported, float(numberString)) + return gcodec.getLineWithValueString(character, line, splitLine, roundedNumberString) + + def parseLine(self, line): + 'Parse a gcode line.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '()': + self.crafting = False + elif firstWord == '(': + self.decimalPlacesExported = int(splitLine[1]) - 1 + if self.repository.deleteAllComments.value or (self.repository.deleteCraftingComments.value and self.crafting): + if firstWord[0] == '(': + return + else: + line = line.split(';')[0].split('(')[0].strip() + if firstWord == '()': + self.crafting = True + if firstWord == '()': + self.addLine(gcodec.getTagBracketedProcedure('export')) + if firstWord != 'G1' and firstWord != 'G2' and firstWord != 'G3' : + self.addLine(line) + return + line = self.getLineWithTruncatedNumber('X', line, splitLine) + line = self.getLineWithTruncatedNumber('Y', line, splitLine) + line = self.getLineWithTruncatedNumber('Z', line, splitLine) + line = self.getLineWithTruncatedNumber('I', line, splitLine) + line = self.getLineWithTruncatedNumber('J', line, splitLine) + line = self.getLineWithTruncatedNumber('R', line, splitLine) + self.addLine(line) + + +def main(): + 'Display the export dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export.pyc new file mode 100644 index 0000000..cbee3ef Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/__init__.py new file mode 100644 index 0000000..58ec332 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 4 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/binary_16_byte.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/binary_16_byte.py new file mode 100644 index 0000000..67604fe --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/binary_16_byte.py @@ -0,0 +1,231 @@ +""" +This page is in the table of contents. +Binary 16 byte is an export plugin to convert gcode into 16 byte binary segments. + +An export plugin is a script in the export_plugins folder which has the getOutput function, the globalIsReplaceable variable and if it's output is not replaceable, the writeOutput function. It is meant to be run from the export tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin a lower case name. + +The getOutput function of this script takes a gcode text and returns that text converted into 16 byte segments. The writeOutput function of this script takes a gcode text and writes that in a binary format converted into 16 byte segments. + +This plugin is just a starter to make a real binary converter. + +==Settings== +===Feed Rate Step Length=== +Default is 0.1 millimeters/second. + +Defines the feed rate step length. + +===File Extension=== +Default is bin. + +Defines the file extension suffix. + +===Offset=== +====X Offset==== +Default is zero. + +Defines the X Offset. + +====Y Offset==== +Default is zero. + +Defines the Y Offset. + +====Z Offset==== +Default is zero. + +Defines the Z Offset. + +===Step Length=== +====X Step Length==== +Default is 0.1 millimeters. + +Defines the X axis step length. + +====Y Step Length==== +Default is 0.1 millimeters. + +Defines the Y axis step length. + +====Z Step Length==== +Default is 0.01 millimeters. + +Defines the Z axis step length. + +==Record structure== +BinArray(0) = AscW(Inst_Code_Letter) +BinArray(1) = cInst_Code + +X Data +sInt32_to_Hbytes(iXdim_1) +BinArray(2) = lsb 'short lsb +BinArray(3) = msb 'short msb + +Y Data +sInt32_to_Hbytes(iYdim_2) +BinArray(4) = lsb 'short lsb +BinArray(5) = msb 'short msb + +Z Data +sInt32_to_Hbytes(iZdim_3) +BinArray(6) = lsb 'short lsb +BinArray(7) = msb 'short msb + +I Data +sInt32_to_Hbytes(iIdim_4) +BinArray(8) = lsb 'short lsb +BinArray(9) = msb 'short msb + +J Data +sInt32_to_Hbytes(iJdim_5) +BinArray(10) = lsb 'short lsb +BinArray(11) = msb 'short msb + +BinArray(12) = FP_Char +sInt32_to_Hbytes(iFP_Num) +BinArray(13) = lsb 'short lsb + +BinArray(14) = bActiveFlags + +BinArray(15) = AscW("#")End of record filler + +Byte 14 is worth a few extra notes, this byte is used to define which of the axes are active, its used to get round the problem of say a line of code with no mention of z. This would be put into the file as z = 0 as the space for this data is reserved, if we did nothing, this would instruct the machine to go to z = 0. If we use the active flag to define the z axis as inactive the z = 0 is ignored and the value set to the last saved value of z, i.e it does not move. If the z data is actually set to z = 0 then the axis would be set to active and the move takes place. + +""" + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +from struct import Struct +import cStringIO +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +# This is true if the output is text and false if it is binary." +globalIsReplaceable = False + + +def getIntegerFlagFromCharacterSplitLine(character, splitLine): + "Get the integer flag after the first occurence of the character in the split line." + lineFromCharacter = gcodec.getStringFromCharacterSplitLine(character, splitLine) + if lineFromCharacter == None: + return 0 + return 1 + +def getIntegerFromCharacterLengthLineOffset( character, offset, splitLine, stepLength ): + "Get the integer after the first occurence of the character in the split line." + lineFromCharacter = gcodec.getStringFromCharacterSplitLine(character, splitLine) + if lineFromCharacter == None: + return 0 + floatValue = ( float( lineFromCharacter ) + offset ) / stepLength + return int( round( floatValue ) ) + +def getNewRepository(): + 'Get new repository.' + return Binary16ByteRepository() + +def getOutput( gcodeText, binary16ByteRepository = None ): + 'Get the exported version of a gcode file.' + if gcodeText == '': + return '' + if binary16ByteRepository == None: + binary16ByteRepository = Binary16ByteRepository() + settings.getReadRepository( binary16ByteRepository ) + return Binary16ByteSkein().getCraftedGcode( gcodeText, binary16ByteRepository ) + +def writeOutput( fileName, gcodeText = ''): + "Write the exported version of a gcode file." + binary16ByteRepository = Binary16ByteRepository() + settings.getReadRepository( binary16ByteRepository ) + gcodeText = gcodec.getGcodeFileText(fileName, gcodeText) + skeinOutput = getOutput( gcodeText, binary16ByteRepository ) + suffixFileName = fileName[ : fileName.rfind('.') ] + '.' + binary16ByteRepository.fileExtension.value + archive.writeFileText( suffixFileName, skeinOutput ) + print('The converted file is saved as ' + archive.getSummarizedFileName(suffixFileName) ) + + +class Binary16ByteRepository: + "A class to handle the export settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + #Set the default settings. + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.export_plugins.binary_16_byte.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File to be Converted to Binary 16 Byte', self, '') + self.feedRateStepLength = settings.FloatSpin().getFromValue( 0.0, 'Feed Rate Step Length (millimeters/second)', self, 1.0, 0.1 ) + self.fileExtension = settings.StringSetting().getFromValue('File Extension:', self, 'bin') + settings.LabelDisplay().getFromName('Offset:', self ) + self.xOffset = settings.FloatSpin().getFromValue( - 100.0, 'X Offset (millimeters)', self, 100.0, 0.0 ) + self.yOffset = settings.FloatSpin().getFromValue( -100.0, 'Y Offset (millimeters)', self, 100.0, 0.0 ) + self.zOffset = settings.FloatSpin().getFromValue( - 10.0, 'Z Offset (millimeters)', self, 10.0, 0.0 ) + settings.LabelDisplay().getFromName('Step Length:', self ) + self.xStepLength = settings.FloatSpin().getFromValue( 0.0, 'X Step Length (millimeters)', self, 1.0, 0.1 ) + self.yStepLength = settings.FloatSpin().getFromValue( 0.0, 'Y Step Length (millimeters)', self, 1.0, 0.1 ) + self.zStepLength = settings.FloatSpin().getFromValue( 0.0, 'Z Step Length (millimeters)', self, 0.2, 0.01 ) + self.executeTitle = 'Convert to Binary 16 Byte' + + def execute(self): + "Convert to binary 16 byte button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, ['.gcode'], self.fileNameInput.wasCancelled ) + for fileName in fileNames: + writeOutput(fileName) + + +class Binary16ByteSkein: + "A class to convert gcode into 16 byte binary segments." + def __init__(self): + self.output = cStringIO.StringIO() + + def getCraftedGcode( self, gcodeText, binary16ByteRepository ): + "Parse gcode text and store the gcode." + self.binary16ByteRepository = binary16ByteRepository + lines = archive.getTextLines(gcodeText) + for line in lines: + self.parseLine(line) + return self.output.getvalue() + + def parseLine(self, line): + "Parse a gcode line." + binary16ByteRepository = self.binary16ByteRepository + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if len(firstWord) < 1: + return + firstLetter = firstWord[0] + if firstLetter == '(': + return + feedRateInteger = getIntegerFromCharacterLengthLineOffset('F', 0.0, splitLine, binary16ByteRepository.feedRateStepLength.value ) + iInteger = getIntegerFromCharacterLengthLineOffset('I', 0.0, splitLine, binary16ByteRepository.xStepLength.value ) + jInteger = getIntegerFromCharacterLengthLineOffset('J', 0.0, splitLine, binary16ByteRepository.yStepLength.value ) + xInteger = getIntegerFromCharacterLengthLineOffset('X', binary16ByteRepository.xOffset.value, splitLine, binary16ByteRepository.xStepLength.value ) + yInteger = getIntegerFromCharacterLengthLineOffset('Y', binary16ByteRepository.yOffset.value, splitLine, binary16ByteRepository.yStepLength.value ) + zInteger = getIntegerFromCharacterLengthLineOffset('Z', binary16ByteRepository.zOffset.value, splitLine, binary16ByteRepository.zStepLength.value ) + sixteenByteStruct = Struct('cBhhhhhhBc') + flagInteger = getIntegerFlagFromCharacterSplitLine('X', splitLine ) + flagInteger += 2 * getIntegerFlagFromCharacterSplitLine('Y', splitLine ) + flagInteger += 4 * getIntegerFlagFromCharacterSplitLine('Z', splitLine ) + flagInteger += 8 * getIntegerFlagFromCharacterSplitLine('I', splitLine ) + flagInteger += 16 * getIntegerFlagFromCharacterSplitLine('J', splitLine ) + flagInteger += 32 * getIntegerFlagFromCharacterSplitLine('F', splitLine ) + packedString = sixteenByteStruct.pack( firstLetter, int( firstWord[1 :] ), xInteger, yInteger, zInteger, iInteger, jInteger, feedRateInteger, flagInteger, '#') + self.output.write( packedString ) + + +def main(): + "Display the export dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/gcode_step.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/gcode_step.py new file mode 100644 index 0000000..f0abbdf --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/gcode_step.py @@ -0,0 +1,242 @@ +""" +This page is in the table of contents. +Gcode step is an export plugin to convert gcode from float position to number of steps. + +An export plugin is a script in the export_plugins folder which has the getOutput function, the globalIsReplaceable variable and if it's output is not replaceable, the writeOutput function. It is meant to be run from the export tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin a lower case name. + +The getOutput function of this script takes a gcode text and returns it with the positions converted into number of steps. The writeOutput function of this script takes a gcode text and writes that with the positions converted into number of steps. + +==Settings== +===Add Feed Rate Even When Unchanging=== +Default is on. + +When selected, the feed rate will be added even when it did not change from the previous line. + +===Add Space Between Words=== +Default is on. + +When selected, a space will be added between each gcode word. + +===Add Z Even When Unchanging=== +Default is on. + +When selected, the z word will be added even when it did not change. + +===Feed Rate Step Length=== +Default is 0.1 millimeters/second. + +Defines the feed rate step length. + +===Offset=== +====X Offset==== +Default is zero. + +Defines the X Offset. + +====Y Offset==== +Default is zero. + +Defines the Y Offset. + +====Z Offset==== +Default is zero. + +Defines the Z Offset. + +===Step Length=== +====E Step Length==== +Default is 0.1 millimeters. + +Defines the E extrusion distance step length. + +===Radius Rate Step Length=== +Default is 0.1 millimeters/second. + +Defines the radius step length. + +====X Step Length==== +Default is 0.1 millimeters. + +Defines the X axis step length. + +====Y Step Length==== +Default is 0.1 millimeters. + +Defines the Y axis step length. + +====Z Step Length==== +Default is 0.01 millimeters. + +Defines the Z axis step length. + +""" + + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +from struct import Struct +import cStringIO +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +# This is true if the output is text and false if it is binary. +globalIsReplaceable = True + + +def getCharacterIntegerString(character, offset, splitLine, stepLength): + 'Get a character and integer string.' + floatValue = getFloatFromCharacterSplitLine(character, splitLine) + if floatValue == None: + return '' + floatValue += offset + integerValue = int(round(float(floatValue / stepLength))) + return character + str(integerValue) + +def getFloatFromCharacterSplitLine(character, splitLine): + 'Get the float after the first occurence of the character in the split line.' + lineFromCharacter = gcodec.getStringFromCharacterSplitLine(character, splitLine) + if lineFromCharacter == None: + return None + return float(lineFromCharacter) + +def getNewRepository(): + 'Get new repository.' + return GcodeStepRepository() + +def getOutput(gcodeText, repository=None): + 'Get the exported version of a gcode file.' + if gcodeText == '': + return '' + if repository == None: + repository = GcodeStepRepository() + settings.getReadRepository(repository) + return GcodeStepSkein().getCraftedGcode(repository, gcodeText) + +def writeOutput( fileName, gcodeText = ''): + 'Write the exported version of a gcode file.' + gcodeText = gcodec.getGcodeFileText(fileName, gcodeText) + repository = GcodeStepRepository() + settings.getReadRepository(repository) + output = getOutput(gcodeText, repository) + suffixFileName = fileName[: fileName.rfind('.')] + '_gcode_step.gcode' + archive.writeFileText(suffixFileName, output) + print('The converted file is saved as ' + archive.getSummarizedFileName(suffixFileName)) + + +class GcodeStepRepository: + 'A class to handle the export settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.export_plugins.gcode_step.html', self) + self.addFeedRateEvenWhenUnchanging = settings.BooleanSetting().getFromValue('Add Feed Rate Even When Unchanging', self, True) + self.addSpaceBetweenWords = settings.BooleanSetting().getFromValue('Add Space Between Words', self, True) + self.addZEvenWhenUnchanging = settings.BooleanSetting().getFromValue('Add Z Even When Unchanging', self, True) + self.fileNameInput = settings.FileNameInput().getFromFileName([('Gcode text files', '*.gcode')], 'Open File to be Converted to Gcode Step', self, '') + self.feedRateStepLength = settings.FloatSpin().getFromValue(0.0, 'Feed Rate Step Length (millimeters/second)', self, 1.0, 0.1) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Offset -', self ) + self.xOffset = settings.FloatSpin().getFromValue(-100.0, 'X Offset (millimeters)', self, 100.0, 0.0) + self.yOffset = settings.FloatSpin().getFromValue(-100.0, 'Y Offset (millimeters)', self, 100.0, 0.0) + self.zOffset = settings.FloatSpin().getFromValue(-10.0, 'Z Offset (millimeters)', self, 10.0, 0.0) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Step Length -', self ) + self.eStepLength = settings.FloatSpin().getFromValue(0.0, 'E Step Length (float)', self, 1.0, 0.1) + self.radiusStepLength = settings.FloatSpin().getFromValue(0.0, 'Radius Step Length (millimeters)', self, 1.0, 0.1) + self.xStepLength = settings.FloatSpin().getFromValue(0.0, 'X Step Length (millimeters)', self, 1.0, 0.1) + self.yStepLength = settings.FloatSpin().getFromValue(0.0, 'Y Step Length (millimeters)', self, 1.0, 0.1) + self.zStepLength = settings.FloatSpin().getFromValue(0.0, 'Z Step Length (millimeters)', self, 0.2, 0.01) + self.executeTitle = 'Convert to Gcode Step' + + def execute(self): + 'Convert to gcode step button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, ['.gcode'], self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class GcodeStepSkein: + 'A class to convert gcode into 16 byte binary segments.' + def __init__(self): + self.oldFeedRateString = None + self.oldZString = None + self.output = cStringIO.StringIO() + + def addCharacterInteger(self, character, lineStringIO, offset, splitLine, stepLength): + 'Add a character and integer to line string.' + characterIntegerString = getCharacterIntegerString(character, offset, splitLine, stepLength) + self.addStringToLine(lineStringIO, characterIntegerString) + + def addLine(self, line): + 'Add a line of text and a newline to the output.' + self.output.write(line + '\n') + + def addStringToLine(self, lineStringIO, wordString): + 'Add a character and integer to line string.' + if wordString == '': + return + if self.repository.addSpaceBetweenWords.value: + lineStringIO.write(' ') + lineStringIO.write(wordString) + + def getCraftedGcode(self, repository, gcodeText): + 'Parse gcode text and store the gcode.' + self.repository = repository + lines = archive.getTextLines(gcodeText) + for line in lines: + self.parseLine(line) + return self.output.getvalue() + + def parseLine(self, line): + 'Parse a gcode line.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if len(firstWord) < 1: + return + firstLetter = firstWord[0] + if firstLetter == '(': + return + if firstWord != 'G1' and firstWord != 'G2' and firstWord != 'G3': + self.addLine(line) + return + lineStringIO = cStringIO.StringIO() + lineStringIO.write(firstWord) + self.addCharacterInteger('I', lineStringIO, 0.0, splitLine, self.repository.xStepLength.value) + self.addCharacterInteger('J', lineStringIO, 0.0, splitLine, self.repository.yStepLength.value) + self.addCharacterInteger('R', lineStringIO, 0.0, splitLine, self.repository.radiusStepLength.value) + self.addCharacterInteger('X', lineStringIO, self.repository.xOffset.value, splitLine, self.repository.xStepLength.value) + self.addCharacterInteger('Y', lineStringIO, self.repository.yOffset.value, splitLine, self.repository.yStepLength.value) + zString = getCharacterIntegerString('Z', self.repository.zOffset.value, splitLine, self.repository.zStepLength.value) + feedRateString = getCharacterIntegerString('F', 0.0, splitLine, self.repository.feedRateStepLength.value) + if zString != '': + if zString != self.oldZString or self.repository.addZEvenWhenUnchanging.value: + self.addStringToLine(lineStringIO, zString) + if feedRateString != '': + if feedRateString != self.oldFeedRateString or self.repository.addFeedRateEvenWhenUnchanging.value: + self.addStringToLine(lineStringIO, feedRateString) + self.addCharacterInteger('E', lineStringIO, 0.0, splitLine, self.repository.eStepLength.value) + self.addLine(lineStringIO.getvalue()) + self.oldFeedRateString = feedRateString + self.oldZString = zString + + +def main(): + 'Display the export dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/gcode_time_segment.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/gcode_time_segment.py new file mode 100644 index 0000000..4a7e756 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/gcode_time_segment.py @@ -0,0 +1,245 @@ +""" +This page is in the table of contents. +Gcode time segment is an export plugin to convert gcode from float position to number of steps. + +An export plugin is a script in the export_plugins folder which has the getOutput function, the globalIsReplaceable variable and if it's output is not replaceable, the writeOutput function. It is meant to be run from the export tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin a lower case name. + +The getOutput function of this script takes a gcode text and returns it with the positions converted into number of steps and time. The writeOutput function of this script takes a gcode text and writes that with the positions converted into number of steps and time. + +==Settings== +===Add Space Between Words=== +Default is on. + +When selected, a space will be added between each gcode word. + +===Offset=== +====X Offset==== +Default is zero. + +Defines the X Offset. + +====Y Offset==== +Default is zero. + +Defines the Y Offset. + +====Z Offset==== +Default is zero. + +Defines the Z Offset. + +===Step=== +===Extrusion Step=== +Default is 0.01 mm. + +Defines the radius step length. + +===Time Step=== +Default is 1 microsecond(mcs). + +Defines the time step duration. + +====X Step==== +Default is 0.1 mm. + +Defines the X axis step length. + +====Y Step==== +Default is 0.1 mm. + +Defines the Y axis step length. + +====Z Step==== +Default is 0.01 mm. + +Defines the Z axis step length. + +""" + + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +from struct import Struct +import cStringIO +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +# This is true if the output is text and false if it is binary." +globalIsReplaceable = True + + +def getCharacterIntegerString( character, offset, splitLine, step ): + "Get a character and integer string." + floatValue = getFloatFromCharacterSplitLine(character, splitLine) + if floatValue == None: + return None + floatValue += offset + integerValue = int(round(float(floatValue / step))) + return character + str( integerValue ) + +def getFloatFromCharacterSplitLine(character, splitLine): + "Get the float after the first occurence of the character in the split line." + lineFromCharacter = gcodec.getStringFromCharacterSplitLine(character, splitLine) + if lineFromCharacter == None: + return None + return float(lineFromCharacter) + +def getNewRepository(): + 'Get new repository.' + return GcodeTimeSegmentRepository() + +def getOutput(gcodeText, repository=None): + 'Get the exported version of a gcode file.' + if gcodeText == '': + return '' + if repository == None: + repository = GcodeTimeSegmentRepository() + settings.getReadRepository(repository) + return GcodeTimeSegmentSkein().getCraftedGcode(gcodeText, repository) + +def writeOutput( fileName, gcodeText = ''): + "Write the exported version of a gcode file." + gcodeText = gcodec.getGcodeFileText(fileName, gcodeText) + repository = GcodeTimeSegmentRepository() + settings.getReadRepository(repository) + output = getOutput(gcodeText, repository) + suffixFileName = fileName[ : fileName.rfind('.') ] + '_gcode_time_segment.gcode' + archive.writeFileText( suffixFileName, output ) + print('The converted file is saved as ' + archive.getSummarizedFileName(suffixFileName) ) + + +class GcodeTimeSegmentRepository: + "A class to handle the export settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.export_plugins.gcode_time.html', self) + self.addSpaceBetweenWords = settings.BooleanSetting().getFromValue('Add Space Between Words', self, True ) + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File to be Converted to Gcode Time', self, '') + self.initialTime = settings.FloatSpin().getFromValue(0.0, 'Initial Time (s)', self, 20.0, 10.0) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Offset -', self ) + self.xOffset = settings.FloatSpin().getFromValue( - 100.0, 'X Offset (mm)', self, 100.0, 0.0 ) + self.yOffset = settings.FloatSpin().getFromValue( -100.0, 'Y Offset (mm)', self, 100.0, 0.0 ) + self.zOffset = settings.FloatSpin().getFromValue( - 10.0, 'Z Offset (mm)', self, 10.0, 0.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Step -', self ) + self.extrusionStep = settings.FloatSpin().getFromValue(0.0, 'Extrusion Step (mm)', self, 0.2, 0.01) + self.timeStep = settings.FloatSpin().getFromValue(0.0, 'Time Step (mcs)', self, 2000.0, 1000.0) + self.xStep = settings.FloatSpin().getFromValue(0.0, 'X Step (mm)', self, 1.0, 0.1) + self.yStep = settings.FloatSpin().getFromValue(0.0, 'Y Step (mm)', self, 1.0, 0.1) + self.zStep = settings.FloatSpin().getFromValue(0.0, 'Z Step (mm)', self, 0.2, 0.01) + settings.LabelSeparator().getFromRepository(self) + self.executeTitle = 'Convert to Gcode Time' + + def execute(self): + "Convert to gcode step button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, ['.gcode'], self.fileNameInput.wasCancelled ) + for fileName in fileNames: + writeOutput(fileName) + + +class GcodeTimeSegmentSkein: + "A class to convert gcode into time segments." + def __init__(self): + 'Initialize.' + self.feedRateMinute = None + self.isExtruderActive = False + self.oldFeedRateString = None + self.oldLocation = None + self.oldZString = None + self.operatingFlowRate = None + self.output = cStringIO.StringIO() + + def addCharacterInteger(self, character, lineStringIO, offset, splitLine, step): + "Add a character and integer to line string." + characterIntegerString = getCharacterIntegerString(character, offset, splitLine, step) + self.addStringToLine(lineStringIO, characterIntegerString) + + def addLine(self, line): + "Add a line of text and a newline to the output." + self.output.write(line + '\n') + + def addStringToLine( self, lineStringIO, wordString ): + "Add a character and integer to line string." + if wordString == None: + return + if self.repository.addSpaceBetweenWords.value: + lineStringIO.write(' ') + lineStringIO.write( wordString ) + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the gcode." + self.repository = repository + lines = archive.getTextLines(gcodeText) + for line in lines: + self.parseLine(line) + return self.output.getvalue() + + def parseLine(self, line): + "Parse a gcode line." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if len(firstWord) < 1: + return + firstLetter = firstWord[0] + if firstWord == '(': + self.feedRateMinute = 60.0 * float(splitLine[1]) + elif firstWord == '(': + self.operatingFlowRate = float(splitLine[1]) + self.flowRate = self.operatingFlowRate + if firstLetter == '(': + return + if firstWord == 'M101': + self.isExtruderActive = True + elif firstWord == 'M103': + self.isExtruderActive = False + elif firstWord == 'M108': + self.flowRate = float(splitLine[1][1 :]) + if firstWord != 'G1' and firstWord != 'G2' and firstWord != 'G3': + self.addLine(line) + return + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + lineStringIO = cStringIO.StringIO() + lineStringIO.write(firstWord) + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.addCharacterInteger('X', lineStringIO, self.repository.xOffset.value, splitLine, self.repository.xStep.value ) + self.addCharacterInteger('Y', lineStringIO, self.repository.yOffset.value, splitLine, self.repository.yStep.value ) + zString = getCharacterIntegerString('Z', self.repository.zOffset.value, splitLine, self.repository.zStep.value ) + if zString == None: + zString = self.oldZString + self.addStringToLine(lineStringIO, zString) + duration = self.repository.initialTime.value + if self.oldLocation != None: + distance = abs(location - self.oldLocation) + duration = 60.0 / self.feedRateMinute * distance + extrusionDistance = 0.0 + if self.isExtruderActive: + extrusionDistance = self.flowRate * duration + self.addStringToLine(lineStringIO, 'E%s' % int(round(extrusionDistance / self.repository.extrusionStep.value))) + self.addStringToLine(lineStringIO, 'D%s' % int(round(duration * 1000000.0 / self.repository.timeStep.value))) + self.addLine(lineStringIO.getvalue()) + self.oldLocation = location + self.oldZString = zString + + +def main(): + "Display the export dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/static_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/static_plugins/__init__.py new file mode 100644 index 0000000..b83e941 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/static_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 5 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/static_plugins/gcode_small.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/static_plugins/gcode_small.py new file mode 100644 index 0000000..3443777 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/export_plugins/static_plugins/gcode_small.py @@ -0,0 +1,110 @@ +""" +This page is in the table of contents. +Gcode_small is an export plugin to remove the comments and the redundant z and feed rate parameters from a gcode file. + +An export plugin is a script in the export_plugins folder which has the getOutput function, the globalIsReplaceable variable and if it's output is not replaceable, the writeOutput function. It is meant to be run from the export tool. To ensure that the plugin works on platforms which do not handle file capitalization properly, give the plugin a lower case name. + +The getOutput function of this script takes a gcode text and returns that text without comments and redundant z and feed rate parameters. The writeOutput function of this script takes a gcode text and writes that text without comments and redundant z and feed rate parameters to a file. + +Many of the functions in this script are copied from gcodec in skeinforge_utilities. They are copied rather than imported so developers making new plugins do not have to learn about gcodec, the code here is all they need to learn. + +""" + +from __future__ import absolute_import +import cStringIO +import os + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +# This is true if the output is text and false if it is binary." +globalIsReplaceable = True + + +def getIndexOfStartingWithSecond(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) ): + word = splitLine[ wordIndex ] + firstLetter = word[0] + if firstLetter == letter: + return wordIndex + return - 1 + +def getOutput(gcodeText): + 'Get the exported version of a gcode file.' + return GcodeSmallSkein().getCraftedGcode(gcodeText) + +def getSplitLineBeforeBracketSemicolon(line): + "Get the split line before a bracket or semicolon." + bracketSemicolonIndex = min( line.find(';'), line.find('(') ) + if bracketSemicolonIndex < 0: + return line.split() + return line[ : bracketSemicolonIndex ].split() + +def getStringFromCharacterSplitLine(character, splitLine): + "Get the string after the first occurence of the character in the split line." + indexOfCharacter = getIndexOfStartingWithSecond(character, splitLine) + if indexOfCharacter < 0: + 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 getTextLines(text): + "Get the all the lines of text of a text." + return text.replace('\r', '\n').split('\n') + + +class GcodeSmallSkein: + "A class to remove redundant z and feed rate parameters from a skein of extrusions." + def __init__(self): + self.lastFeedRateString = None + self.lastZString = None + self.output = cStringIO.StringIO() + + def getCraftedGcode( self, gcodeText ): + "Parse gcode text and store the gcode." + lines = getTextLines(gcodeText) + for line in lines: + self.parseLine(line) + return self.output.getvalue() + + def parseLine(self, line): + "Parse a gcode line." + splitLine = getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if len(firstWord) < 1: + return + if firstWord[0] == '(': + return + if firstWord != 'G1': + self.output.write(line + '\n') + return + eString = getStringFromCharacterSplitLine('E', splitLine ) + xString = getStringFromCharacterSplitLine('X', splitLine ) + yString = getStringFromCharacterSplitLine('Y', splitLine ) + zString = getStringFromCharacterSplitLine('Z', splitLine ) + feedRateString = getStringFromCharacterSplitLine('F', splitLine ) + self.output.write('G1') + if xString != None: + self.output.write(' X' + xString ) + if yString != None: + self.output.write(' Y' + yString ) + if zString != None and zString != self.lastZString: + self.output.write(' Z' + zString ) + if feedRateString != None and feedRateString != self.lastFeedRateString: + self.output.write(' F' + feedRateString ) + if eString != None: + self.output.write(' E' + eString ) + self.lastFeedRateString = feedRateString + self.lastZString = zString + self.output.write('\n') diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/feed.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/feed.py new file mode 100644 index 0000000..03c7593 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/feed.py @@ -0,0 +1,183 @@ +""" +This page is in the table of contents. +The feed script sets the maximum feed rate, operating feed rate & travel feed rate. + +==Operation== +The default 'Activate Feed' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Feed Rate=== +Default is 16 millimeters/second. + +Defines the feed rate for the shape. + +===Maximum Z Drill Feed Rate=== +Default is 0.1 millimeters/second. + +If your firmware limits the z feed rate, you do not need to set this setting. + +Defines the maximum feed that the tool head will move in the z direction while the tool is on. + +===Maximum Z Feed Rate=== +Default is one millimeter per second. + +Defines the maximum speed that the tool head will move in the z direction. + +===Travel Feed Rate=== +Default is 16 millimeters/second. + +Defines the feed rate when the cutter is off. The travel feed rate could be set as high as the cutter can be moved, it does not have to be limited by the maximum cutter rate. + +==Examples== +The following examples feed the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and feed.py. + +> python feed.py +This brings up the feed dialog. + +> python feed.py Screw Holder Bottom.stl +The feed tool is parsing the file: +Screw Holder Bottom.stl +.. +The feed tool has created the file: +.. Screw Holder Bottom_feed.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, gcodeText='', repository=None): + "Feed the file or text." + return getCraftedTextFromText( archive.getTextIfEmpty( fileName, gcodeText ), repository ) + +def getCraftedTextFromText(gcodeText, repository=None): + "Feed a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty(gcodeText, 'feed'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(FeedRepository()) + if not repository.activateFeed.value: + return gcodeText + return FeedSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return FeedRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Feed a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'feed', shouldAnalyze) + + +class FeedRepository: + "A class to handle the feed settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.feed.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName(fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Feed', self, '') + self.activateFeed = settings.BooleanSetting().getFromValue('Activate Feed', self, True) + self.feedRatePerSecond = settings.FloatSpin().getFromValue(2.0, 'Feed Rate (mm/s):', self, 50.0, 16.0) + self.maximumZDrillFeedRatePerSecond = settings.FloatSpin().getFromValue(0.02, 'Maximum Z Drill Feed Rate (mm/s):', self, 0.5, 0.1) + self.maximumZFeedRatePerSecond = settings.FloatSpin().getFromValue(0.5, 'Maximum Z Feed Rate (mm/s):', self, 10.0, 1.0) + self.travelFeedRatePerSecond = settings.FloatSpin().getFromValue(2.0, 'Travel Feed Rate (mm/s):', self, 50.0, 16.0) + self.executeTitle = 'Feed' + + def execute(self): + "Feed button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class FeedSkein: + "A class to feed a skein of cuttings." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRatePerSecond = 16.0 + self.isExtruderActive = False + self.lineIndex = 0 + self.lines = None + self.oldFlowrateString = None + self.oldLocation = None + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the feed gcode." + self.repository = repository + self.feedRatePerSecond = repository.feedRatePerSecond.value + self.travelFeedRateMinute = 60.0 * self.repository.travelFeedRatePerSecond.value + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getFeededLine(self, line, splitLine): + "Get gcode line with feed rate." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.oldLocation = location + feedRateMinute = 60.0 * self.feedRatePerSecond + if not self.isExtruderActive: + feedRateMinute = self.travelFeedRateMinute + return self.distanceFeedRate.getLineWithFeedRate(feedRateMinute, line, splitLine) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('feed') + return + elif firstWord == '(': + self.absolutePerimeterWidth = abs(float(splitLine[1])) + self.distanceFeedRate.addTagBracketedLine('maximumZDrillFeedRatePerSecond', self.repository.maximumZDrillFeedRatePerSecond.value) + self.distanceFeedRate.addTagBracketedLine('maximumZFeedRatePerSecond', self.repository.maximumZFeedRatePerSecond.value ) + self.distanceFeedRate.addTagBracketedLine('operatingFeedRatePerSecond', self.feedRatePerSecond) + self.distanceFeedRate.addTagBracketedLine('travelFeedRatePerSecond', self.repository.travelFeedRatePerSecond.value) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the feed skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + line = self.getFeededLine(line, splitLine) + elif firstWord == 'M101': + self.isExtruderActive = True + elif firstWord == 'M103': + self.isExtruderActive = False + self.distanceFeedRate.addLine(line) + + +def main(): + 'Display the feed dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py new file mode 100644 index 0000000..94bd00b --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fill.py @@ -0,0 +1,1382 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Fill is a script to fill the perimeters of a gcode file. + +The fill manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Fill + +Allan Ecker aka The Masked Retriever has written the "Skeinforge Quicktip: Fill" at: +http://blog.thingiverse.com/2009/07/21/mysteries-of-skeinforge-fill/ + +==Operation== +The default 'Activate Fill' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Diaphragm=== +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. + +====Diaphragm Period==== +Default is one hundred. + +Defines the number of layers between diaphrams. + +====Diaphragm Thickness==== +Default is zero, because the diaphragm feature is rarely used. + +Defines the number of layers the diaphram is composed of. + +===Extra Shells=== +The shells interior perimeter loops. Adding extra shells makes the object stronger & heavier. + +====Extra Shells on Alternating Solid Layers==== +Default is two. + +Defines the number of extra shells, on the alternating solid layers. + +====Extra Shells on Base==== +Default is one. + +Defines the number of extra shells on the bottom, base layer and every even solid layer after that. Setting this to a different value than the "Extra Shells on Alternating Solid Layers" means the infill pattern will alternate, creating a strong interleaved bond even if the perimeter loop shrinks. + +====Extra Shells on Sparse Layer==== +Default is one. + +Defines the number of extra shells on the sparse layers. The solid layers are those at the top & bottom, and wherever the object has a plateau or overhang, the sparse layers are the layers in between. + +===Grid=== +====Grid Circle Separation over Perimeter Width==== +Default is 0.2. + +Defines the ratio of the amount the grid circle is inset over the perimeter width, the default is zero. With a value of zero the circles will touch, with a value of one two threads could be fitted between the circles. + +====Grid Extra Overlap==== +Default is 0.1. + +Defines the amount of extra overlap added when extruding the grid to compensate for the fact that when the first thread going through a grid point is extruded, since there is nothing there yet for it to connect to it will shrink extra. + +====Grid Junction Separation over Octogon Radius At End==== +Default is zero. + +Defines the ratio of the amount the grid square is increased in each direction over the extrusion width at the end. With a value of one or so the grid pattern will have large squares to go with the octogons. + +====Grid Junction Separation over Octogon Radius At Middle==== +Default is zero. + +Defines the increase at the middle. If this value is different than the value at the end, the grid would have an accordion pattern, which would give it a higher shear strength. + +====Grid Junction Separation Band Height==== +Default is ten. + +Defines the height of the bands of the accordion pattern. + +===Infill=== +====Infill Pattern==== +Default is 'Line', since it is quicker to generate and does not add extra movements for the extruder. The grid pattern has extra diagonal lines, so when choosing a grid option, set the infill solidity to 0.2 or less so that there is not too much plastic and the grid generation time, which increases with the third power of solidity, will be reasonable. + +=====Grid Circular===== +When selected, the infill will be a grid of separated circles. Because the circles are separated, the pattern is weak, it only provides support for the top layer threads and some strength in the z direction. The flip side is that this infill does not warp the object, the object will get warped only by the walls. + +Because this pattern turns the extruder on and off often, it is best to use a stepper motor extruder. + +=====Grid Hexagonal===== +When selected, the infill will be a hexagonal grid. Because the grid is made with threads rather than with molding or milling, only a partial hexagon is possible, so the rectangular grid pattern is stronger. + +=====Grid Rectangular===== +When selected, the infill will be a funky octogon square honeycomb like pattern which gives the object extra strength. + +=====Line===== +When selected, the infill will be made up of lines. + +====Infill Begin Rotation==== +Default is forty five degrees, giving a diagonal infill. + +Defines the amount the infill direction of the base and every second layer thereafter is rotated. + +====Infill Odd Layer Extra Rotation==== +Default is ninety degrees, making the odd layer infill perpendicular to the base layer. + +Defines the extra amount the infill direction of the odd layers is rotated compared to the base layer. + +====Infill Begin Rotation Repeat==== +Default is one, giving alternating cross hatching. + +Defines the number of layers that the infill begin rotation will repeat. With a value higher than one, the infill will go in one direction more often, giving the object more strength in one direction and less in the other, this is useful for beams and cantilevers. + +====Infill Perimeter Overlap==== +Default is 0.15. + +Defines the amount the infill overlaps the perimeter over the average of the perimeter and infill 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, also when it is above 0.45 fill may not be able to create infill correctly. If you want to stretch the infill a lot, set 'Path Stretch over Perimeter Width' in stretch to a high value. + +====Infill Solidity==== +Default is 0.2. + +Defines the solidity of the infill, this is the most important setting in fill. A value of one means the infill lines will be right beside each other, resulting in a solid, strong, heavy shape which takes a long time to extrude. A low value means the infill will be sparse, the interior will be mosty empty space, the object will be weak, light and quick to build. + +====Infill Width over Thickness==== +Default is 1.5. + +Defines the ratio of the infill width over the layer thickness. The higher the value the wider apart the infill will be and therefore the sparser the infill will be. + +===Solid Surface Thickness=== +Default is three. + +Defines the number of solid layers that are at the bottom, top, plateaus and overhang. With a value of zero, the entire object will be composed of a sparse infill, and water could flow right through it. With a value of one, water will leak slowly through the surface and with a value of three, the object could be watertight. The higher the solid surface thickness, the stronger and heavier the object will be. + +===Start From Choice=== +Default is 'Lower Left'. + +Defines where each layer starts from. + +====Lower Left==== +When selected the layer will start from the lower left corner. This is to extrude in round robin fashion so that the first extrusion will be deposited on the coolest part of the last layer. The reason for this is described at: +http://hydraraptor.blogspot.com/2010/12/round-robin.html + +====Nearest==== +When selected the layer will start from the nearest point to the end of the last layer. This leads to less stringing, but the first extrusion will be deposited on the hottest part of the last layer which leads to melting problems. So this option is deprecated, eventually this option will be removed and the layers will always start from the lower left. + +===Thread Sequence Choice=== +The 'Thread Sequence Choice' is the sequence in which the threads will be extruded on the second and higher layers. There are three kinds of thread, the perimeter threads on the outside of the object, the loop threads aka inner shell threads, and the interior infill threads. The first layer thread sequence is 'Perimeter > Loops > Infill'. + +The default choice is 'Perimeter > Loops > Infill', which the default stretch parameters are based on. If you change from the default sequence choice setting of perimeter, then loops, then infill, the optimal stretch thread parameters would also be different. In general, if the infill is extruded first, the infill would have to be stretched more so that even after the filament shrinkage, it would still be long enough to connect to the loop or perimeter. The six sequence combinations follow below. + +====Infill > Loops > Perimeter==== +====Infill > Perimeter > Loops==== +====Loops > Infill > Perimeter==== +====Loops > Perimeter > Infill==== +====Perimeter > Infill > Loops==== +====Perimeter > Loops > Infill==== + +==Examples== +The following examples fill the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and fill.py. + +> python fill.py +This brings up the fill dialog. + +> python fill.py Screw Holder Bottom.stl +The fill tool is parsing the file: +Screw Holder Bottom.stl +.. +The fill tool has created the file: +.. Screw Holder Bottom_fill.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/28/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + + +def addAroundGridPoint( arounds, gridPoint, gridPointInsetX, gridPointInsetY, gridPoints, gridSearchRadius, isBothOrNone, isDoubleJunction, isJunctionWide, paths, pixelTable, width ): + 'Add the path around the grid point.' + closestPathIndex = None + aroundIntersectionPaths = [] + for aroundIndex in xrange( len(arounds) ): + loop = arounds[ aroundIndex ] + for pointIndex in xrange(len(loop)): + pointFirst = loop[pointIndex] + pointSecond = loop[(pointIndex + 1) % len(loop)] + yIntersection = euclidean.getYIntersectionIfExists( pointFirst, pointSecond, gridPoint.real ) + addYIntersectionPathToList( aroundIndex, pointIndex, gridPoint.imag, yIntersection, aroundIntersectionPaths ) + if len( aroundIntersectionPaths ) < 2: + print('This should never happen, aroundIntersectionPaths is less than 2 in fill.') + print( aroundIntersectionPaths ) + print( gridPoint ) + return + yCloseToCenterArounds = getClosestOppositeIntersectionPaths( aroundIntersectionPaths ) + if len( yCloseToCenterArounds ) < 2: +# This used to be worth the warning below. +# print('This should never happen, yCloseToCenterArounds is less than 2 in fill.') +# print( gridPoint ) +# print( len( yCloseToCenterArounds ) ) + return + segmentFirstY = min( yCloseToCenterArounds[0].y, yCloseToCenterArounds[1].y ) + segmentSecondY = max( yCloseToCenterArounds[0].y, yCloseToCenterArounds[1].y ) + yIntersectionPaths = [] + gridPixel = euclidean.getStepKeyFromPoint( gridPoint / width ) + segmentFirstPixel = euclidean.getStepKeyFromPoint( complex( gridPoint.real, segmentFirstY ) / width ) + segmentSecondPixel = euclidean.getStepKeyFromPoint( complex( gridPoint.real, segmentSecondY ) / width ) + pathIndexTable = {} + addPathIndexFirstSegment( gridPixel, pathIndexTable, pixelTable, segmentFirstPixel ) + addPathIndexSecondSegment( gridPixel, pathIndexTable, pixelTable, segmentSecondPixel ) + for pathIndex in pathIndexTable.keys(): + path = paths[ pathIndex ] + for pointIndex in xrange( len(path) - 1 ): + pointFirst = path[pointIndex] + pointSecond = path[pointIndex + 1] + yIntersection = getYIntersectionInsideYSegment( segmentFirstY, segmentSecondY, pointFirst, pointSecond, gridPoint.real ) + addYIntersectionPathToList( pathIndex, pointIndex, gridPoint.imag, yIntersection, yIntersectionPaths ) + if len( yIntersectionPaths ) < 1: + return + yCloseToCenterPaths = [] + if isDoubleJunction: + yCloseToCenterPaths = getClosestOppositeIntersectionPaths( yIntersectionPaths ) + else: + yIntersectionPaths.sort( compareDistanceFromCenter ) + yCloseToCenterPaths = [ yIntersectionPaths[0] ] + for yCloseToCenterPath in yCloseToCenterPaths: + setIsOutside( yCloseToCenterPath, aroundIntersectionPaths ) + if len( yCloseToCenterPaths ) < 2: + yCloseToCenterPaths[0].gridPoint = gridPoint + insertGridPointPair( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, paths, pixelTable, yCloseToCenterPaths[0], width ) + return + plusMinusSign = getPlusMinusSign( yCloseToCenterPaths[1].y - yCloseToCenterPaths[0].y ) + yCloseToCenterPaths[0].gridPoint = complex( gridPoint.real, gridPoint.imag - plusMinusSign * gridPointInsetY ) + yCloseToCenterPaths[1].gridPoint = complex( gridPoint.real, gridPoint.imag + plusMinusSign * gridPointInsetY ) + yCloseToCenterPaths.sort( comparePointIndexDescending ) + insertGridPointPairs( gridPoint, gridPointInsetX, gridPoints, yCloseToCenterPaths[0], yCloseToCenterPaths[1], isBothOrNone, isJunctionWide, paths, pixelTable, width ) + +def addInfillBoundary(infillBoundary, nestedRings): + 'Add infill boundary to the nested ring that contains it.' + infillPoint = infillBoundary[0] + for nestedRing in nestedRings: + if euclidean.isPointInsideLoop(nestedRing.boundary, infillPoint): + nestedRing.infillBoundaries.append(infillBoundary) + return + +def addLoop(infillWidth, infillPaths, loop, rotationPlaneAngle): + 'Add simplified path to fill.' + simplifiedLoop = euclidean.getSimplifiedLoop(loop, infillWidth) + if len(simplifiedLoop) < 2: + return + simplifiedLoop.append(simplifiedLoop[0]) + planeRotated = euclidean.getRotatedComplexes(rotationPlaneAngle, simplifiedLoop) + infillPaths.append(planeRotated) + +def addPath(infillWidth, infillPaths, path, rotationPlaneAngle): + 'Add simplified path to fill.' + simplifiedPath = euclidean.getSimplifiedPath(path, infillWidth) + if len(simplifiedPath) < 2: + return + planeRotated = euclidean.getRotatedComplexes(rotationPlaneAngle, simplifiedPath) + infillPaths.append(planeRotated) + +def addPathIndexFirstSegment( gridPixel, pathIndexTable, pixelTable, segmentFirstPixel ): + 'Add the path index of the closest segment found toward the second segment.' + for yStep in xrange( gridPixel[1], segmentFirstPixel[1] - 1, - 1 ): + if getKeyIsInPixelTableAddValue( ( gridPixel[0], yStep ), pathIndexTable, pixelTable ): + return + +def addPathIndexSecondSegment( gridPixel, pathIndexTable, pixelTable, segmentSecondPixel ): + 'Add the path index of the closest segment found toward the second segment.' + for yStep in xrange( gridPixel[1], segmentSecondPixel[1] + 1 ): + if getKeyIsInPixelTableAddValue( ( gridPixel[0], yStep ), pathIndexTable, pixelTable ): + return + +def addPointOnPath( path, pathIndex, pixelTable, point, pointIndex, width ): + 'Add a point to a path and the pixel table.' + pointIndexMinusOne = pointIndex - 1 + if pointIndex < len(path) and pointIndexMinusOne >= 0: + segmentTable = {} + begin = path[ pointIndexMinusOne ] + end = path[pointIndex] + euclidean.addValueSegmentToPixelTable( begin, end, segmentTable, pathIndex, width ) + euclidean.removePixelTableFromPixelTable( segmentTable, pixelTable ) + if pointIndexMinusOne >= 0: + begin = path[ pointIndexMinusOne ] + euclidean.addValueSegmentToPixelTable( begin, point, pixelTable, pathIndex, width ) + if pointIndex < len(path): + end = path[pointIndex] + euclidean.addValueSegmentToPixelTable( point, end, pixelTable, pathIndex, width ) + path.insert( pointIndex, point ) + +def addPointOnPathIfFree( path, pathIndex, pixelTable, point, pointIndex, width ): + 'Add the closest point to a path, if the point added to a path is free.' + if isAddedPointOnPathFree( path, pixelTable, point, pointIndex, width ): + addPointOnPath( path, pathIndex, pixelTable, point, pointIndex, width ) + +def addSparseEndpoints(doubleInfillWidth, endpoints, horizontalSegmentsDictionary, horizontalSegmentsDictionaryKey, infillSolidity, removedEndpoints, solidSurfaceThickness, surroundingXIntersections): + 'Add sparse endpoints.' + segments = horizontalSegmentsDictionary[horizontalSegmentsDictionaryKey] + for segment in segments: + addSparseEndpointsFromSegment(doubleInfillWidth, endpoints, horizontalSegmentsDictionary, horizontalSegmentsDictionaryKey, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections) + +def addSparseEndpointsFromSegment(doubleInfillWidth, endpoints, horizontalSegmentsDictionary, horizontalSegmentsDictionaryKey, infillSolidity, removedEndpoints, segment, solidSurfaceThickness, surroundingXIntersections): + 'Add sparse endpoints from a segment.' + if infillSolidity > 0.0: + if int(round(round(float(horizontalSegmentsDictionaryKey) * infillSolidity) / infillSolidity)) == horizontalSegmentsDictionaryKey: + endpoints += segment + return + if abs(segment[0].point - segment[1].point) < doubleInfillWidth: + endpoints += segment + return + if not isSegmentAround(horizontalSegmentsDictionary, horizontalSegmentsDictionaryKey - 1, segment): + endpoints += segment + return + if not isSegmentAround(horizontalSegmentsDictionary, horizontalSegmentsDictionaryKey + 1, segment): + endpoints += segment + return + if solidSurfaceThickness == 0: + removedEndpoints += segment + return + if isSegmentCompletelyInAnIntersection(segment, surroundingXIntersections): + removedEndpoints += segment + return + endpoints += segment + +def addYIntersectionPathToList( pathIndex, pointIndex, y, yIntersection, yIntersectionPaths ): + 'Add the y intersection path to the y intersection paths.' + if yIntersection == None: + return + yIntersectionPath = YIntersectionPath( pathIndex, pointIndex, yIntersection ) + yIntersectionPath.yMinusCenter = yIntersection - y + yIntersectionPaths.append( yIntersectionPath ) + +def compareDistanceFromCenter(self, other): + 'Get comparison in order to sort y intersections in ascending order of distance from the center.' + distanceFromCenter = abs( self.yMinusCenter ) + distanceFromCenterOther = abs( other.yMinusCenter ) + if distanceFromCenter > distanceFromCenterOther: + return 1 + if distanceFromCenter < distanceFromCenterOther: + return - 1 + return 0 + +def comparePointIndexDescending(self, other): + 'Get comparison in order to sort y intersections in descending order of point index.' + if self.pointIndex > other.pointIndex: + return - 1 + if self.pointIndex < other.pointIndex: + return 1 + return 0 + +def createExtraFillLoops(nestedRing, radius, shouldExtraLoopsBeAdded): + 'Create extra fill loops.' + for innerNestedRing in nestedRing.innerNestedRings: + createFillForSurroundings(innerNestedRing.innerNestedRings, radius, shouldExtraLoopsBeAdded) + allFillLoops = getExtraFillLoops(nestedRing.getLoopsToBeFilled(), radius) + if len(allFillLoops) < 1: + return + if shouldExtraLoopsBeAdded: + nestedRing.extraLoops += allFillLoops + nestedRing.penultimateFillLoops = nestedRing.lastFillLoops + nestedRing.lastFillLoops = allFillLoops + +def createFillForSurroundings(nestedRings, radius, shouldExtraLoopsBeAdded): + 'Create extra fill loops for nested rings.' + for nestedRing in nestedRings: + createExtraFillLoops(nestedRing, radius, shouldExtraLoopsBeAdded) + +def getAdditionalLength( path, point, pointIndex ): + 'Get the additional length added by inserting a point into a path.' + if pointIndex == 0: + return abs( point - path[0] ) + if pointIndex == len(path): + return abs( point - path[-1] ) + return abs( point - path[pointIndex - 1] ) + abs( point - path[pointIndex] ) - abs( path[pointIndex] - path[pointIndex - 1] ) + +def getClosestOppositeIntersectionPaths( yIntersectionPaths ): + 'Get the close to center paths, starting with the first and an additional opposite if it exists.' + yIntersectionPaths.sort( compareDistanceFromCenter ) + beforeFirst = yIntersectionPaths[0].yMinusCenter < 0.0 + yCloseToCenterPaths = [ yIntersectionPaths[0] ] + for yIntersectionPath in yIntersectionPaths[1 :]: + beforeSecond = yIntersectionPath.yMinusCenter < 0.0 + if beforeFirst != beforeSecond: + yCloseToCenterPaths.append( yIntersectionPath ) + return yCloseToCenterPaths + return yCloseToCenterPaths + +def getCraftedText( fileName, gcodeText = '', repository=None): + 'Fill the inset file or gcode text.' + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, gcodeText), repository ) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Fill the inset gcode text.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'fill'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( FillRepository() ) + if not repository.activateFill.value: + return gcodeText + return FillSkein().getCraftedGcode( repository, gcodeText ) + +def getExtraFillLoops(loops, radius): + 'Get extra loops between inside and outside loops.' + if radius == 0.0: + return loops + greaterThanRadius = 1.4 * radius + extraFillLoops = [] + centers = intercircle.getCentersFromPoints(intercircle.getPointsFromLoops(loops, greaterThanRadius), greaterThanRadius) + for center in centers: + inset = intercircle.getSimplifiedInsetFromClockwiseLoop(center, radius) + if intercircle.isLargeSameDirection(inset, center, radius): + if euclidean.getIsInFilledRegion(loops, euclidean.getLeftPoint(inset)): + inset.reverse() + extraFillLoops.append(inset) + return extraFillLoops + +def getKeyIsInPixelTableAddValue( key, pathIndexTable, pixelTable ): + 'Determine if the key is in the pixel table, and if it is and if the value is not None add it to the path index table.' + if key in pixelTable: + value = pixelTable[key] + if value != None: + pathIndexTable[value] = None + return True + return False + +def getLowerLeftCorner(nestedRings): + 'Get the lower left corner from the nestedRings.' + lowerLeftCorner = Vector3() + lowestRealPlusImaginary = 987654321.0 + for nestedRing in nestedRings: + for point in nestedRing.boundary: + realPlusImaginary = point.real + point.imag + if realPlusImaginary < lowestRealPlusImaginary: + lowestRealPlusImaginary = realPlusImaginary + lowerLeftCorner.setToXYZ(point.real, point.imag, nestedRing.z) + return lowerLeftCorner + +def getNewRepository(): + 'Get new repository.' + return FillRepository() + +def getNonIntersectingGridPointLine( gridPointInsetX, isJunctionWide, paths, pixelTable, yIntersectionPath, width ): + 'Get the points around the grid point that is junction wide that do not intersect.' + pointIndexPlusOne = yIntersectionPath.getPointIndexPlusOne() + path = yIntersectionPath.getPath(paths) + begin = path[ yIntersectionPath.pointIndex ] + end = path[ pointIndexPlusOne ] + plusMinusSign = getPlusMinusSign( end.real - begin.real ) + if isJunctionWide: + gridPointXFirst = complex( yIntersectionPath.gridPoint.real - plusMinusSign * gridPointInsetX, yIntersectionPath.gridPoint.imag ) + gridPointXSecond = complex( yIntersectionPath.gridPoint.real + plusMinusSign * gridPointInsetX, yIntersectionPath.gridPoint.imag ) + if isAddedPointOnPathFree( path, pixelTable, gridPointXSecond, pointIndexPlusOne, width ): + if isAddedPointOnPathFree( path, pixelTable, gridPointXFirst, pointIndexPlusOne, width ): + return [ gridPointXSecond, gridPointXFirst ] + if isAddedPointOnPathFree( path, pixelTable, yIntersectionPath.gridPoint, pointIndexPlusOne, width ): + return [ gridPointXSecond, yIntersectionPath.gridPoint ] + return [ gridPointXSecond ] + if isAddedPointOnPathFree( path, pixelTable, yIntersectionPath.gridPoint, pointIndexPlusOne, width ): + return [ yIntersectionPath.gridPoint ] + return [] + +def getPlusMinusSign(number): + 'Get one if the number is zero or positive else negative one.' + if number >= 0.0: + return 1.0 + return - 1.0 + +def getWithLeastLength( path, point ): + 'Insert a point into a path, at the index at which the path would be shortest.' + if len(path) < 1: + return 0 + shortestPointIndex = None + shortestAdditionalLength = 999999999987654321.0 + for pointIndex in xrange( len(path) + 1 ): + additionalLength = getAdditionalLength( path, point, pointIndex ) + if additionalLength < shortestAdditionalLength: + shortestAdditionalLength = additionalLength + shortestPointIndex = pointIndex + return shortestPointIndex + +def getYIntersectionInsideYSegment( segmentFirstY, segmentSecondY, beginComplex, endComplex, x ): + 'Get the y intersection inside the y segment if it does, else none.' + yIntersection = euclidean.getYIntersectionIfExists( beginComplex, endComplex, x ) + if yIntersection == None: + return None + if yIntersection < min( segmentFirstY, segmentSecondY ): + return None + if yIntersection <= max( segmentFirstY, segmentSecondY ): + return yIntersection + return None + +def insertGridPointPair( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, paths, pixelTable, yIntersectionPath, width ): + 'Insert a pair of points around the grid point is is junction wide, otherwise inset one point.' + linePath = getNonIntersectingGridPointLine( gridPointInsetX, isJunctionWide, paths, pixelTable, yIntersectionPath, width ) + insertGridPointPairWithLinePath( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, linePath, paths, pixelTable, yIntersectionPath, width ) + +def insertGridPointPairs( gridPoint, gridPointInsetX, gridPoints, intersectionPathFirst, intersectionPathSecond, isBothOrNone, isJunctionWide, paths, pixelTable, width ): + 'Insert a pair of points around a pair of grid points.' + gridPointLineFirst = getNonIntersectingGridPointLine( gridPointInsetX, isJunctionWide, paths, pixelTable, intersectionPathFirst, width ) + if len( gridPointLineFirst ) < 1: + if isBothOrNone: + return + intersectionPathSecond.gridPoint = gridPoint + insertGridPointPair( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, paths, pixelTable, intersectionPathSecond, width ) + return + gridPointLineSecond = getNonIntersectingGridPointLine( gridPointInsetX, isJunctionWide, paths, pixelTable, intersectionPathSecond, width ) + if len( gridPointLineSecond ) > 0: + insertGridPointPairWithLinePath( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, gridPointLineFirst, paths, pixelTable, intersectionPathFirst, width ) + insertGridPointPairWithLinePath( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, gridPointLineSecond, paths, pixelTable, intersectionPathSecond, width ) + return + if isBothOrNone: + return + originalGridPointFirst = intersectionPathFirst.gridPoint + intersectionPathFirst.gridPoint = gridPoint + gridPointLineFirstCenter = getNonIntersectingGridPointLine( gridPointInsetX, isJunctionWide, paths, pixelTable, intersectionPathFirst, width ) + if len( gridPointLineFirstCenter ) > 0: + insertGridPointPairWithLinePath( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, gridPointLineFirstCenter, paths, pixelTable, intersectionPathFirst, width ) + return + intersectionPathFirst.gridPoint = originalGridPointFirst + insertGridPointPairWithLinePath( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, gridPointLineFirst, paths, pixelTable, intersectionPathFirst, width ) + +def insertGridPointPairWithLinePath( gridPoint, gridPointInsetX, gridPoints, isJunctionWide, linePath, paths, pixelTable, yIntersectionPath, width ): + 'Insert a pair of points around the grid point is is junction wide, otherwise inset one point.' + if len( linePath ) < 1: + return + if gridPoint in gridPoints: + gridPoints.remove( gridPoint ) + intersectionBeginPoint = None + moreThanInset = 2.1 * gridPointInsetX + path = yIntersectionPath.getPath(paths) + begin = path[ yIntersectionPath.pointIndex ] + end = path[ yIntersectionPath.getPointIndexPlusOne() ] + if yIntersectionPath.isOutside: + distanceX = end.real - begin.real + if abs( distanceX ) > 2.1 * moreThanInset: + intersectionBeginXDistance = yIntersectionPath.gridPoint.real - begin.real + endIntersectionXDistance = end.real - yIntersectionPath.gridPoint.real + intersectionPoint = begin * endIntersectionXDistance / distanceX + end * intersectionBeginXDistance / distanceX + distanceYAbsoluteInset = max( abs( yIntersectionPath.gridPoint.imag - intersectionPoint.imag ), moreThanInset ) + intersectionEndSegment = end - intersectionPoint + intersectionEndSegmentLength = abs( intersectionEndSegment ) + if intersectionEndSegmentLength > 1.1 * distanceYAbsoluteInset: + intersectionEndPoint = intersectionPoint + intersectionEndSegment * distanceYAbsoluteInset / intersectionEndSegmentLength + path.insert( yIntersectionPath.getPointIndexPlusOne(), intersectionEndPoint ) + intersectionBeginSegment = begin - intersectionPoint + intersectionBeginSegmentLength = abs( intersectionBeginSegment ) + if intersectionBeginSegmentLength > 1.1 * distanceYAbsoluteInset: + intersectionBeginPoint = intersectionPoint + intersectionBeginSegment * distanceYAbsoluteInset / intersectionBeginSegmentLength + for point in linePath: + addPointOnPath( path, yIntersectionPath.pathIndex, pixelTable, point, yIntersectionPath.getPointIndexPlusOne(), width ) + if intersectionBeginPoint != None: + addPointOnPath( path, yIntersectionPath.pathIndex, pixelTable, intersectionBeginPoint, yIntersectionPath.getPointIndexPlusOne(), width ) + +def isAddedPointOnPathFree( path, pixelTable, point, pointIndex, width ): + 'Determine if the point added to a path is intersecting the pixel table or the path.' + if pointIndex > 0 and pointIndex < len(path): + if isSharpCorner( ( path[pointIndex - 1] ), point, ( path[pointIndex] ) ): + return False + pointIndexMinusOne = pointIndex - 1 + if pointIndexMinusOne >= 0: + maskTable = {} + begin = path[ pointIndexMinusOne ] + if pointIndex < len(path): + end = path[pointIndex] + euclidean.addValueSegmentToPixelTable( begin, end, maskTable, None, width ) + segmentTable = {} + euclidean.addSegmentToPixelTable( point, begin, segmentTable, 0.0, 2.0, width ) + if euclidean.isPixelTableIntersecting( pixelTable, segmentTable, maskTable ): + return False + if isAddedPointOnPathIntersectingPath( begin, path, point, pointIndexMinusOne ): + return False + if pointIndex < len(path): + maskTable = {} + begin = path[pointIndex] + if pointIndexMinusOne >= 0: + end = path[ pointIndexMinusOne ] + euclidean.addValueSegmentToPixelTable( begin, end, maskTable, None, width ) + segmentTable = {} + euclidean.addSegmentToPixelTable( point, begin, segmentTable, 0.0, 2.0, width ) + if euclidean.isPixelTableIntersecting( pixelTable, segmentTable, maskTable ): + return False + if isAddedPointOnPathIntersectingPath( begin, path, point, pointIndex ): + return False + return True + +def isAddedPointOnPathIntersectingPath( begin, path, point, pointIndex ): + 'Determine if the point added to a path is intersecting the path by checking line intersection.' + segment = point - begin + segmentLength = abs(segment) + if segmentLength <= 0.0: + return False + normalizedSegment = segment / segmentLength + segmentYMirror = complex(normalizedSegment.real, -normalizedSegment.imag) + pointRotated = segmentYMirror * point + beginRotated = segmentYMirror * begin + if euclidean.isXSegmentIntersectingPath( path[ max( 0, pointIndex - 20 ) : pointIndex ], pointRotated.real, beginRotated.real, segmentYMirror, pointRotated.imag ): + return True + return euclidean.isXSegmentIntersectingPath( path[ pointIndex + 1 : pointIndex + 21 ], pointRotated.real, beginRotated.real, segmentYMirror, pointRotated.imag ) + +def isIntersectingLoopsPaths( loops, paths, pointBegin, pointEnd ): + 'Determine if the segment between the first and second point is intersecting the loop list.' + normalizedSegment = pointEnd.dropAxis() - pointBegin.dropAxis() + normalizedSegmentLength = abs( normalizedSegment ) + if normalizedSegmentLength == 0.0: + return False + normalizedSegment /= normalizedSegmentLength + segmentYMirror = complex(normalizedSegment.real, -normalizedSegment.imag) + pointBeginRotated = euclidean.getRoundZAxisByPlaneAngle( segmentYMirror, pointBegin ) + pointEndRotated = euclidean.getRoundZAxisByPlaneAngle( segmentYMirror, pointEnd ) + if euclidean.isLoopListIntersectingInsideXSegment( loops, pointBeginRotated.real, pointEndRotated.real, segmentYMirror, pointBeginRotated.imag ): + return True + return euclidean.isXSegmentIntersectingPaths( paths, pointBeginRotated.real, pointEndRotated.real, segmentYMirror, pointBeginRotated.imag ) + +def isPointAddedAroundClosest(layerInfillWidth, paths, pixelTable, removedEndpointPoint, width): + 'Add the closest removed endpoint to the path, with minimal twisting.' + closestDistanceSquared = 999999999987654321.0 + closestPathIndex = None + for pathIndex in xrange(len(paths)): + path = paths[ pathIndex ] + for pointIndex in xrange(len(path)): + point = path[pointIndex] + distanceSquared = abs(point - removedEndpointPoint) + if distanceSquared < closestDistanceSquared: + closestDistanceSquared = distanceSquared + closestPathIndex = pathIndex + if closestPathIndex == None: + return + if closestDistanceSquared < 0.8 * layerInfillWidth * layerInfillWidth: + return + closestPath = paths[closestPathIndex] + closestPointIndex = getWithLeastLength(closestPath, removedEndpointPoint) + if isAddedPointOnPathFree(closestPath, pixelTable, removedEndpointPoint, closestPointIndex, width): + addPointOnPath(closestPath, closestPathIndex, pixelTable, removedEndpointPoint, closestPointIndex, width) + return True + return isSidePointAdded(pixelTable, closestPath, closestPathIndex, closestPointIndex, layerInfillWidth, removedEndpointPoint, width) + +def isSegmentAround(aroundSegmentsDictionary, aroundSegmentsDictionaryKey, segment): + 'Determine if there is another segment around.' + if aroundSegmentsDictionaryKey not in aroundSegmentsDictionary: + return False + for aroundSegment in aroundSegmentsDictionary[aroundSegmentsDictionaryKey]: + endpoint = aroundSegment[0] + if isSegmentInX(segment, endpoint.point.real, endpoint.otherEndpoint.point.real): + return True + return False + +def isSegmentCompletelyInAnIntersection( segment, xIntersections ): + 'Add sparse endpoints from a segment.' + for xIntersectionIndex in xrange( 0, len( xIntersections ), 2 ): + surroundingXFirst = xIntersections[ xIntersectionIndex ] + surroundingXSecond = xIntersections[ xIntersectionIndex + 1 ] + if euclidean.isSegmentCompletelyInX( segment, surroundingXFirst, surroundingXSecond ): + return True + return False + +def isSegmentInX( segment, xFirst, xSecond ): + 'Determine if the segment overlaps within x.' + segmentFirstX = segment[0].point.real + segmentSecondX = segment[1].point.real + if min( segmentFirstX, segmentSecondX ) > max( xFirst, xSecond ): + return False + return max( segmentFirstX, segmentSecondX ) > min( xFirst, xSecond ) + +def isSharpCorner( beginComplex, centerComplex, endComplex ): + 'Determine if the three complex points form a sharp corner.' + 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.9 + +def isSidePointAdded( pixelTable, closestPath, closestPathIndex, closestPointIndex, layerInfillWidth, removedEndpointPoint, width ): + 'Add side point along with the closest removed endpoint to the path, with minimal twisting.' + if closestPointIndex <= 0 or closestPointIndex >= len( closestPath ): + return False + pointBegin = closestPath[ closestPointIndex - 1 ] + pointEnd = closestPath[ closestPointIndex ] + removedEndpointPoint = removedEndpointPoint + closest = pointBegin + farthest = pointEnd + removedMinusClosest = removedEndpointPoint - pointBegin + removedMinusClosestLength = abs( removedMinusClosest ) + if removedMinusClosestLength <= 0.0: + return False + removedMinusOther = removedEndpointPoint - pointEnd + removedMinusOtherLength = abs( removedMinusOther ) + if removedMinusOtherLength <= 0.0: + return False + insertPointAfter = None + insertPointBefore = None + if removedMinusOtherLength < removedMinusClosestLength: + closest = pointEnd + farthest = pointBegin + removedMinusClosest = removedMinusOther + removedMinusClosestLength = removedMinusOtherLength + insertPointBefore = removedEndpointPoint + else: + insertPointAfter = removedEndpointPoint + removedMinusClosestNormalized = removedMinusClosest / removedMinusClosestLength + perpendicular = removedMinusClosestNormalized * complex( 0.0, layerInfillWidth ) + sidePoint = removedEndpointPoint + perpendicular + #extra check in case the line to the side point somehow slips by the line to the perpendicular + sidePointOther = removedEndpointPoint - perpendicular + if abs( sidePoint - farthest ) > abs( sidePointOther - farthest ): + perpendicular = - perpendicular + sidePoint = sidePointOther + maskTable = {} + closestSegmentTable = {} + toPerpendicularTable = {} + euclidean.addValueSegmentToPixelTable( pointBegin, pointEnd, maskTable, None, width ) + euclidean.addValueSegmentToPixelTable( closest, removedEndpointPoint, closestSegmentTable, None, width ) + euclidean.addValueSegmentToPixelTable( sidePoint, farthest, toPerpendicularTable, None, width ) + if euclidean.isPixelTableIntersecting( pixelTable, toPerpendicularTable, maskTable ) or euclidean.isPixelTableIntersecting( closestSegmentTable, toPerpendicularTable, maskTable ): + sidePoint = removedEndpointPoint - perpendicular + toPerpendicularTable = {} + euclidean.addValueSegmentToPixelTable( sidePoint, farthest, toPerpendicularTable, None, width ) + if euclidean.isPixelTableIntersecting( pixelTable, toPerpendicularTable, maskTable ) or euclidean.isPixelTableIntersecting( closestSegmentTable, toPerpendicularTable, maskTable ): + return False + if insertPointBefore != None: + addPointOnPathIfFree( closestPath, closestPathIndex, pixelTable, insertPointBefore, closestPointIndex, width ) + addPointOnPathIfFree( closestPath, closestPathIndex, pixelTable, sidePoint, closestPointIndex, width ) + if insertPointAfter != None: + addPointOnPathIfFree( closestPath, closestPathIndex, pixelTable, insertPointAfter, closestPointIndex, width ) + return True + +def removeEndpoints(layerInfillWidth, paths, pixelTable, removedEndpoints, aroundWidth): + 'Remove endpoints which are added to the path.' + for removedEndpointIndex in xrange(len(removedEndpoints) -1, -1, -1): + removedEndpoint = removedEndpoints[removedEndpointIndex] + removedEndpointPoint = removedEndpoint.point + if isPointAddedAroundClosest(layerInfillWidth, paths, pixelTable, removedEndpointPoint, aroundWidth): + removedEndpoints.remove(removedEndpoint ) + +def setIsOutside( yCloseToCenterPath, yIntersectionPaths ): + 'Determine if the yCloseToCenterPath is outside.' + beforeClose = yCloseToCenterPath.yMinusCenter < 0.0 + for yIntersectionPath in yIntersectionPaths: + if yIntersectionPath != yCloseToCenterPath: + beforePath = yIntersectionPath.yMinusCenter < 0.0 + if beforeClose == beforePath: + yCloseToCenterPath.isOutside = False + return + yCloseToCenterPath.isOutside = True + +def writeOutput(fileName, shouldAnalyze=True): + 'Fill an inset gcode file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'fill', shouldAnalyze) + + +class FillRepository: + 'A class to handle the fill settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.fill.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Fill', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Fill') + self.activateFill = settings.BooleanSetting().getFromValue('Activate Fill', self, True ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Diaphragm -', self ) + self.diaphragmPeriod = settings.IntSpin().getFromValue( 20, 'Diaphragm Period (layers):', self, 200, 100 ) + self.diaphragmThickness = settings.IntSpin().getFromValue( 0, 'Diaphragm Thickness (layers):', self, 5, 0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Extra Shells -', self ) + self.extraShellsAlternatingSolidLayer = settings.IntSpin().getFromValue( 0, 'Extra Shells on Alternating Solid Layer (layers):', self, 3, 2 ) + self.extraShellsBase = settings.IntSpin().getFromValue( 0, 'Extra Shells on Base (layers):', self, 3, 1 ) + self.extraShellsSparseLayer = settings.IntSpin().getFromValue( 0, 'Extra Shells on Sparse Layer (layers):', self, 3, 1 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Grid -', self ) + self.gridCircleSeparationOverPerimeterWidth = settings.FloatSpin().getFromValue(0.0, 'Grid Circle Separation over Perimeter Width (ratio):', self, 1.0, 0.2) + self.gridExtraOverlap = settings.FloatSpin().getFromValue( 0.0, 'Grid Extra Overlap (ratio):', self, 0.5, 0.1 ) + self.gridJunctionSeparationBandHeight = settings.IntSpin().getFromValue( 0, 'Grid Junction Separation Band Height (layers):', self, 20, 10 ) + self.gridJunctionSeparationOverOctogonRadiusAtEnd = settings.FloatSpin().getFromValue( 0.0, 'Grid Junction Separation over Octogon Radius At End (ratio):', self, 0.8, 0.0 ) + self.gridJunctionSeparationOverOctogonRadiusAtMiddle = settings.FloatSpin().getFromValue( 0.0, 'Grid Junction Separation over Octogon Radius At Middle (ratio):', self, 0.8, 0.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Infill -', self ) + self.infillBeginRotation = settings.FloatSpin().getFromValue( 0.0, 'Infill Begin Rotation (degrees):', self, 90.0, 45.0 ) + self.infillBeginRotationRepeat = settings.IntSpin().getFromValue( 0, 'Infill Begin Rotation Repeat (layers):', self, 3, 1 ) + self.infillOddLayerExtraRotation = settings.FloatSpin().getFromValue( 30.0, 'Infill Odd Layer Extra Rotation (degrees):', self, 90.0, 90.0 ) + self.infillPatternLabel = settings.LabelDisplay().getFromName('Infill Pattern:', self ) + infillLatentStringVar = settings.LatentStringVar() + self.infillPatternGridCircular = settings.Radio().getFromRadio( infillLatentStringVar, 'Grid Circular', self, False ) + self.infillPatternGridHexagonal = settings.Radio().getFromRadio( infillLatentStringVar, 'Grid Hexagonal', self, False ) + self.infillPatternGridRectangular = settings.Radio().getFromRadio( infillLatentStringVar, 'Grid Rectangular', self, False ) + self.infillPatternLine = settings.Radio().getFromRadio( infillLatentStringVar, 'Line', self, True ) + self.infillPerimeterOverlap = settings.FloatSpin().getFromValue( 0.0, 'Infill Perimeter Overlap (ratio):', self, 0.4, 0.15 ) + self.infillSolidity = settings.FloatSpin().getFromValue( 0.04, 'Infill Solidity (ratio):', self, 0.3, 0.2 ) + self.infillWidthOverThickness = settings.FloatSpin().getFromValue(1.3, 'Infill Width over Thickness (ratio):', self, 1.7, 1.5) + settings.LabelSeparator().getFromRepository(self) + self.solidSurfaceThickness = settings.IntSpin().getFromValue(0, 'Solid Surface Thickness (layers):', self, 5, 3) + self.startFromChoice = settings.MenuButtonDisplay().getFromName('Start From Choice:', self) + self.startFromLowerLeft = settings.MenuRadio().getFromMenuButtonDisplay(self.startFromChoice, 'Lower Left', self, True) + self.startFromNearest = settings.MenuRadio().getFromMenuButtonDisplay(self.startFromChoice, 'Nearest', self, False) + self.surroundingAngle = settings.FloatSpin().getFromValue(30.0, 'Surrounding Angle (degrees):', self, 60.0, 45.0) + self.threadSequenceChoice = settings.MenuButtonDisplay().getFromName('Thread Sequence Choice:', self) + self.threadSequenceInfillLoops = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Infill > Loops > Perimeter', self, False) + self.threadSequenceInfillPerimeter = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Infill > Perimeter > Loops', self, False) + self.threadSequenceLoopsInfill = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Loops > Infill > Perimeter', self, False) + self.threadSequenceLoopsPerimeter = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Loops > Perimeter > Infill', self, True) + self.threadSequencePerimeterInfill = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Perimeter > Infill > Loops', self, False) + self.threadSequencePerimeterLoops = settings.MenuRadio().getFromMenuButtonDisplay(self.threadSequenceChoice, 'Perimeter > Loops > Infill', self, False) + self.executeTitle = 'Fill' + + def execute(self): + 'Fill button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class FillSkein: + 'A class to fill a skein of extrusions.' + def __init__(self): + self.bridgeWidthMultiplier = 1.0 + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.fillInset = 0.18 + self.isPerimeter = False + self.lastExtraShells = - 1 + self.lineIndex = 0 + self.oldLocation = None + self.oldOrderedLocation = None + self.perimeterWidth = None + self.rotatedLayer = None + self.rotatedLayers = [] + self.shutdownLineIndex = sys.maxint + self.nestedRing = None + self.thread = None + + def addFill(self, layerIndex): + 'Add fill to the carve layer.' +# if layerIndex > 2: +# return + settings.printProgressByNumber(layerIndex, len(self.rotatedLayers), 'fill') + arounds = [] + endpoints = [] + extraShells = self.repository.extraShellsSparseLayer.value + infillPaths = [] + layerFillInset = self.fillInset + layerInfillSolidity = self.infillSolidity + layerPerimeterMinusHalfInfillWidth = self.perimeterMinusHalfInfillWidth + layerRemainder = layerIndex % int(round(self.repository.diaphragmPeriod.value)) + layerRotation = self.getLayerRotation(layerIndex) + pixelTable = {} + reverseRotation = complex(layerRotation.real, - layerRotation.imag) + rotatedLayer = self.rotatedLayers[layerIndex] + self.isDoubleJunction = True + self.isJunctionWide = True + self.layerInfillWidth = self.infillWidth + surroundingCarves = [] + self.distanceFeedRate.addLine('( %s )' % rotatedLayer.z) + if layerRemainder >= int(round(self.repository.diaphragmThickness.value)): + for surroundingIndex in xrange(1, self.solidSurfaceThickness + 1): + self.addRotatedCarve(layerIndex, -surroundingIndex, reverseRotation, surroundingCarves) + self.addRotatedCarve(layerIndex, surroundingIndex, reverseRotation, surroundingCarves) + if len(surroundingCarves) < self.doubleSolidSurfaceThickness: + extraShells = self.repository.extraShellsAlternatingSolidLayer.value + if self.lastExtraShells != self.repository.extraShellsBase.value: + extraShells = self.repository.extraShellsBase.value + if rotatedLayer.rotation != None: + extraShells = 0 + self.layerInfillWidth *= self.bridgeWidthMultiplier + layerFillInset *= self.bridgeWidthMultiplier + layerPerimeterMinusHalfInfillWidth *= self.bridgeWidthMultiplier + self.distanceFeedRate.addLine('( %s )' % rotatedLayer.rotation) + self.distanceFeedRate.addLine('( %s )' % layerRotation) + aroundInset = 0.25 * self.layerInfillWidth + aroundWidth = 0.25 * self.layerInfillWidth + doubleInfillWidth = 2.0 * self.layerInfillWidth + gridPointInsetX = 0.5 * layerFillInset + self.lastExtraShells = extraShells + if self.repository.infillPatternGridHexagonal.value: + infillBeginRotationPolar = euclidean.getWiddershinsUnitPolar(self.infillBeginRotation) + if abs(euclidean.getDotProduct(layerRotation, infillBeginRotationPolar)) < math.sqrt( 0.5): + layerInfillSolidity *= 0.5 + self.isDoubleJunction = False + else: + self.isJunctionWide = False + nestedRings = euclidean.getOrderedNestedRings(rotatedLayer.nestedRings) +# if isPerimeterPathInSurroundLoops( nestedRings ): +# extraShells = 0 + createFillForSurroundings(nestedRings, layerPerimeterMinusHalfInfillWidth, False) + for extraShellIndex in xrange(extraShells): + createFillForSurroundings(nestedRings, self.layerInfillWidth, True) + fillLoops = euclidean.getFillOfSurroundings(nestedRings, None) + rotatedLoops = euclidean.getRotatedComplexLists(reverseRotation, fillLoops) + infillDictionary = triangle_mesh.getInfillDictionary( + aroundInset, arounds, aroundWidth, layerFillInset, self.layerInfillWidth, pixelTable, rotatedLoops) + if len(arounds) < 1: + self.addThreadsBridgeLayer(layerIndex, nestedRings, rotatedLayer) + return + self.horizontalSegmentsDictionary = {} + for infillDictionaryKey in infillDictionary.keys(): + xIntersections = infillDictionary[infillDictionaryKey] + xIntersections.sort() + y = infillDictionaryKey * self.layerInfillWidth + self.horizontalSegmentsDictionary[infillDictionaryKey] = euclidean.getSegmentsFromXIntersections(xIntersections, y) + self.surroundingXIntersectionsDictionary = {} + gridCircular = False + removedEndpoints = [] + if len(surroundingCarves) >= self.doubleSolidSurfaceThickness: + if self.repository.infillPatternGridCircular.value and self.repository.infillSolidity.value > 0.0: + gridCircular = True + layerInfillSolidity = 0.0 + xSurroundingIntersectionsDictionaries = [infillDictionary] + for surroundingCarve in surroundingCarves: + xSurroundingIntersectionsDictionary = {} + euclidean.addXIntersectionsFromLoopsForTable(surroundingCarve, xSurroundingIntersectionsDictionary, self.layerInfillWidth) + xSurroundingIntersectionsDictionaries.append(xSurroundingIntersectionsDictionary) + self.surroundingXIntersectionsDictionary = euclidean.getIntersectionOfXIntersectionsTables(xSurroundingIntersectionsDictionaries) + for horizontalSegmentsDictionaryKey in self.horizontalSegmentsDictionary.keys(): + if horizontalSegmentsDictionaryKey in self.surroundingXIntersectionsDictionary: + surroundingXIntersections = self.surroundingXIntersectionsDictionary[horizontalSegmentsDictionaryKey] + else: + surroundingXIntersections = [] + addSparseEndpoints(doubleInfillWidth, endpoints, self.horizontalSegmentsDictionary, horizontalSegmentsDictionaryKey, layerInfillSolidity, removedEndpoints, self.solidSurfaceThickness, surroundingXIntersections) + else: + for segments in self.horizontalSegmentsDictionary.values(): + for segment in segments: + endpoints += segment + paths = euclidean.getPathsFromEndpoints(endpoints, 5.0 * self.layerInfillWidth, pixelTable, aroundWidth) + if gridCircular: + startAngle = euclidean.globalGoldenAngle * float(layerIndex) + for gridPoint in self.getGridPoints(fillLoops, reverseRotation): + self.addGridCircle(gridPoint, infillPaths, layerRotation, pixelTable, rotatedLoops, layerRotation, aroundWidth) + else: + if self.isGridToBeExtruded(): + self.addGrid( + arounds, fillLoops, gridPointInsetX, layerIndex, paths, pixelTable, reverseRotation, surroundingCarves, aroundWidth) + oldRemovedEndpointLength = len(removedEndpoints) + 1 + while oldRemovedEndpointLength - len(removedEndpoints) > 0: + oldRemovedEndpointLength = len(removedEndpoints) + removeEndpoints(self.layerInfillWidth, paths, pixelTable, removedEndpoints, aroundWidth) + paths = euclidean.getConnectedPaths(paths, pixelTable, aroundWidth) + for path in paths: + addPath(self.layerInfillWidth, infillPaths, path, layerRotation) + euclidean.transferPathsToNestedRings(nestedRings, infillPaths) + for fillLoop in fillLoops: + addInfillBoundary(fillLoop, nestedRings) + self.addThreadsBridgeLayer(layerIndex, nestedRings, rotatedLayer) + + def addGcodeFromThreadZ( self, thread, z ): + 'Add a gcode thread to the output.' + self.distanceFeedRate.addGcodeFromThreadZ( thread, z ) + + def addGrid(self, arounds, fillLoops, gridPointInsetX, layerIndex, paths, pixelTable, reverseRotation, surroundingCarves, width): + 'Add the grid to the infill layer.' + if len(surroundingCarves) < self.doubleSolidSurfaceThickness: + return + explodedPaths = [] + pathGroups = [] + for path in paths: + pathIndexBegin = len( explodedPaths ) + for pointIndex in xrange( len(path) - 1 ): + pathSegment = [ path[pointIndex], path[pointIndex + 1] ] + explodedPaths.append( pathSegment ) + pathGroups.append( ( pathIndexBegin, len( explodedPaths ) ) ) + for pathIndex in xrange( len( explodedPaths ) ): + explodedPath = explodedPaths[ pathIndex ] + euclidean.addPathToPixelTable( explodedPath, pixelTable, pathIndex, width ) + gridPoints = self.getGridPoints(fillLoops, reverseRotation) + gridPointInsetY = gridPointInsetX * ( 1.0 - self.repository.gridExtraOverlap.value ) + if self.repository.infillPatternGridRectangular.value: + gridBandHeight = self.repository.gridJunctionSeparationBandHeight.value + gridLayerRemainder = ( layerIndex - self.solidSurfaceThickness ) % gridBandHeight + halfBandHeight = 0.5 * float( gridBandHeight ) + halfBandHeightFloor = math.floor( halfBandHeight ) + fromMiddle = math.floor( abs( gridLayerRemainder - halfBandHeight ) ) + fromEnd = halfBandHeightFloor - fromMiddle + gridJunctionSeparation = self.gridJunctionEnd * fromMiddle + self.gridJunctionMiddle * fromEnd + gridJunctionSeparation /= halfBandHeightFloor + gridPointInsetX += gridJunctionSeparation + gridPointInsetY += gridJunctionSeparation + oldGridPointLength = len( gridPoints ) + 1 + while oldGridPointLength - len( gridPoints ) > 0: + oldGridPointLength = len( gridPoints ) + self.addRemainingGridPoints( arounds, gridPointInsetX, gridPointInsetY, gridPoints, True, explodedPaths, pixelTable, width ) + oldGridPointLength = len( gridPoints ) + 1 + while oldGridPointLength - len( gridPoints ) > 0: + oldGridPointLength = len( gridPoints ) + self.addRemainingGridPoints( arounds, gridPointInsetX, gridPointInsetY, gridPoints, False, explodedPaths, pixelTable, width ) + for pathGroupIndex in xrange( len( pathGroups ) ): + pathGroup = pathGroups[ pathGroupIndex ] + paths[ pathGroupIndex ] = [] + for explodedPathIndex in xrange( pathGroup[0], pathGroup[1] ): + explodedPath = explodedPaths[ explodedPathIndex ] + if len( paths[ pathGroupIndex ] ) == 0: + paths[ pathGroupIndex ] = explodedPath + else: + paths[ pathGroupIndex ] += explodedPath[1 :] + + def addGridCircle(self, center, infillPaths, layerRotation, pixelTable, rotatedLoops, startRotation, width): + 'Add circle to the grid.' + startAngle = -math.atan2(startRotation.imag, startRotation.real) + loop = euclidean.getComplexPolygon(center, self.gridCircleRadius, 17, startAngle) + loopPixelDictionary = {} + euclidean.addLoopToPixelTable(loop, loopPixelDictionary, width) + if not euclidean.isPixelTableIntersecting(pixelTable, loopPixelDictionary): + if euclidean.getIsInFilledRegion(rotatedLoops, euclidean.getLeftPoint(loop)): + addLoop(self.layerInfillWidth, infillPaths, loop, layerRotation) + return + insideIndexPaths = [] + insideIndexPath = None + for pointIndex, point in enumerate(loop): + nextPoint = loop[(pointIndex + 1) % len(loop)] + segmentDictionary = {} + euclidean.addValueSegmentToPixelTable(point, nextPoint, segmentDictionary, None, width) + euclidean.addSquareTwoToPixelDictionary(segmentDictionary, point, None, width) + euclidean.addSquareTwoToPixelDictionary(segmentDictionary, nextPoint, None, width) + shouldAddLoop = not euclidean.isPixelTableIntersecting(pixelTable, segmentDictionary) + if shouldAddLoop: + shouldAddLoop = euclidean.getIsInFilledRegion(rotatedLoops, point) + if shouldAddLoop: + if insideIndexPath == None: + insideIndexPath = [pointIndex] + insideIndexPaths.append(insideIndexPath) + else: + insideIndexPath.append(pointIndex) + else: + insideIndexPath = None + if len(insideIndexPaths) > 1: + insideIndexPathFirst = insideIndexPaths[0] + insideIndexPathLast = insideIndexPaths[-1] + if insideIndexPathFirst[0] == 0 and insideIndexPathLast[-1] == len(loop) - 1: + insideIndexPaths[0] = insideIndexPathLast + insideIndexPathFirst + del insideIndexPaths[-1] + for insideIndexPath in insideIndexPaths: + path = [] + for insideIndex in insideIndexPath: + if len(path) == 0: + path.append(loop[insideIndex]) + path.append(loop[(insideIndex + 1) % len(loop)]) + addPath(self.layerInfillWidth, infillPaths, path, layerRotation) + + def addGridLinePoints( self, begin, end, gridPoints, gridRotationAngle, offset, y ): + 'Add the segments of one line of a grid to the infill.' + if self.gridRadius == 0.0: + return + gridXStep = int(math.floor((begin) / self.gridXStepSize)) - 3 + gridXOffset = offset + self.gridXStepSize * float(gridXStep) + while gridXOffset < end: + if gridXOffset >= begin: + gridPointComplex = complex(gridXOffset, y) * gridRotationAngle + if self.repository.infillPatternGridCircular.value or self.isPointInsideLineSegments(gridPointComplex): + gridPoints.append(gridPointComplex) + gridXStep = self.getNextGripXStep(gridXStep) + gridXOffset = offset + self.gridXStepSize * float(gridXStep) + + def addRemainingGridPoints( + self, arounds, gridPointInsetX, gridPointInsetY, gridPoints, isBothOrNone, paths, pixelTable, width): + 'Add the remaining grid points to the grid point list.' + for gridPointIndex in xrange( len( gridPoints ) - 1, - 1, - 1 ): + gridPoint = gridPoints[ gridPointIndex ] + addAroundGridPoint( arounds, gridPoint, gridPointInsetX, gridPointInsetY, gridPoints, self.gridRadius, isBothOrNone, self.isDoubleJunction, self.isJunctionWide, paths, pixelTable, width ) + + def addRotatedCarve(self, currentLayer, layerDelta, reverseRotation, surroundingCarves): + 'Add a rotated carve to the surrounding carves.' + layerIndex = currentLayer + layerDelta + if layerIndex < 0 or layerIndex >= len(self.rotatedLayers): + return + nestedRings = self.rotatedLayers[layerIndex].nestedRings + rotatedCarve = [] + for nestedRing in nestedRings: + planeRotatedLoop = euclidean.getRotatedComplexes(reverseRotation, nestedRing.boundary) + rotatedCarve.append(planeRotatedLoop) + layerDifference = abs(layerDelta) + outsetRadius = float(layerDifference) * self.layerThickness * self.surroundingSlope - self.perimeterWidth + if outsetRadius > self.smallerThanPerimeter: + rotatedCarve = intercircle.getInsetSeparateLoopsFromLoops(-outsetRadius, rotatedCarve) + surroundingCarves.append(rotatedCarve) + + def addThreadsBridgeLayer(self, layerIndex, nestedRings, rotatedLayer, testLoops=None): + 'Add the threads, add the bridge end & the layer end tag.' + if self.oldOrderedLocation == None or self.repository.startFromLowerLeft.value: + self.oldOrderedLocation = getLowerLeftCorner(nestedRings) + extrusionHalfWidth = 0.5 * self.layerInfillWidth + threadSequence = self.threadSequence + if layerIndex < 1: + threadSequence = ['perimeter', 'loops', 'infill'] + euclidean.addToThreadsRemove(extrusionHalfWidth, nestedRings, self.oldOrderedLocation, self, threadSequence) + if testLoops != None: + for testLoop in testLoops: + self.addGcodeFromThreadZ(testLoop, self.oldOrderedLocation.z) + self.distanceFeedRate.addLine('()') + if rotatedLayer.rotation != None: + self.distanceFeedRate.addLine('()') + self.distanceFeedRate.addLine('()') + + def addToThread(self, location): + 'Add a location to thread.' + if self.oldLocation == None: + return + if self.isPerimeter: + self.nestedRing.addToLoop( location ) + return + if self.thread == None: + self.thread = [ self.oldLocation.dropAxis() ] + self.nestedRing.perimeterPaths.append(self.thread) + self.thread.append(location.dropAxis()) + + def getCraftedGcode( self, repository, gcodeText ): + 'Parse gcode text and store the bevel gcode.' + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.threadSequence = None + if repository.threadSequenceInfillLoops.value: + self.threadSequence = ['infill', 'loops', 'perimeter'] + if repository.threadSequenceInfillPerimeter.value: + self.threadSequence = ['infill', 'perimeter', 'loops'] + if repository.threadSequenceLoopsInfill.value: + self.threadSequence = ['loops', 'infill', 'perimeter'] + if repository.threadSequenceLoopsPerimeter.value: + self.threadSequence = ['loops', 'perimeter', 'infill'] + if repository.threadSequencePerimeterInfill.value: + self.threadSequence = ['perimeter', 'infill', 'loops'] + if repository.threadSequencePerimeterLoops.value: + self.threadSequence = ['perimeter', 'loops', 'infill'] + if self.repository.infillPerimeterOverlap.value > 0.45: + print('') + print('!!! WARNING !!!') + print('"Infill Perimeter Overlap" is greater than 0.45, which may create problems with the infill, like threads going through empty space and/or the extruder switching on and off a lot.') + print('If you want to stretch the infill a lot, set "Path Stretch over Perimeter Width" in stretch to a high value instead of setting "Infill Perimeter Overlap" to a high value.') + print('') + self.parseInitialization() + if self.perimeterWidth == None: + print('Warning, nothing will be done because self.perimeterWidth in getCraftedGcode in FillSkein was None.') + return '' + self.fillInset = self.infillWidth - self.infillWidth * self.repository.infillPerimeterOverlap.value + self.infillSolidity = repository.infillSolidity.value + self.perimeterMinusHalfInfillWidth = self.perimeterWidth - 0.5 * self.infillWidth + if self.isGridToBeExtruded(): + self.setGridVariables(repository) + self.infillBeginRotation = math.radians( repository.infillBeginRotation.value ) + self.infillOddLayerExtraRotation = math.radians( repository.infillOddLayerExtraRotation.value ) + self.solidSurfaceThickness = int( round( self.repository.solidSurfaceThickness.value ) ) + self.doubleSolidSurfaceThickness = self.solidSurfaceThickness + self.solidSurfaceThickness + for lineIndex in xrange(self.lineIndex, len(self.lines)): + self.parseLine( lineIndex ) + for layerIndex in xrange(len(self.rotatedLayers)): + self.addFill(layerIndex) + self.distanceFeedRate.addLines( self.lines[ self.shutdownLineIndex : ] ) + return self.distanceFeedRate.output.getvalue() + + def getGridPoints(self, fillLoops, reverseRotation): + 'Get the grid points.' + if self.infillSolidity > 0.8: + return [] + rotationBaseAngle = euclidean.getWiddershinsUnitPolar(self.infillBeginRotation) + reverseRotationBaseAngle = complex(rotationBaseAngle.real, - rotationBaseAngle.imag) + gridRotationAngle = reverseRotation * rotationBaseAngle + slightlyGreaterThanFillInset = intercircle.globalIntercircleMultiplier * self.gridInset + triangle_mesh.sortLoopsInOrderOfArea(True, fillLoops) + rotatedLoops = euclidean.getRotatedComplexLists(reverseRotationBaseAngle, fillLoops) + if self.repository.infillPatternGridCircular.value: + return self.getGridPointsByLoops( + gridRotationAngle, intercircle.getInsetSeparateLoopsFromLoops(-self.gridCircleRadius, rotatedLoops)) + return self.getGridPointsByLoops(gridRotationAngle, intercircle.getInsetSeparateLoopsFromLoops(self.gridInset, rotatedLoops)) + + def getGridPointsByLoops(self, gridRotationAngle, loops): + 'Get the grid points by loops.' + gridIntersectionsDictionary = {} + gridPoints = [] + euclidean.addXIntersectionsFromLoopsForTable(loops, gridIntersectionsDictionary, self.gridRadius) + for gridIntersectionsKey in gridIntersectionsDictionary: + y = gridIntersectionsKey * self.gridRadius + self.gridRadius * 0.5 + gridIntersections = gridIntersectionsDictionary[gridIntersectionsKey] + gridIntersections.sort() + gridIntersectionsLength = len(gridIntersections) + if gridIntersectionsLength % 2 == 1: + gridIntersectionsLength -= 1 + for gridIntersectionIndex in xrange(0, gridIntersectionsLength, 2): + begin = gridIntersections[gridIntersectionIndex] + end = gridIntersections[gridIntersectionIndex + 1] + offset = self.offsetMultiplier * (gridIntersectionsKey % 2) + self.offsetBaseX + self.addGridLinePoints(begin, end, gridPoints, gridRotationAngle, offset, y) + return gridPoints + + def getLayerRotation(self, layerIndex): + 'Get the layer rotation.' + rotation = self.rotatedLayers[layerIndex].rotation + if rotation != None: + return rotation + infillBeginRotationRepeat = self.repository.infillBeginRotationRepeat.value + infillOddLayerRotationMultiplier = float( layerIndex % ( infillBeginRotationRepeat + 1 ) == infillBeginRotationRepeat ) + layerAngle = self.infillBeginRotation + infillOddLayerRotationMultiplier * self.infillOddLayerExtraRotation + return euclidean.getWiddershinsUnitPolar(layerAngle) + + def getNextGripXStep( self, gridXStep ): + 'Get the next grid x step, increment by an extra one every three if hexagonal grid is chosen.' + gridXStep += 1 + if self.repository.infillPatternGridHexagonal.value: + if gridXStep % 3 == 0: + gridXStep += 1 + return gridXStep + + def isGridToBeExtruded(self): + 'Determine if the grid is to be extruded.' + if self.repository.infillPatternLine.value: + return False + return self.repository.infillSolidity.value > 0.0 + + def isPointInsideLineSegments( self, gridPoint ): + 'Is the point inside the line segments of the loops.' + if self.solidSurfaceThickness <= 0: + return True + fillLine = int(round(gridPoint.imag / self.layerInfillWidth)) + if fillLine not in self.horizontalSegmentsDictionary: + return False + if fillLine not in self.surroundingXIntersectionsDictionary: + return False + lineSegments = self.horizontalSegmentsDictionary[fillLine] + surroundingXIntersections = self.surroundingXIntersectionsDictionary[fillLine] + for lineSegment in lineSegments: + if isSegmentCompletelyInAnIntersection(lineSegment, surroundingXIntersections ): + xFirst = lineSegment[0].point.real + xSecond = lineSegment[1].point.real + if gridPoint.real > min(xFirst, xSecond) and gridPoint.real < max(xFirst, xSecond): + return True + return False + + def linearMove( self, splitLine ): + 'Add a linear move to the thread.' + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.extruderActive: + self.addToThread( location ) + self.oldLocation = location + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '(': + self.bridgeWidthMultiplier = float(splitLine[1]) + elif firstWord == '()': + self.distanceFeedRate.addLine(line) + return + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + self.infillWidth = self.repository.infillWidthOverThickness.value * self.layerThickness + self.surroundingSlope = math.tan(math.radians(min(self.repository.surroundingAngle.value, 80.0))) + self.distanceFeedRate.addTagRoundedLine('infillPerimeterOverlap', self.repository.infillPerimeterOverlap.value) + self.distanceFeedRate.addTagRoundedLine('infillWidth', self.infillWidth) + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.smallerThanPerimeter = 0.2 * self.perimeterWidth + threadSequenceString = ' '.join( self.threadSequence ) + self.distanceFeedRate.addTagBracketedLine('threadSequenceString', threadSequenceString ) + elif firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('fill') + self.distanceFeedRate.addLine(line) + + def parseLine( self, lineIndex ): + 'Parse a gcode line and add it to the fill skein.' + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + self.thread = None + self.isPerimeter = False + elif firstWord == '()': + self.nestedRing = euclidean.NestedBand() + self.rotatedLayer.nestedRings.append( self.nestedRing ) + elif firstWord == '()': + self.nestedRing = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + self.nestedRing.addToBoundary( location ) + elif firstWord == '(': + self.rotatedLayer.rotation = gcodec.getRotationBySplitLine(splitLine) + elif firstWord == '()': + self.shutdownLineIndex = lineIndex + elif firstWord == '(': + self.rotatedLayer = RotatedLayer(float(splitLine[1])) + self.rotatedLayers.append( self.rotatedLayer ) + self.thread = None + elif firstWord == '(': + self.isPerimeter = True + + def setGridVariables( self, repository ): + 'Set the grid variables.' + self.gridInset = 1.2 * self.infillWidth + self.gridRadius = self.infillWidth / self.infillSolidity + self.gridXStepSize = 2.0 * self.gridRadius + self.offsetMultiplier = self.gridRadius + if self.repository.infillPatternGridHexagonal.value: + self.gridXStepSize = 4.0 / 3.0 * self.gridRadius + self.offsetMultiplier = 1.5 * self.gridXStepSize + if self.repository.infillPatternGridCircular.value: + self.gridRadius += self.gridRadius + self.gridXStepSize = self.gridRadius / math.sqrt(.75) + self.offsetMultiplier = 0.5 * self.gridXStepSize + circleInsetOverPerimeterWidth = repository.gridCircleSeparationOverPerimeterWidth.value + 0.5 + self.gridMinimumCircleRadius = self.perimeterWidth + self.gridInset = self.gridMinimumCircleRadius + self.gridCircleRadius = self.offsetMultiplier - circleInsetOverPerimeterWidth * self.perimeterWidth + if self.gridCircleRadius < self.gridMinimumCircleRadius: + print('') + print('!!! WARNING !!!') + print('Grid Circle Separation over Perimeter Width is too high, which makes the grid circles too small.') + print('You should reduce Grid Circle Separation over Perimeter Width to a reasonable value, like the default of 0.5.') + print('The grid circle radius will be set to the minimum grid circle radius.') + print('') + self.gridCircleRadius = self.gridMinimumCircleRadius + self.offsetBaseX = 0.25 * self.gridXStepSize + if self.repository.infillPatternGridRectangular.value: + halfGridMinusWidth = 0.5 * ( self.gridRadius - self.infillWidth ) + self.gridJunctionEnd = halfGridMinusWidth * repository.gridJunctionSeparationOverOctogonRadiusAtEnd.value + self.gridJunctionMiddle = halfGridMinusWidth * repository.gridJunctionSeparationOverOctogonRadiusAtMiddle.value + + +class RotatedLayer: + 'A rotated layer.' + def __init__( self, z ): + self.rotation = None + self.nestedRings = [] + self.z = z + + def __repr__(self): + 'Get the string representation of this RotatedLayer.' + return '%s, %s, %s' % ( self.z, self.rotation, self.nestedRings ) + + +class YIntersectionPath: + 'A class to hold the y intersection position, the loop which it intersected and the point index of the loop which it intersected.' + def __init__( self, pathIndex, pointIndex, y ): + 'Initialize from the path, point index, and y.' + self.pathIndex = pathIndex + self.pointIndex = pointIndex + self.y = y + + def __repr__(self): + 'Get the string representation of this y intersection.' + return '%s, %s, %s' % ( self.pathIndex, self.pointIndex, self.y ) + + def getPath( self, paths ): + 'Get the path from the paths and path index.' + return paths[ self.pathIndex ] + + def getPointIndexPlusOne(self): + 'Get the point index plus one.' + return self.pointIndex + 1 + + +def main(): + 'Display the fill dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fill.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fill.pyc new file mode 100644 index 0000000..49ea7f0 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fill.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fillet.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fillet.py new file mode 100644 index 0000000..da54dcb --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fillet.py @@ -0,0 +1,393 @@ +""" +This page is in the table of contents. +Fillet rounds the corners slightly in a variety of ways. This is to reduce corner blobbing and sudden extruder acceleration. + +The fillet manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Fillet + +==Operation== +The default 'Activate Fillet' checkbox is off. When it is on, the functions described below will work, when it is off, nothing will be done. + +==Settings== +===Fillet Procedure Choice=== +Default is 'Bevel''. + +====Arc Point==== +When selected, the corners will be filleted with an arc using the gcode point form. + +====Arc Radius==== +When selected, the corners will be filleted with an arc using the gcode radius form. + +====Arc Segment==== +When selected, the corners will be filleted with an arc composed of several segments. + +====Bevel==== +When selected, the corners will be beveled. + +===Corner Feed Rate over Operating Feed Rate=== +Default is one. + +Defines the ratio of the feed rate in corners over the operating feed rate. With a high value the extruder will move quickly in corners, accelerating quickly and leaving a thin extrusion. With a low value, the extruder will move slowly in corners, accelerating gently and leaving a thick extrusion. + +===Fillet Radius over Perimeter Width=== +Default is 0.35. + +Defines the width of the fillet. + +===Reversal Slowdown over Perimeter Width=== +Default is 0.5. + +Defines how far before a path reversal the extruder will slow down. Some tools, like nozzle wipe, double back the path of the extruder and this option will add a slowdown point in that path so there won't be a sudden jerk at the end of the path. If the value is less than 0.1 a slowdown will not be added. + +===Use Intermediate Feed Rate in Corners=== +Default is on. + +When selected, the feed rate entering the corner will be the average of the old feed rate and the new feed rate. + +==Examples== +The following examples fillet the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and fillet.py. + +> python fillet.py +This brings up the fillet dialog. + +> python fillet.py Screw Holder Bottom.stl +The fillet tool is parsing the file: +Screw Holder Bottom.stl +.. +The fillet tool has created the file: +.. Screw Holder Bottom_fillet.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText, repository = None ): + "Fillet a gcode linear move file or text." + return getCraftedTextFromText( archive.getTextIfEmpty( fileName, gcodeText ), repository ) + +def getCraftedTextFromText( gcodeText, repository = None ): + "Fillet a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'fillet'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( FilletRepository() ) + if not repository.activateFillet.value: + return gcodeText + if repository.arcPoint.value: + return ArcPointSkein().getCraftedGcode( repository, gcodeText ) + elif repository.arcRadius.value: + return ArcRadiusSkein().getCraftedGcode( repository, gcodeText ) + elif repository.arcSegment.value: + return ArcSegmentSkein().getCraftedGcode( repository, gcodeText ) + elif repository.bevel.value: + return BevelSkein().getCraftedGcode( repository, gcodeText ) + return gcodeText + +def getNewRepository(): + 'Get new repository.' + return FilletRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Fillet a gcode linear move file. Depending on the settings, either arcPoint, arcRadius, arcSegment, bevel or do nothing." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'fillet', shouldAnalyze) + + +class BevelSkein: + "A class to bevel a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.feedRateMinute = 960.0 + self.filletRadius = 0.2 + self.lineIndex = 0 + self.lines = None + self.oldFeedRateMinute = None + self.oldLocation = None + self.shouldAddLine = True + + def addLinearMovePoint( self, feedRateMinute, point ): + "Add a gcode linear move, feedRate and newline to the output." + self.distanceFeedRate.addLine( self.distanceFeedRate.getLinearGcodeMovementWithFeedRate( feedRateMinute, point.dropAxis(), point.z ) ) + + def getCornerFeedRate(self): + "Get the corner feed rate, which may be based on the intermediate feed rate." + feedRateMinute = self.feedRateMinute + if self.repository.useIntermediateFeedRateInCorners.value: + if self.oldFeedRateMinute != None: + feedRateMinute = 0.5 * ( self.oldFeedRateMinute + self.feedRateMinute ) + return feedRateMinute * self.cornerFeedRateOverOperatingFeedRate + + def getCraftedGcode( self, repository, gcodeText ): + "Parse gcode text and store the bevel gcode." + self.cornerFeedRateOverOperatingFeedRate = repository.cornerFeedRateOverOperatingFeedRate.value + self.lines = archive.getTextLines(gcodeText) + self.repository = repository + self.parseInitialization( repository ) + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getExtruderOffReversalPoint( self, afterSegment, afterSegmentComplex, beforeSegment, beforeSegmentComplex, location ): + "If the extruder is off and the path is reversing, add intermediate slow points." + if self.repository.reversalSlowdownDistanceOverPerimeterWidth.value < 0.1: + return None + if self.extruderActive: + return None + reversalBufferSlowdownDistance = self.reversalSlowdownDistance * 2.0 + afterSegmentComplexLength = abs( afterSegmentComplex ) + if afterSegmentComplexLength < reversalBufferSlowdownDistance: + return None + beforeSegmentComplexLength = abs( beforeSegmentComplex ) + if beforeSegmentComplexLength < reversalBufferSlowdownDistance: + return None + afterSegmentComplexNormalized = afterSegmentComplex / afterSegmentComplexLength + beforeSegmentComplexNormalized = beforeSegmentComplex / beforeSegmentComplexLength + if euclidean.getDotProduct( afterSegmentComplexNormalized, beforeSegmentComplexNormalized ) < 0.95: + return None + slowdownFeedRate = self.feedRateMinute * 0.5 + self.shouldAddLine = False + beforePoint = euclidean.getPointPlusSegmentWithLength( self.reversalSlowdownDistance * abs( beforeSegment ) / beforeSegmentComplexLength, location, beforeSegment ) + self.addLinearMovePoint( self.feedRateMinute, beforePoint ) + self.addLinearMovePoint( slowdownFeedRate, location ) + afterPoint = euclidean.getPointPlusSegmentWithLength( self.reversalSlowdownDistance * abs( afterSegment ) / afterSegmentComplexLength, location, afterSegment ) + self.addLinearMovePoint( slowdownFeedRate, afterPoint ) + return afterPoint + + def getNextLocation(self): + "Get the next linear move. Return none is none is found." + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if gcodec.getFirstWord(splitLine) == 'G1': + nextLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + return nextLocation + return None + + def linearMove( self, splitLine ): + "Bevel a linear move." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + if self.oldLocation != None: + nextLocation = self.getNextLocation() + if nextLocation != None: + location = self.splitPointGetAfter( location, nextLocation ) + self.oldLocation = location + self.oldFeedRateMinute = self.feedRateMinute + + def parseInitialization( self, repository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('fillet') + return + elif firstWord == '(': + perimeterWidth = abs(float(splitLine[1])) + self.curveSection = 0.7 * perimeterWidth + self.filletRadius = perimeterWidth * repository.filletRadiusOverPerimeterWidth.value + self.minimumRadius = 0.1 * perimeterWidth + self.reversalSlowdownDistance = perimeterWidth * repository.reversalSlowdownDistanceOverPerimeterWidth.value + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the bevel gcode." + self.shouldAddLine = True + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.linearMove(splitLine) + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + if self.shouldAddLine: + self.distanceFeedRate.addLine(line) + + def splitPointGetAfter( self, location, nextLocation ): + "Bevel a point and return the end of the bevel. should get complex for radius" + if self.filletRadius < 2.0 * self.minimumRadius: + return location + afterSegment = nextLocation - location + afterSegmentComplex = afterSegment.dropAxis() + afterSegmentComplexLength = abs( afterSegmentComplex ) + thirdAfterSegmentLength = 0.333 * afterSegmentComplexLength + if thirdAfterSegmentLength < self.minimumRadius: + return location + beforeSegment = self.oldLocation - location + beforeSegmentComplex = beforeSegment.dropAxis() + beforeSegmentComplexLength = abs( beforeSegmentComplex ) + thirdBeforeSegmentLength = 0.333 * beforeSegmentComplexLength + if thirdBeforeSegmentLength < self.minimumRadius: + return location + extruderOffReversalPoint = self.getExtruderOffReversalPoint( afterSegment, afterSegmentComplex, beforeSegment, beforeSegmentComplex, location ) + if extruderOffReversalPoint != None: + return extruderOffReversalPoint + bevelRadius = min( thirdAfterSegmentLength, self.filletRadius ) + bevelRadius = min( thirdBeforeSegmentLength, bevelRadius ) + self.shouldAddLine = False + beforePoint = euclidean.getPointPlusSegmentWithLength( bevelRadius * abs( beforeSegment ) / beforeSegmentComplexLength, location, beforeSegment ) + self.addLinearMovePoint( self.feedRateMinute, beforePoint ) + afterPoint = euclidean.getPointPlusSegmentWithLength( bevelRadius * abs( afterSegment ) / afterSegmentComplexLength, location, afterSegment ) + self.addLinearMovePoint( self.getCornerFeedRate(), afterPoint ) + return afterPoint + + +class ArcSegmentSkein( BevelSkein ): + "A class to arc segment a skein of extrusions." + def addArc( self, afterCenterDifferenceAngle, afterPoint, beforeCenterSegment, beforePoint, center ): + "Add arc segments to the filleted skein." + absoluteDifferenceAngle = abs( afterCenterDifferenceAngle ) +# steps = int( math.ceil( absoluteDifferenceAngle * 1.5 ) ) + steps = int( math.ceil( min( absoluteDifferenceAngle * 1.5, absoluteDifferenceAngle * abs( beforeCenterSegment ) / self.curveSection ) ) ) + stepPlaneAngle = euclidean.getWiddershinsUnitPolar( afterCenterDifferenceAngle / steps ) + for step in xrange( 1, steps ): + beforeCenterSegment = euclidean.getRoundZAxisByPlaneAngle( stepPlaneAngle, beforeCenterSegment ) + arcPoint = center + beforeCenterSegment + self.addLinearMovePoint( self.getCornerFeedRate(), arcPoint ) + self.addLinearMovePoint( self.getCornerFeedRate(), afterPoint ) + + def splitPointGetAfter( self, location, nextLocation ): + "Fillet a point into arc segments and return the end of the last segment." + if self.filletRadius < 2.0 * self.minimumRadius: + return location + afterSegment = nextLocation - location + afterSegmentComplex = afterSegment.dropAxis() + thirdAfterSegmentLength = 0.333 * abs( afterSegmentComplex ) + if thirdAfterSegmentLength < self.minimumRadius: + return location + beforeSegment = self.oldLocation - location + beforeSegmentComplex = beforeSegment.dropAxis() + thirdBeforeSegmentLength = 0.333 * abs( beforeSegmentComplex ) + if thirdBeforeSegmentLength < self.minimumRadius: + return location + extruderOffReversalPoint = self.getExtruderOffReversalPoint( afterSegment, afterSegmentComplex, beforeSegment, beforeSegmentComplex, location ) + if extruderOffReversalPoint != None: + return extruderOffReversalPoint + bevelRadius = min( thirdAfterSegmentLength, self.filletRadius ) + bevelRadius = min( thirdBeforeSegmentLength, bevelRadius ) + self.shouldAddLine = False + beforePoint = euclidean.getPointPlusSegmentWithLength( bevelRadius * abs( beforeSegment ) / abs( beforeSegmentComplex ), location, beforeSegment ) + self.addLinearMovePoint( self.feedRateMinute, beforePoint ) + afterPoint = euclidean.getPointPlusSegmentWithLength( bevelRadius * abs( afterSegment ) / abs( afterSegmentComplex ), location, afterSegment ) + afterPointComplex = afterPoint.dropAxis() + beforePointComplex = beforePoint.dropAxis() + locationComplex = location.dropAxis() + midpoint = 0.5 * ( afterPoint + beforePoint ) + midpointComplex = midpoint.dropAxis() + midpointMinusLocationComplex = midpointComplex - locationComplex + midpointLocationLength = abs( midpointMinusLocationComplex ) + if midpointLocationLength < 0.01 * self.filletRadius: + self.addLinearMovePoint( self.getCornerFeedRate(), afterPoint ) + return afterPoint + midpointAfterPointLength = abs( midpointComplex - afterPointComplex ) + midpointCenterLength = midpointAfterPointLength * midpointAfterPointLength / midpointLocationLength + radius = math.sqrt( midpointCenterLength * midpointCenterLength + midpointAfterPointLength * midpointAfterPointLength ) + centerComplex = midpointComplex + midpointMinusLocationComplex * midpointCenterLength / midpointLocationLength + center = Vector3( centerComplex.real, centerComplex.imag, midpoint.z ) + afterCenterComplex = afterPointComplex - centerComplex + beforeCenter = beforePoint - center + angleDifference = euclidean.getAngleDifferenceByComplex( afterCenterComplex, beforeCenter.dropAxis() ) + self.addArc( angleDifference, afterPoint, beforeCenter, beforePoint, center ) + return afterPoint + + +class ArcPointSkein( ArcSegmentSkein ): + "A class to arc point a skein of extrusions." + def addArc( self, afterCenterDifferenceAngle, afterPoint, beforeCenterSegment, beforePoint, center ): + "Add an arc point to the filleted skein." + if afterCenterDifferenceAngle == 0.0: + return + afterPointMinusBefore = afterPoint - beforePoint + centerMinusBefore = center - beforePoint + firstWord = 'G3' + if afterCenterDifferenceAngle < 0.0: + firstWord = 'G2' + centerMinusBeforeComplex = centerMinusBefore.dropAxis() + if abs( centerMinusBeforeComplex ) <= 0.0: + return + radius = abs( centerMinusBefore ) + arcDistanceZ = complex( abs( afterCenterDifferenceAngle ) * radius, afterPointMinusBefore.z ) + distance = abs( arcDistanceZ ) + if distance <= 0.0: + return + line = self.distanceFeedRate.getFirstWordMovement( firstWord, afterPointMinusBefore ) + self.getRelativeCenter( centerMinusBeforeComplex ) + cornerFeedRate = self.getCornerFeedRate() + if cornerFeedRate != None: + line += ' F' + self.distanceFeedRate.getRounded(cornerFeedRate) + self.distanceFeedRate.addLine(line) + + def getRelativeCenter( self, centerMinusBeforeComplex ): + "Get the relative center." + return ' I%s J%s' % ( self.distanceFeedRate.getRounded( centerMinusBeforeComplex.real ), self.distanceFeedRate.getRounded( centerMinusBeforeComplex.imag ) ) + + +class ArcRadiusSkein( ArcPointSkein ): + "A class to arc radius a skein of extrusions." + def getRelativeCenter( self, centerMinusBeforeComplex ): + "Get the relative center." + radius = abs( centerMinusBeforeComplex ) + return ' R' + ( self.distanceFeedRate.getRounded(radius) ) + + +class FilletRepository: + "A class to handle the fillet settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.fillet.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Filleted', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Fillet') + self.activateFillet = settings.BooleanSetting().getFromValue('Activate Fillet', self, False ) + self.filletProcedureChoiceLabel = settings.LabelDisplay().getFromName('Fillet Procedure Choice: ', self ) + filletLatentStringVar = settings.LatentStringVar() + self.arcPoint = settings.Radio().getFromRadio( filletLatentStringVar, 'Arc Point', self, False ) + self.arcRadius = settings.Radio().getFromRadio( filletLatentStringVar, 'Arc Radius', self, False ) + self.arcSegment = settings.Radio().getFromRadio( filletLatentStringVar, 'Arc Segment', self, False ) + self.bevel = settings.Radio().getFromRadio( filletLatentStringVar, 'Bevel', self, True ) + self.cornerFeedRateOverOperatingFeedRate = settings.FloatSpin().getFromValue( 0.8, 'Corner Feed Rate over Operating Feed Rate (ratio):', self, 1.2, 1.0 ) + self.filletRadiusOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.25, 'Fillet Radius over Perimeter Width (ratio):', self, 0.65, 0.35 ) + self.reversalSlowdownDistanceOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.3, 'Reversal Slowdown Distance over Perimeter Width (ratio):', self, 0.7, 0.5 ) + self.useIntermediateFeedRateInCorners = settings.BooleanSetting().getFromValue('Use Intermediate Feed Rate in Corners', self, True ) + self.executeTitle = 'Fillet' + + def execute(self): + "Fillet button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +def main(): + "Display the fillet dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fillet.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fillet.pyc new file mode 100644 index 0000000..8ebfb97 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/fillet.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/flow.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/flow.py new file mode 100644 index 0000000..c462de7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/flow.py @@ -0,0 +1,145 @@ +""" +This page is in the table of contents. +The flow script sets the flow rate by writing the M108 gcode. + +==Operation== +The default 'Activate Flow' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Flow Rate=== +Default is 210. + +Defines the flow rate which will be written following the M108 command. The flow rate is usually a PWM setting, but could be anything, like the rpm of the tool or the duty cycle of the tool. + +==Examples== +The following examples flow the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and flow.py. + +> python flow.py +This brings up the flow dialog. + +> python flow.py Screw Holder Bottom.stl +The flow tool is parsing the file: +Screw Holder Bottom.stl +.. +The flow tool has created the file: +.. Screw Holder Bottom_flow.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text='', flowRepository = None ): + "Flow the file or text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), flowRepository ) + +def getCraftedTextFromText( gcodeText, flowRepository = None ): + "Flow a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'flow'): + return gcodeText + if flowRepository == None: + flowRepository = settings.getReadRepository( FlowRepository() ) + if not flowRepository.activateFlow.value: + return gcodeText + return FlowSkein().getCraftedGcode( gcodeText, flowRepository ) + +def getNewRepository(): + 'Get new repository.' + return FlowRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Flow a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'flow', shouldAnalyze) + + +class FlowRepository: + "A class to handle the flow settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.flow.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Flow', self, '') + self.activateFlow = settings.BooleanSetting().getFromValue('Activate Flow', self, True ) + self.flowRate = settings.FloatSpin().getFromValue( 50.0, 'Flow Rate (arbitrary units):', self, 250.0, 210.0 ) + self.executeTitle = 'Flow' + + def execute(self): + "Flow button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class FlowSkein: + "A class to flow a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.lineIndex = 0 + self.lines = None + self.oldFlowRate = None + self.oldLocation = None + + def addFlowRateLine(self): + "Add flow rate line." + flowRate = self.flowRepository.flowRate.value + if flowRate != self.oldFlowRate: + self.distanceFeedRate.addLine('M108 S' + euclidean.getFourSignificantFigures(flowRate)) + self.oldFlowRate = flowRate + + def getCraftedGcode( self, gcodeText, flowRepository ): + "Parse gcode text and store the flow gcode." + self.flowRepository = flowRepository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('flow') + return + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the flow skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1' or firstWord == '(': + self.addFlowRateLine() + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the flow dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/home.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/home.py new file mode 100644 index 0000000..4b12df6 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/home.py @@ -0,0 +1,198 @@ +""" +This page is in the table of contents. +Home is a script to home the tool. + +The home manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Home + +==Operation== +The default 'Activate Home' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Name of Homing File=== +Default is homing.gcode. + +At the beginning of a each layer, home will add the commands of a gcode script with the name of the "Name of Homing File" setting, if one exists. Home 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. Home looks for those files in the alterations folder in the .skeinforge folder in the home directory. If it doesn't find the file it then looks in the alterations folder in the skeinforge_plugins folder. + +==Examples== +The following examples home the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and home.py. + +> python home.py +This brings up the home dialog. + +> python home.py Screw Holder Bottom.stl +The home tool is parsing the file: +Screw Holder Bottom.stl +.. +The home tool has created the file: +.. Screw Holder Bottom_home.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, repository = None ): + "Home a gcode linear move file or text." + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText( gcodeText, repository = None ): + "Home a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'home'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( HomeRepository() ) + if not repository.activateHome.value: + return gcodeText + return HomeSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return HomeRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Home a gcode linear move file. Chain home the gcode if it is not already homed." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'home', shouldAnalyze) + + +class HomeRepository: + "A class to handle the home settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.home.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Home', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_home') + self.activateHome = settings.BooleanSetting().getFromValue('Activate Home', self, True ) + self.nameOfHomingFile = settings.StringSetting().getFromValue('Name of Homing File:', self, 'homing.gcode') + self.executeTitle = 'Home' + + def execute(self): + "Home button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class HomeSkein: + "A class to home a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.highestZ = None + self.homingLines = [] + self.layerCount = settings.LayerCount() + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + self.shouldHome = False + self.travelFeedRateMinute = 957.0 + + def addFloat( self, begin, end ): + "Add dive to the original height." + beginEndDistance = begin.distance(end) + alongWay = self.absolutePerimeterWidth / beginEndDistance + closeToEnd = euclidean.getIntermediateLocation( alongWay, end, begin ) + closeToEnd.z = self.highestZ + self.distanceFeedRate.addLine( self.distanceFeedRate.getLinearGcodeMovementWithFeedRate( self.travelFeedRateMinute, closeToEnd.dropAxis(), closeToEnd.z ) ) + + def addHomeTravel( self, splitLine ): + "Add the home travel gcode." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.highestZ = max( self.highestZ, location.z ) + if not self.shouldHome: + return + self.shouldHome = False + if self.oldLocation == None: + return + if self.extruderActive: + self.distanceFeedRate.addLine('M103') + self.addHopUp( self.oldLocation ) + self.distanceFeedRate.addLinesSetAbsoluteDistanceMode( self.homingLines ) + self.addHopUp( self.oldLocation ) + self.addFloat( self.oldLocation, location ) + if self.extruderActive: + self.distanceFeedRate.addLine('M101') + + def addHopUp(self, location): + "Add hop to highest point." + locationUp = Vector3( location.x, location.y, self.highestZ ) + self.distanceFeedRate.addLine( self.distanceFeedRate.getLinearGcodeMovementWithFeedRate( self.travelFeedRateMinute, locationUp.dropAxis(), locationUp.z ) ) + + def getCraftedGcode( self, gcodeText, repository ): + "Parse gcode text and store the home gcode." + self.repository = repository + self.homingLines = settings.getAlterationFileLines(repository.nameOfHomingFile.value) + if len(self.homingLines) < 1: + return gcodeText + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization( repository ) + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def parseInitialization( self, repository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('home') + return + elif firstWord == '(': + self.absolutePerimeterWidth = abs(float(splitLine[1])) + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the bevel gcode." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.addHomeTravel(splitLine) + self.oldLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + elif firstWord == '(': + self.layerCount.printProgressIncrement('home') + if len(self.homingLines) > 0: + self.shouldHome = True + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the home dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/home.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/home.pyc new file mode 100644 index 0000000..d4aa427 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/home.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/hop.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/hop.py new file mode 100644 index 0000000..5ec5302 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/hop.py @@ -0,0 +1,212 @@ +""" +This page is in the table of contents. +Hop is a script to raise the extruder when it is not extruding. + +The hop manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Hop + +==Operation== +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. + +==Settings== +===Hop Over Layer Thickness=== +Default is one. + +Defines the ratio of the hop height over the layer thickness, this is the most important hop setting. + +===Minimum Hop Angle=== +Default is 20 degrees. + +Defines 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. + +==Examples== +The following examples hop the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and hop.py. + +> python hop.py +This brings up the hop dialog. + +> python hop.py Screw Holder Bottom.stl +The hop tool is parsing the file: +Screw Holder Bottom.stl +.. +The hop tool has created the file: +.. Screw Holder Bottom_hop.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, hopRepository = None ): + "Hop a gcode linear move text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), hopRepository ) + +def getCraftedTextFromText( gcodeText, hopRepository = None ): + "Hop a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'hop'): + return gcodeText + if hopRepository == None: + hopRepository = settings.getReadRepository( HopRepository() ) + if not hopRepository.activateHop.value: + return gcodeText + return HopSkein().getCraftedGcode( gcodeText, hopRepository ) + +def getNewRepository(): + 'Get new repository.' + return HopRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Hop a gcode linear move file. Chain hop the gcode if it is not already hopped." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'hop', shouldAnalyze) + + +class HopRepository: + "A class to handle the hop settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.hop.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Hop', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Hop') + self.activateHop = settings.BooleanSetting().getFromValue('Activate Hop', self, False ) + self.hopOverLayerThickness = settings.FloatSpin().getFromValue( 0.5, 'Hop Over Layer Thickness (ratio):', self, 1.5, 1.0 ) + self.minimumHopAngle = settings.FloatSpin().getFromValue( 20.0, 'Minimum Hop Angle (degrees):', self, 60.0, 30.0 ) + self.executeTitle = 'Hop' + + def execute(self): + "Hop button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class HopSkein: + "A class to hop a skein of extrusions." + def __init__(self): + 'Initialize' + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.feedRateMinute = 961.0 + self.hopHeight = 0.4 + self.hopDistance = self.hopHeight + self.justDeactivated = False + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + + def getCraftedGcode( self, gcodeText, hopRepository ): + "Parse gcode text and store the hop gcode." + self.lines = archive.getTextLines(gcodeText) + self.minimumSlope = math.tan( math.radians( hopRepository.minimumHopAngle.value ) ) + self.parseInitialization( hopRepository ) + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getHopLine(self, line): + "Get hopped gcode line." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + if self.extruderActive: + return line + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + highestZ = location.z + if self.oldLocation != None: + highestZ = max( highestZ, self.oldLocation.z ) + highestZHop = highestZ + self.hopHeight + locationComplex = location.dropAxis() + if self.justDeactivated: + oldLocationComplex = self.oldLocation.dropAxis() + distance = abs( locationComplex - oldLocationComplex ) + if distance < self.minimumDistance: + if self.isNextTravel() or distance == 0.0: + return self.distanceFeedRate.getLineWithZ( line, splitLine, highestZHop ) + alongRatio = min( 0.41666666, self.hopDistance / distance ) + oneMinusAlong = 1.0 - alongRatio + closeLocation = oldLocationComplex * oneMinusAlong + locationComplex * alongRatio + self.distanceFeedRate.addLine( self.distanceFeedRate.getLineWithZ( line, splitLine, highestZHop ) ) + if self.isNextTravel(): + return self.distanceFeedRate.getLineWithZ( line, splitLine, highestZHop ) + farLocation = oldLocationComplex * alongRatio + locationComplex * oneMinusAlong + self.distanceFeedRate.addGcodeMovementZWithFeedRate( self.feedRateMinute, farLocation, highestZHop ) + return line + if self.isNextTravel(): + return self.distanceFeedRate.getLineWithZ( line, splitLine, highestZHop ) + return line + + def isNextTravel(self): + "Determine if there is another linear travel before the thread ends." + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + return True + if firstWord == 'M101': + return False + return False + + def parseInitialization( self, hopRepository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '(': + layerThickness = float(splitLine[1]) + self.hopHeight = hopRepository.hopOverLayerThickness.value * layerThickness + self.hopDistance = self.hopHeight / self.minimumSlope + self.minimumDistance = 0.5 * layerThickness + elif firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('hop') + return + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the bevel gcode." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if self.distanceFeedRate.getIsAlteration(line): + return + if firstWord == 'G1': + line = self.getHopLine(line) + self.oldLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.justDeactivated = False + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + self.justDeactivated = True + self.distanceFeedRate.addLineCheckAlteration(line) + + +def main(): + "Display the hop dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/hop.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/hop.pyc new file mode 100644 index 0000000..a877654 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/hop.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/inset.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/inset.py new file mode 100644 index 0000000..081ce3f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/inset.py @@ -0,0 +1,415 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Inset will inset the outside outlines by half the perimeter width, and outset the inside outlines by the same amount. + +The inset manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Inset + +==Settings== +===Add Custom Code for Temperature Reading=== +Default is on. + +When selected, the M105 custom code for temperature reading will be added at the beginning of the file. + +===Bridge Width Multiplier=== +Default is one. + +Defines the ratio of the extrusion width of a bridge layer over the extrusion width of the typical non bridge layers. + +===Loop Order Choice=== +Default loop order choice is 'Ascending Area'. + +When overlap is to be removed, for each loop, the overlap is checked against the list of loops already extruded. If the latest loop overlaps an already extruded loop, the overlap is removed from the latest loop. The loops are ordered according to their areas. + +====Ascending Area==== +When selected, the loops will be ordered in ascending area. With thin walled parts, if overlap is being removed the outside of the container will not be extruded. Holes will be the correct size. + +====Descending Area==== +When selected, the loops will be ordered in descending area. With thin walled parts, if overlap is being removed the inside of the container will not be extruded. Holes will be missing the interior wall so they will be slightly wider than model size. + +===Overlap Removal Width over Perimeter Width=== +Default is 0.6. + +Defines the ratio of the overlap removal width over the perimeter width. Any part of the extrusion that comes within the overlap removal width of another is removed. This is to prevent the extruder from depositing two extrusions right beside each other. If the 'Overlap Removal Width over Perimeter Width' is less than 0.2, the overlap will not be removed. + +===Turn Extruder Heater Off at Shut Down=== +Default is on. + +When selected, the M104 S0 gcode line will be added to the end of the file to turn the extruder heater off by setting the extruder heater temperature to 0. + +==Examples== +The following examples inset the file 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 inset dialog. + +> python inset.py Screw Holder Bottom.stl +The inset tool is parsing the file: +Screw Holder Bottom.stl +.. +The inset tool has created the file: +.. Screw Holder Bottom_inset.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addAlreadyFilledArounds( alreadyFilledArounds, loop, radius ): + "Add already filled loops around loop to alreadyFilledArounds." + radius = abs(radius) + alreadyFilledLoop = [] + slightlyGreaterThanRadius = intercircle.globalIntercircleMultiplier * radius + muchGreaterThanRadius = 2.5 * radius + centers = intercircle.getCentersFromLoop( loop, slightlyGreaterThanRadius ) + for center in centers: + alreadyFilledInset = intercircle.getSimplifiedInsetFromClockwiseLoop( center, radius ) + if intercircle.isLargeSameDirection( alreadyFilledInset, center, radius ): + 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." + width = abs( width ) + exclusionWidth = 0.6 * width + slope = 0.2 + 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.05 + 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 * segmentLength ) + 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.getRotatedComplexes( normalizedSegment, outline ) ) + +def getCraftedText( fileName, text='', repository=None): + "Inset the preface file or text." + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + "Inset the preface gcode text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'inset'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( InsetRepository() ) + return InsetSkein().getCraftedGcode(gcodeText, repository) + +def getInteriorSegments(loops, segments): + 'Get segments inside the loops.' + interiorSegments = [] + for segment in segments: + center = 0.5 * (segment[0].point + segment[1].point) + if euclidean.getIsInFilledRegion(loops, center): + interiorSegments.append(segment) + return interiorSegments + +def getIsIntersectingWithinList(loop, loopList): + "Determine if the loop is intersecting or is within the loop list." + leftPoint = euclidean.getLeftPoint(loop) + for otherLoop in loopList: + if euclidean.getNumberOfIntersectionsToLeft(otherLoop, leftPoint) % 2 == 1: + return True + return euclidean.isLoopIntersectingLoops(loop, loopList) + +def getNewRepository(): + 'Get new repository.' + return InsetRepository() + +def getSegmentsFromLoopListsPoints( 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: + rotatedLoopLists.append(euclidean.getRotatedComplexLists(segmentYMirror, loopList)) + xIntersectionIndexList = [] + xIntersectionIndexList.append( euclidean.XIntersectionIndex( - 1, pointBeginRotated.real ) ) + xIntersectionIndexList.append( euclidean.XIntersectionIndex( - 1, pointEndRotated.real ) ) + euclidean.addXIntersectionIndexesFromLoopListsY( rotatedLoopLists, xIntersectionIndexList, pointBeginRotated.imag ) + segments = euclidean.getSegmentsFromXIntersectionIndexes( xIntersectionIndexList, pointBeginRotated.imag ) + for segment in segments: + for endpoint in segment: + endpoint.point *= normalizedSegment + return segments + +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 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 isIntersectingWithinLists( loop, loopLists ): + "Determine if the loop is intersecting or is within the loop lists." + for loopList in loopLists: + if getIsIntersectingWithinList( loop, loopList ): + return True + return False + +def writeOutput(fileName, shouldAnalyze=True): + "Inset the carving of a gcode file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'inset', shouldAnalyze) + + +class InsetRepository: + "A class to handle the inset settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.inset.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Inset', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Inset') + self.addCustomCodeForTemperatureReading = settings.BooleanSetting().getFromValue('Add Custom Code for Temperature Reading', self, True ) + self.bridgeWidthMultiplier = settings.FloatSpin().getFromValue( 0.8, 'Bridge Width Multiplier (ratio):', self, 1.2, 1.0 ) + self.loopOrderChoice = settings.MenuButtonDisplay().getFromName('Loop Order Choice:', self ) + self.loopOrderAscendingArea = settings.MenuRadio().getFromMenuButtonDisplay( self.loopOrderChoice, 'Ascending Area', self, True ) + self.loopOrderDescendingArea = settings.MenuRadio().getFromMenuButtonDisplay( self.loopOrderChoice, 'Descending Area', self, False ) + self.overlapRemovalWidthOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.3, 'Overlap Removal Width over Perimeter Width (ratio):', self, 0.9, 0.6 ) + self.turnExtruderHeaterOffAtShutDown = settings.BooleanSetting().getFromValue('Turn Extruder Heater Off at Shut Down', self, True ) + self.executeTitle = 'Inset' + + def execute(self): + "Inset button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_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.distanceFeedRate = gcodec.DistanceFeedRate() + self.layerCount = settings.LayerCount() + self.lineIndex = 0 + self.rotatedLoopLayer = None + + def addGcodeFromPerimeterPaths(self, isIntersectingSelf, loop, loopLists, radius, rotatedLoopLayer): + "Add the perimeter paths to the output." + segments = [] + outlines = [] + thickOutlines = [] + allLoopLists = loopLists[:] + [thickOutlines] + aroundLists = loopLists + for pointIndex in xrange(len(loop)): + pointBegin = loop[pointIndex] + pointEnd = loop[(pointIndex + 1) % len(loop)] + if isIntersectingSelf: + if euclidean.isLineIntersectingLoops(outlines, pointBegin, pointEnd): + segments += getSegmentsFromLoopListsPoints(allLoopLists, pointBegin, pointEnd) + else: + segments += getSegmentsFromLoopListsPoints(loopLists, pointBegin, pointEnd) + addSegmentOutline(False, outlines, pointBegin, pointEnd, self.overlapRemovalWidth) + addSegmentOutline(True, thickOutlines, pointBegin, pointEnd, self.overlapRemovalWidth) + else: + segments += getSegmentsFromLoopListsPoints(loopLists, pointBegin, pointEnd) + perimeterPaths = [] + path = [] + muchSmallerThanRadius = 0.1 * radius + segments = getInteriorSegments(rotatedLoopLayer.loops, segments) + 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) + muchGreaterThanRadius = 6.0 * radius + for perimeterPath in perimeterPaths: + if euclidean.getPathLength(perimeterPath) > muchGreaterThanRadius: + self.distanceFeedRate.addGcodeFromThreadZ(perimeterPath, rotatedLoopLayer.z) + + def addGcodeFromRemainingLoop(self, loop, loopLists, radius, rotatedLoopLayer): + "Add the remainder of the loop which does not overlap the alreadyFilledArounds loops." + centerOutset = intercircle.getLargestCenterOutsetLoopFromLoopRegardless(loop, radius) + euclidean.addNestedRingBeginning(self.distanceFeedRate, centerOutset.outset, rotatedLoopLayer.z) + self.addGcodePerimeterBlockFromRemainingLoop(centerOutset.center, loopLists, radius, rotatedLoopLayer) + self.distanceFeedRate.addLine('()') + self.distanceFeedRate.addLine('()') + + def addGcodePerimeterBlockFromRemainingLoop(self, loop, loopLists, radius, rotatedLoopLayer): + "Add the perimter block remainder of the loop which does not overlap the alreadyFilledArounds loops." + if self.repository.overlapRemovalWidthOverPerimeterWidth.value < 0.2: + self.distanceFeedRate.addPerimeterBlock(loop, rotatedLoopLayer.z) + return + isIntersectingSelf = isIntersectingItself(loop, self.overlapRemovalWidth) + if isIntersectingWithinLists(loop, loopLists) or isIntersectingSelf: + self.addGcodeFromPerimeterPaths(isIntersectingSelf, loop, loopLists, radius, rotatedLoopLayer) + else: + self.distanceFeedRate.addPerimeterBlock(loop, rotatedLoopLayer.z) + addAlreadyFilledArounds(loopLists, loop, self.overlapRemovalWidth) + + def addInitializationToOutput(self): + "Add initialization gcode to the output." + if self.repository.addCustomCodeForTemperatureReading.value: + self.distanceFeedRate.addLine('M105') # Custom code for temperature reading. + + def addInset(self, rotatedLoopLayer): + "Add inset to the layer." + alreadyFilledArounds = [] + halfWidth = self.halfPerimeterWidth + if rotatedLoopLayer.rotation != None: + halfWidth *= self.repository.bridgeWidthMultiplier.value + self.distanceFeedRate.addTagBracketedLine('bridgeRotation', rotatedLoopLayer.rotation) + extrudateLoops = intercircle.getInsetLoopsFromLoops(halfWidth, rotatedLoopLayer.loops) + triangle_mesh.sortLoopsInOrderOfArea(not self.repository.loopOrderAscendingArea.value, extrudateLoops) + for extrudateLoop in extrudateLoops: + self.addGcodeFromRemainingLoop(extrudateLoop, alreadyFilledArounds, halfWidth, rotatedLoopLayer) + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the bevel gcode." + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '(': + self.addInitializationToOutput() + self.distanceFeedRate.addTagBracketedLine( + 'bridgeWidthMultiplier', self.distanceFeedRate.getRounded( self.repository.bridgeWidthMultiplier.value ) ) + elif firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('inset') + return + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.halfPerimeterWidth = 0.5 * self.perimeterWidth + self.overlapRemovalWidth = self.perimeterWidth * self.repository.overlapRemovalWidthOverPerimeterWidth.value + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the inset skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + self.boundary.append(location.dropAxis()) + elif firstWord == '(': + self.rotatedLoopLayer.rotation = gcodec.getRotationBySplitLine(splitLine) + elif firstWord == '()': + self.distanceFeedRate.addLine(line) + if self.repository.turnExtruderHeaterOffAtShutDown.value: + self.distanceFeedRate.addLine('M104 S0') # Turn extruder heater off. + return + elif firstWord == '(': + self.layerCount.printProgressIncrement('inset') + self.rotatedLoopLayer = euclidean.RotatedLoopLayer(float(splitLine[1])) + self.distanceFeedRate.addLine(line) + elif firstWord == '()': + self.addInset( self.rotatedLoopLayer ) + self.rotatedLoopLayer = None + elif firstWord == '()': + self.boundary = [] + self.rotatedLoopLayer.loops.append( self.boundary ) + if self.rotatedLoopLayer == None: + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the inset dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/inset.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/inset.pyc new file mode 100644 index 0000000..377c7fc Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/inset.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py new file mode 100644 index 0000000..44017be --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.py @@ -0,0 +1,253 @@ +""" +This page is in the table of contents. +Jitter jitters the loop end position to a different place on each layer to prevent the a ridge from forming. + +The jitter manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Jitter + +==Operation== +The default 'Activate Jitter' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Jitter Over Perimeter Width=== +Default is two. + +Defines the amount the loop ends will be jittered over the perimeter width. A high value means the loops will start all over the place and a low value means loops will start at roughly the same place on each layer. + +==Examples== +The following examples jitter the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and jitter.py. + +> python jitter.py +This brings up the jitter dialog. + +> python jitter.py Screw Holder Bottom.stl +The jitter tool is parsing the file: +Screw Holder Bottom.stl +.. +The jitter tool has created the file: +.. Screw Holder Bottom_jitter.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, jitterRepository = None ): + 'Jitter a gcode linear move text.' + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), jitterRepository ) + +def getCraftedTextFromText( gcodeText, jitterRepository = None ): + 'Jitter a gcode linear move text.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'jitter'): + return gcodeText + if jitterRepository == None: + jitterRepository = settings.getReadRepository( JitterRepository() ) + if not jitterRepository.activateJitter.value: + return gcodeText + return JitterSkein().getCraftedGcode( jitterRepository, gcodeText ) + +def getJitteredLoop( jitterDistance, jitterLoop ): + 'Get a jittered loop path.' + loopLength = euclidean.getLoopLength( jitterLoop ) + lastLength = 0.0 + pointIndex = 0 + totalLength = 0.0 + jitterPosition = ( jitterDistance + 256.0 * loopLength ) % loopLength + while totalLength < jitterPosition and pointIndex < len( jitterLoop ): + firstPoint = jitterLoop[pointIndex] + secondPoint = jitterLoop[ (pointIndex + 1) % len( jitterLoop ) ] + pointIndex += 1 + lastLength = totalLength + totalLength += abs(firstPoint - secondPoint) + remainingLength = jitterPosition - lastLength + pointIndex = pointIndex % len( jitterLoop ) + ultimateJitteredPoint = jitterLoop[pointIndex] + penultimateJitteredPointIndex = ( pointIndex + len( jitterLoop ) - 1 ) % len( jitterLoop ) + penultimateJitteredPoint = jitterLoop[ penultimateJitteredPointIndex ] + segment = ultimateJitteredPoint - penultimateJitteredPoint + segmentLength = abs(segment) + originalOffsetLoop = euclidean.getAroundLoop( pointIndex, pointIndex, jitterLoop ) + if segmentLength <= 0.0: + return originalOffsetLoop + newUltimatePoint = penultimateJitteredPoint + segment * remainingLength / segmentLength + return [newUltimatePoint] + originalOffsetLoop + +def getNewRepository(): + 'Get new repository.' + return JitterRepository() + +def isLoopNumberEqual( betweenX, betweenXIndex, loopNumber ): + 'Determine if the loop number is equal.' + if betweenXIndex >= len( betweenX ): + return False + return betweenX[ betweenXIndex ].index == loopNumber + +def writeOutput(fileName, shouldAnalyze=True): + 'Jitter a gcode linear move file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'jitter', shouldAnalyze) + + +class JitterRepository: + 'A class to handle the jitter settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.jitter.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Jitter', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Jitter') + self.activateJitter = settings.BooleanSetting().getFromValue('Activate Jitter', self, True) + self.jitterOverPerimeterWidth = settings.FloatSpin().getFromValue(1.0, 'Jitter Over Perimeter Width (ratio):', self, 3.0, 2.0) + self.executeTitle = 'Jitter' + + def execute(self): + 'Jitter button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class JitterSkein: + 'A class to jitter a skein of extrusions.' + def __init__(self): + 'Initialize.' + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = None + self.isLoopPerimeter = False + self.layerCount = settings.LayerCount() + self.layerGolden = 0.0 + self.lineIndex = 0 + self.lines = None + self.loopPath = None + self.oldLocation = None + self.operatingFeedRatePerMinute = None + self.travelFeedRateMinute = None + + def addGcodeFromThreadZ( self, thread, z ): + 'Add a gcode thread to the output.' + if len(thread) > 0: + self.addGcodeMovementZ( self.travelFeedRateMinute, thread[0], z ) + else: + print('zero length vertex positions array which was skipped over, this should never happen.') + if len(thread) < 2: + return + self.distanceFeedRate.addLine('M101') + self.addGcodePathZ( self.feedRateMinute, thread[1 :], z ) + + def addGcodeMovementZ(self, feedRateMinute, point, z): + 'Add a movement to the output.' + if feedRateMinute == None: + feedRateMinute = self.operatingFeedRatePerMinute + self.distanceFeedRate.addGcodeMovementZWithFeedRate(feedRateMinute, point, z) + + def addGcodePathZ( self, feedRateMinute, path, z ): + 'Add a gcode path, without modifying the extruder, to the output.' + for point in path: + self.addGcodeMovementZ(feedRateMinute, point, z) + + def addTailoredLoopPath(self): + 'Add a clipped and jittered loop path.' + loop = getJitteredLoop(self.layerJitter, self.loopPath.path[: -1]) + loop = euclidean.getAwayPoints(loop, 0.2 * self.perimeterWidth) + self.addGcodeFromThreadZ(loop + [loop[0]], self.loopPath.z) + self.loopPath = None + + def getCraftedGcode(self, jitterRepository, gcodeText): + 'Parse gcode text and store the jitter gcode.' + if jitterRepository.jitterOverPerimeterWidth.value == 0.0: + print('Warning, Jitter Over Perimeter Width is zero so thing will be done.') + return gcodeText + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization(jitterRepository) + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + self.parseLine(self.lines[self.lineIndex]) + return self.distanceFeedRate.output.getvalue() + + def parseInitialization( self, jitterRepository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('jitter') + return + elif firstWord == '(': + self.operatingFeedRatePerMinute = 60.0 * float(splitLine[1]) + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.jitter = jitterRepository.jitterOverPerimeterWidth.value * self.perimeterWidth + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line, jitter it and add it to the jitter skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.setFeedRateLocationLoopPath(line, splitLine) + if self.loopPath != None: + self.loopPath.path.append(self.oldLocation.dropAxis()) + return + elif firstWord == 'M101': + if self.loopPath != None: + return + elif firstWord == 'M103': + self.isLoopPerimeter = False + if self.loopPath != None: + self.addTailoredLoopPath() + elif firstWord == '(': + self.layerCount.printProgressIncrement('jitter') + self.layerGolden = math.fmod(self.layerGolden + 0.61803398874989479, 1.0) + self.layerJitter = self.jitter * self.layerGolden - 0.5 + elif firstWord == '(' or firstWord == '(': + self.isLoopPerimeter = True + self.distanceFeedRate.addLine(line) + + def setFeedRateLocationLoopPath(self, line, splitLine): + 'Set the feedRateMinute, oldLocation and loopPath.' + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + self.oldLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if not self.isLoopPerimeter or self.loopPath != None: + return + for afterIndex in xrange(self.lineIndex + 1, len(self.lines)): + line = self.lines[afterIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1' or firstWord == 'M103': + return + elif firstWord == 'M101': + self.loopPath = euclidean.PathZ(self.oldLocation.z) + return + + +def main(): + 'Display the jitter dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.pyc new file mode 100644 index 0000000..efb4428 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/jitter.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lash.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lash.py new file mode 100644 index 0000000..5856249 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lash.py @@ -0,0 +1,171 @@ +""" +This page is in the table of contents. +Lash is a script to partially compensate for the backlash of the tool head. + +The lash manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Lash + +The lash tool is ported from Erik de Bruijn's 3D-to-5D-Gcode php GPL'd script at: +http://objects.reprap.org/wiki/3D-to-5D-Gcode.php + +The default values are from the settings in Erik's 3D-to-5D-Gcode, I believe the settings are used on his Darwin reprap. + +==Operation== +The default 'Activate Lash' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===X Backlash=== +Default is 0.2 millimeters. + +Defines the distance the tool head will be lashed in the X direction. + +===Y Backlash=== +Default is 0.2 millimeters. + +Defines the distance the tool head will be lashed in the Y direction. + +==Examples== +The following examples lash the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and lash.py. + +> python lash.py +This brings up the lash dialog. + +> python lash.py Screw Holder Bottom.stl +The lash tool is parsing the file: +Screw Holder Bottom.stl +.. +The lash tool has created the file: +.. Screw Holder Bottom_lash.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, lashRepository = None ): + "Get a lashed gcode linear move text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), lashRepository ) + +def getCraftedTextFromText( gcodeText, lashRepository = None ): + "Get a lashed gcode linear move text from text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'lash'): + return gcodeText + if lashRepository == None: + lashRepository = settings.getReadRepository( LashRepository() ) + if not lashRepository.activateLash.value: + return gcodeText + return LashSkein().getCraftedGcode( gcodeText, lashRepository ) + +def getNewRepository(): + 'Get new repository.' + return LashRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Lash a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'lash', shouldAnalyze) + + +class LashRepository: + "A class to handle the lash settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.lash.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Lash', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Lash') + self.activateLash = settings.BooleanSetting().getFromValue('Activate Lash', self, False ) + self.xBacklash = settings.FloatSpin().getFromValue( 0.1, 'X Backlash (mm):', self, 0.5, 0.2 ) + self.yBacklash = settings.FloatSpin().getFromValue( 0.1, 'Y Backlash (mm):', self, 0.5, 0.3 ) + self.executeTitle = 'Lash' + + def execute(self): + "Lash button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class LashSkein: + "A class to lash a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = 958.0 + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + + def getCraftedGcode( self, gcodeText, lashRepository ): + "Parse gcode text and store the lash gcode." + self.lines = archive.getTextLines(gcodeText) + self.lashRepository = lashRepository + self.xBacklash = lashRepository.xBacklash.value + self.yBacklash = lashRepository.yBacklash.value + self.parseInitialization() + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLash(line) + return self.distanceFeedRate.output.getvalue() + + def getLashedLine( self, line, location, splitLine ): + "Get lashed gcode line." + if self.oldLocation == None: + return line + if location.x > self.oldLocation.x: + line = self.distanceFeedRate.getLineWithX( line, splitLine, location.x + self.xBacklash ) + else: + line = self.distanceFeedRate.getLineWithX( line, splitLine, location.x - self.xBacklash ) + if location.y > self.oldLocation.y: + line = self.distanceFeedRate.getLineWithY( line, splitLine, location.y + self.yBacklash ) + else: + line = self.distanceFeedRate.getLineWithY( line, splitLine, location.y - self.yBacklash ) + return line + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('lash') + return + self.distanceFeedRate.addLine(line) + + def parseLash(self, line): + "Parse a gcode line and add it to the lash skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + line = self.getLashedLine( line, location, splitLine ) + self.oldLocation = location + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the lash dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lash.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lash.pyc new file mode 100644 index 0000000..1864470 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lash.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lift.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lift.py new file mode 100644 index 0000000..090f655 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/lift.py @@ -0,0 +1,195 @@ +""" +This page is in the table of contents. +Lift will change the altitude of the cutting tool when it is on so that it will cut through the slab at the correct altitude. It will also lift the gcode when the tool is off so that the cutting tool will clear the top of the slab. + +==Operation== +The default 'Activate Lift' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Cutting Lift over Layer Step=== +Default is minus 0.5, because the end mill is the more common tool. + +Defines the ratio of the amount the cutting tool will be lifted over the layer step. If whittle is off the layer step will be the layer thickness, if it is on, it will be the layer step from the whittle gcode. If the cutting tool is like an end mill, where the cutting happens until the end of the tool, then the 'Cutting Lift over Layer Step' should be minus 0.5, so that the end mill cuts to the bottom of the slab. If the cutting tool is like a laser, where the cutting happens around the focal point. the 'Cutting Lift over Layer Step' should be zero, so that the cutting action will be focused in the middle of the slab. + +===Clearance above Top=== +Default is 5 millimeters. + +Defines the distance above the top of the slab the cutting tool will be lifted when will tool is off so that the cutting tool will clear the top of the slab. + +==Examples== +The following examples lift the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and lift.py. + +> python lift.py +This brings up the lift dialog. + +> python lift.py Screw Holder Bottom.stl +The lift tool is parsing the file: +Screw Holder Bottom.stl +.. +The lift tool has created the file: +.. Screw Holder Bottom_lift.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text='', liftRepository = None ): + "Lift the preface file or text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), liftRepository ) + +def getCraftedTextFromText( gcodeText, liftRepository = None ): + "Lift the preface gcode text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'lift'): + return gcodeText + if liftRepository == None: + liftRepository = settings.getReadRepository( LiftRepository() ) + if not liftRepository.activateLift.value: + return gcodeText + return LiftSkein().getCraftedGcode( liftRepository, gcodeText ) + +def getNewRepository(): + 'Get new repository.' + return LiftRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Lift the carving of a gcode file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'lift', shouldAnalyze) + + +class LiftRepository: + "A class to handle the lift settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.lift.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Lifted', self, '') + self.activateLift = settings.BooleanSetting().getFromValue('Activate Lift', self, True ) + self.cuttingLiftOverLayerStep = settings.FloatSpin().getFromValue( - 1.0, 'Cutting Lift over Layer Step (ratio):', self, 1.0, - 0.5 ) + self.clearanceAboveTop = settings.FloatSpin().getFromValue( 0.0, 'Clearance above Top (mm):', self, 10.0, 5.0 ) + self.executeTitle = 'Lift' + + def execute(self): + "Lift button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class LiftSkein: + "A class to lift a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.layerStep = None + self.layerThickness = 0.3333333333 + self.lineIndex = 0 + self.maximumZ = - 912345678.0 + self.oldLocation = None + self.previousActiveMovementLine = None + self.previousInactiveMovementLine = None + + def addPreviousInactiveMovementLineIfNecessary(self): + "Add the previous inactive movement line if necessary." + if self.previousInactiveMovementLine != None: + self.distanceFeedRate.addLine( self.previousInactiveMovementLine ) + self.previousInactiveMovementLine = None + + def getCraftedGcode( self, liftRepository, gcodeText ): + "Parse gcode text and store the lift gcode." + self.liftRepository = liftRepository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + self.oldLocation = None + if self.layerStep == None: + self.layerStep = self.layerThickness + self.cuttingLift = self.layerStep * liftRepository.cuttingLiftOverLayerStep.value + self.setMaximumZ() + self.travelZ = self.maximumZ + 0.5 * self.layerStep + liftRepository.clearanceAboveTop.value + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getLinearMove( self, line, location, splitLine ): + "Get the linear move." + if self.extruderActive: + z = location.z + self.cuttingLift + return self.distanceFeedRate.getLineWithZ( line, splitLine, z ) + if self.previousActiveMovementLine != None: + previousActiveMovementLineSplit = self.previousActiveMovementLine.split() + self.distanceFeedRate.addLine( self.distanceFeedRate.getLineWithZ( self.previousActiveMovementLine, previousActiveMovementLineSplit, self.travelZ ) ) + self.previousActiveMovementLine = None + self.distanceFeedRate.addLine( self.distanceFeedRate.getLineWithZ( line, splitLine, self.travelZ ) ) + self.previousInactiveMovementLine = line + return '' + + 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.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('lift') + return + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + elif firstWord == '(': + self.layerStep = float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the lift skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + line = self.getLinearMove( line, location, splitLine ) + self.previousActiveMovementLine = line + self.oldLocation = location + elif firstWord == 'M101': + self.addPreviousInactiveMovementLineIfNecessary() + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + self.distanceFeedRate.addLine(line) + + def setMaximumZ(self): + "Set maximum z." + localOldLocation = None + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine( localOldLocation, splitLine ) + self.maximumZ = max( self.maximumZ, location.z ) + localOldLocation = location + + +def main(): + "Display the lift dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py new file mode 100644 index 0000000..f6229a7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/limit.py @@ -0,0 +1,198 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. + +Limit limts the feed rate of the tool head, so that the stepper motors are not driven too fast and skip steps. + +The maximum z feed rate is defined in speed. + +==Operation== +The default 'Activate Limit' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Maximum Initial Feed Rate=== +Default is one millimeter per second. + +Defines the maximum speed of the inital tool head move. + +==Examples== +The following examples limit the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and limit.py. + +> python limit.py +This brings up the limit dialog. + +> python limit.py Screw Holder Bottom.stl +The limit tool is parsing the file: +Screw Holder Bottom.stl +.. +The limit tool has created the file: +.. Screw Holder Bottom_limit.gcode + +""" + +#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 datetime import date +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/28/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, gcodeText='', repository=None): + 'Limit a gcode file or text.' + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, gcodeText), repository ) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Limit a gcode text.' + if gcodec.isProcedureDoneOrFileIsEmpty(gcodeText, 'limit'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(LimitRepository()) + if not repository.activateLimit.value: + return gcodeText + return LimitSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return LimitRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Limit a gcode file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'limit', shouldAnalyze) + + +class LimitRepository: + 'A class to handle the limit settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.limit.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Limit', self, '') + self.activateLimit = settings.BooleanSetting().getFromValue('Activate Limit', self, True) + self.maximumInitialFeedRate = settings.FloatSpin().getFromValue(0.5, 'Maximum Initial Feed Rate (mm/s):', self, 10.0, 1.0) + self.executeTitle = 'Limit' + + def execute(self): + 'Limit button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class LimitSkein: + 'A class to limit a skein of extrusions.' + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = None + self.lineIndex = 0 + self.maximumZDrillFeedRatePerSecond = 987654321.0 + self.oldLocation = None + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the limit gcode.' + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + self.maximumZDrillFeedRatePerSecond = min(self.maximumZDrillFeedRatePerSecond, self.maximumZTravelFeedRatePerSecond) + self.maximumZFeedRatePerSecond = self.maximumZTravelFeedRatePerSecond + for lineIndex in xrange(self.lineIndex, len(self.lines)): + self.parseLine( lineIndex ) + return self.distanceFeedRate.output.getvalue() + + def getLimitedInitialMovement(self, line, splitLine): + 'Get a limited linear movement.' + if self.oldLocation == None: + line = self.distanceFeedRate.getLineWithFeedRate(60.0 * self.repository.maximumInitialFeedRate.value, line, splitLine) + return line + + def getZLimitedLine(self, deltaZ, distance, line, splitLine): + 'Get a replaced z limited gcode movement line.' + zFeedRateSecond = self.feedRateMinute * deltaZ / distance / 60.0 + if zFeedRateSecond <= self.maximumZFeedRatePerSecond: + return line + limitedFeedRateMinute = self.feedRateMinute * self.maximumZFeedRatePerSecond / zFeedRateSecond + return self.distanceFeedRate.getLineWithFeedRate(limitedFeedRateMinute, line, splitLine) + + def getZLimitedLineArc(self, line, splitLine): + 'Get a replaced z limited gcode arc movement line.' + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + if self.feedRateMinute == None or self.oldLocation == None: + return line + relativeLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.oldLocation += relativeLocation + deltaZ = abs(relativeLocation.z) + distance = gcodec.getArcDistance(relativeLocation, splitLine) + return self.getZLimitedLine(deltaZ, distance, line, splitLine) + + def getZLimitedLineLinear(self, line, location, splitLine): + 'Get a replaced z limited gcode linear movement line.' + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + if location == self.oldLocation: + return '' + if self.feedRateMinute == None or self.oldLocation == None: + return line + deltaZ = abs(location.z - self.oldLocation.z) + distance = abs(location - self.oldLocation) + return self.getZLimitedLine(deltaZ, distance, line, splitLine) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('limit') + return + elif firstWord == '(': + self.maximumZDrillFeedRatePerSecond = float(splitLine[1]) + elif firstWord == '(': + self.maximumZTravelFeedRatePerSecond = float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine( self, lineIndex ): + 'Parse a gcode line and add it to the limit skein.' + line = self.lines[lineIndex].lstrip() + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + line = self.getLimitedInitialMovement(line, splitLine) + line = self.getZLimitedLineLinear(line, location, splitLine) + self.oldLocation = location + elif firstWord == 'G2' or firstWord == 'G3': + line = self.getZLimitedLineArc(line, splitLine) + elif firstWord == 'M101': + self.maximumZFeedRatePerSecond = self.maximumZDrillFeedRatePerSecond + elif firstWord == 'M103': + self.maximumZFeedRatePerSecond = self.maximumZTravelFeedRatePerSecond + self.distanceFeedRate.addLine(line) + + +def main(): + 'Display the limit dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/limit.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/limit.pyc new file mode 100644 index 0000000..03a1210 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/limit.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/mill.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/mill.py new file mode 100644 index 0000000..ef9c680 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/mill.py @@ -0,0 +1,380 @@ +""" +This page is in the table of contents. +Mill is a script to mill the outlines. + +==Operation== +The default 'Activate Mill' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Add Loops=== +====Add Inner Loops==== +Default is on. + +When selected, the inner milling loops will be added. + +====Add Outer Loops==== +Default is on. + +When selected, the outer milling loops will be added. + +===Cross Hatch=== +Default is on. + +When selected, there will be alternating horizontal and vertical milling paths, if it is off there will only be horizontal milling paths. + +===Loop Outset=== +====Loop Inner Outset over Perimeter Width==== +Default is 0.5. + +Defines the ratio of the amount the inner milling loop will be outset over the perimeter width. + +====Loop Outer Outset over Perimeter Width==== +Default is one. + +Defines the ratio of the amount the outer milling loop will be outset over the perimeter width. The 'Loop Outer Outset over Perimeter Width' ratio should be greater than the 'Loop Inner Outset over Perimeter Width' ratio. + +===Mill Width over Perimeter Width=== +Default is one. + +Defines the ratio of the mill line width over the perimeter width. If the ratio is one, all the material will be milled. The greater the 'Mill Width over Perimeter Width' the farther apart the mill lines will be and so less of the material will be directly milled, the remaining material might still be removed in chips if the ratio is not much greater than one. + +==Examples== +The following examples mill the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and mill.py. + +> python mill.py +This brings up the mill dialog. + +> python mill.py Screw Holder Bottom.stl +The mill tool is parsing the file: +Screw Holder Bottom.stl +.. +The mill tool has created the file: +Screw Holder Bottom_mill.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText = '', repository=None): + 'Mill the file or gcodeText.' + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, gcodeText), repository ) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Mill a gcode linear move gcodeText.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'mill'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( MillRepository() ) + if not repository.activateMill.value: + return gcodeText + return MillSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return MillRepository() + +def getPointsFromSegmentTable(segmentTable): + 'Get the points from the segment table.' + points = [] + segmentTableKeys = segmentTable.keys() + segmentTableKeys.sort() + for segmentTableKey in segmentTableKeys: + for segment in segmentTable[segmentTableKey]: + for endpoint in segment: + points.append(endpoint.point) + return points + +def isPointOfTableInLoop( loop, pointTable ): + 'Determine if a point in the point table is in the loop.' + for point in loop: + if point in pointTable: + return True + return False + +def writeOutput(fileName, shouldAnalyze=True): + 'Mill a gcode linear move file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'mill', shouldAnalyze) + + +class Average: + 'A class to hold values and get the average.' + def __init__(self): + self.reset() + + def addValue( self, value ): + 'Add a value to the total and the number of values.' + self.numberOfValues += 1 + self.total += value + + def getAverage(self): + 'Get the average.' + if self.numberOfValues == 0: + print('should never happen, self.numberOfValues in Average is zero') + return 0.0 + return self.total / float( self.numberOfValues ) + + def reset(self): + 'Set the number of values and the total to the default.' + self.numberOfValues = 0 + self.total = 0.0 + + +class MillRepository: + 'A class to handle the mill settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.mill.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Mill', self, '') + self.activateMill = settings.BooleanSetting().getFromValue('Activate Mill', self, True ) + settings.LabelDisplay().getFromName('- Add Loops -', self ) + self.addInnerLoops = settings.BooleanSetting().getFromValue('Add Inner Loops', self, True ) + self.addOuterLoops = settings.BooleanSetting().getFromValue('Add Outer Loops', self, True ) + self.crossHatch = settings.BooleanSetting().getFromValue('Cross Hatch', self, True ) + settings.LabelDisplay().getFromName('- Loop Outset -', self ) + self.loopInnerOutsetOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.3, 'Loop Inner Outset over Perimeter Width (ratio):', self, 0.7, 0.5 ) + self.loopOuterOutsetOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.8, 'Loop Outer Outset over Perimeter Width (ratio):', self, 1.4, 1.0 ) + self.millWidthOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.8, 'Mill Width over Perimeter Width (ratio):', self, 1.8, 1.0 ) + self.executeTitle = 'Mill' + + def execute(self): + 'Mill button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + + +class MillSkein: + 'A class to mill a skein of extrusions.' + def __init__(self): + self.aroundPixelTable = {} + self.average = Average() + self.boundaryLayers = [] + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.isExtruderActive = False + self.layerCount = settings.LayerCount() + self.layerIndex = 0 + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + self.perimeterWidth = 0.6 + + def addGcodeFromLoops(self, loops, z): + 'Add gcode from loops.' + if self.oldLocation == None: + self.oldLocation = Vector3() + self.oldLocation.z = z + for loop in loops: + self.distanceFeedRate.addGcodeFromThreadZ(loop, z) + euclidean.addToThreadsFromLoop(self.halfPerimeterWidth, 'loop', loop, self.oldLocation, self) + + def addGcodeFromThreadZ( self, thread, z ): + 'Add a thread to the output.' + self.distanceFeedRate.addGcodeFromThreadZ( thread, z ) + + def addMillThreads(self): + 'Add the mill threads to the skein.' + boundaryLayer = self.boundaryLayers[self.layerIndex] + endpoints = euclidean.getEndpointsFromSegmentTable( boundaryLayer.segmentTable ) + if len(endpoints) < 1: + return + paths = euclidean.getPathsFromEndpoints(endpoints, 5.0 * self.millWidth, self.aroundPixelTable, self.aroundWidth) + averageZ = self.average.getAverage() + if self.repository.addInnerLoops.value: + self.addGcodeFromLoops( boundaryLayer.innerLoops, averageZ ) + if self.repository.addOuterLoops.value: + self.addGcodeFromLoops( boundaryLayer.outerLoops, averageZ ) + for path in paths: + simplifiedPath = euclidean.getSimplifiedPath( path, self.millWidth ) + self.distanceFeedRate.addGcodeFromThreadZ( simplifiedPath, averageZ ) + + def addSegmentTableLoops( self, boundaryLayerIndex ): + 'Add the segment tables and loops to the boundary.' + boundaryLayer = self.boundaryLayers[boundaryLayerIndex] + euclidean.subtractXIntersectionsTable(boundaryLayer.outerHorizontalTable, boundaryLayer.innerHorizontalTable) + euclidean.subtractXIntersectionsTable(boundaryLayer.outerVerticalTable, boundaryLayer.innerVerticalTable) + boundaryLayer.horizontalSegmentTable = self.getHorizontalSegmentTableForXIntersectionsTable( + boundaryLayer.outerHorizontalTable) + boundaryLayer.verticalSegmentTable = self.getVerticalSegmentTableForXIntersectionsTable( + boundaryLayer.outerVerticalTable) + betweenPoints = getPointsFromSegmentTable(boundaryLayer.horizontalSegmentTable) + betweenPoints += getPointsFromSegmentTable(boundaryLayer.verticalSegmentTable) + innerPoints = euclidean.getPointsByHorizontalDictionary(self.millWidth, boundaryLayer.innerHorizontalTable) + innerPoints += euclidean.getPointsByVerticalDictionary(self.millWidth, boundaryLayer.innerVerticalTable) + innerPointTable = {} + for innerPoint in innerPoints: + innerPointTable[innerPoint] = None + boundaryLayer.innerLoops = [] + boundaryLayer.outerLoops = [] + millRadius = 0.75 * self.millWidth + loops = triangle_mesh.getDescendingAreaOrientedLoops(betweenPoints, betweenPoints, millRadius) + for loop in loops: + if isPointOfTableInLoop(loop, innerPointTable): + boundaryLayer.innerLoops.append(loop) + else: + boundaryLayer.outerLoops.append(loop) + if self.repository.crossHatch.value and boundaryLayerIndex % 2 == 1: + boundaryLayer.segmentTable = boundaryLayer.verticalSegmentTable + else: + boundaryLayer.segmentTable = boundaryLayer.horizontalSegmentTable + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the mill gcode.' + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + self.parseBoundaries() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getHorizontalSegmentTableForXIntersectionsTable( self, xIntersectionsTable ): + 'Get the horizontal segment table from the xIntersectionsTable.' + horizontalSegmentTable = {} + xIntersectionsTableKeys = xIntersectionsTable.keys() + xIntersectionsTableKeys.sort() + for xIntersectionsTableKey in xIntersectionsTableKeys: + xIntersections = xIntersectionsTable[ xIntersectionsTableKey ] + segments = euclidean.getSegmentsFromXIntersections( xIntersections, xIntersectionsTableKey * self.millWidth ) + horizontalSegmentTable[ xIntersectionsTableKey ] = segments + return horizontalSegmentTable + + def getHorizontalXIntersectionsTable(self, loops): + 'Get the horizontal x intersections table from the loops.' + horizontalXIntersectionsTable = {} + euclidean.addXIntersectionsFromLoopsForTable(loops, horizontalXIntersectionsTable, self.millWidth) + return horizontalXIntersectionsTable + + def getVerticalSegmentTableForXIntersectionsTable( self, xIntersectionsTable ): + 'Get the vertical segment table from the xIntersectionsTable which has the x and y swapped.' + verticalSegmentTable = {} + xIntersectionsTableKeys = xIntersectionsTable.keys() + xIntersectionsTableKeys.sort() + for xIntersectionsTableKey in xIntersectionsTableKeys: + xIntersections = xIntersectionsTable[ xIntersectionsTableKey ] + segments = euclidean.getSegmentsFromXIntersections( xIntersections, xIntersectionsTableKey * self.millWidth ) + for segment in segments: + for endpoint in segment: + endpoint.point = complex( endpoint.point.imag, endpoint.point.real ) + verticalSegmentTable[ xIntersectionsTableKey ] = segments + return verticalSegmentTable + + def parseBoundaries(self): + 'Parse the boundaries and add them to the boundary layers.' + boundaryLoop = None + boundaryLayer = None + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '()': + boundaryLoop = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if boundaryLoop == None: + boundaryLoop = [] + boundaryLayer.loops.append(boundaryLoop) + boundaryLoop.append(location.dropAxis()) + elif firstWord == '(': + boundaryLayer = euclidean.LoopLayer(float(splitLine[1])) + self.boundaryLayers.append(boundaryLayer) + if len(self.boundaryLayers) < 2: + return + for boundaryLayer in self.boundaryLayers: + boundaryLayer.innerOutsetLoops = intercircle.getInsetSeparateLoopsFromLoops( - self.loopInnerOutset, boundaryLayer.loops ) + boundaryLayer.outerOutsetLoops = intercircle.getInsetSeparateLoopsFromLoops( - self.loopOuterOutset, boundaryLayer.loops ) + boundaryLayer.innerHorizontalTable = self.getHorizontalXIntersectionsTable( boundaryLayer.innerOutsetLoops ) + boundaryLayer.outerHorizontalTable = self.getHorizontalXIntersectionsTable( boundaryLayer.outerOutsetLoops ) + boundaryLayer.innerVerticalTable = self.getHorizontalXIntersectionsTable( euclidean.getDiagonalFlippedLoops( boundaryLayer.innerOutsetLoops ) ) + boundaryLayer.outerVerticalTable = self.getHorizontalXIntersectionsTable( euclidean.getDiagonalFlippedLoops( boundaryLayer.outerOutsetLoops ) ) + for boundaryLayerIndex in xrange( len(self.boundaryLayers) - 2, - 1, - 1 ): + boundaryLayer = self.boundaryLayers[ boundaryLayerIndex ] + boundaryLayerBelow = self.boundaryLayers[ boundaryLayerIndex + 1 ] + euclidean.joinXIntersectionsTables( boundaryLayerBelow.outerHorizontalTable, boundaryLayer.outerHorizontalTable ) + euclidean.joinXIntersectionsTables( boundaryLayerBelow.outerVerticalTable, boundaryLayer.outerVerticalTable ) + for boundaryLayerIndex in xrange( 1, len(self.boundaryLayers) ): + boundaryLayer = self.boundaryLayers[ boundaryLayerIndex ] + boundaryLayerAbove = self.boundaryLayers[ boundaryLayerIndex - 1 ] + euclidean.joinXIntersectionsTables( boundaryLayerAbove.innerHorizontalTable, boundaryLayer.innerHorizontalTable ) + euclidean.joinXIntersectionsTables( boundaryLayerAbove.innerVerticalTable, boundaryLayer.innerVerticalTable ) + for boundaryLayerIndex in xrange( len(self.boundaryLayers) ): + self.addSegmentTableLoops(boundaryLayerIndex) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('mill') + return + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.aroundWidth = 0.1 * self.perimeterWidth + self.halfPerimeterWidth = 0.5 * self.perimeterWidth + self.millWidth = self.perimeterWidth * self.repository.millWidthOverPerimeterWidth.value + self.loopInnerOutset = self.halfPerimeterWidth + self.perimeterWidth * self.repository.loopInnerOutsetOverPerimeterWidth.value + self.loopOuterOutset = self.halfPerimeterWidth + self.perimeterWidth * self.repository.loopOuterOutsetOverPerimeterWidth.value + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line and add it to the mill skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.isExtruderActive: + self.average.addValue(location.z) + if self.oldLocation != None: + euclidean.addValueSegmentToPixelTable( self.oldLocation.dropAxis(), location.dropAxis(), self.aroundPixelTable, None, self.aroundWidth ) + self.oldLocation = location + elif firstWord == 'M101': + self.isExtruderActive = True + elif firstWord == 'M103': + self.isExtruderActive = False + elif firstWord == '(': + self.layerCount.printProgressIncrement('mill') + self.aroundPixelTable = {} + self.average.reset() + elif firstWord == '()': + if len(self.boundaryLayers) > self.layerIndex: + self.addMillThreads() + self.layerIndex += 1 + self.distanceFeedRate.addLine(line) + + +def main(): + 'Display the mill dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.py new file mode 100644 index 0000000..36e66c4 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.py @@ -0,0 +1,285 @@ +""" +This page is in the table of contents. +Multiply is a script to multiply the shape into an array of copies arranged in a table. + +The multiply manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Multiply + +Besides using the multiply tool, another way of printing many copies of the model is to duplicate the model in Art of Illusion, however many times you want, with the appropriate offsets. Then you can either use the Join Objects script in the scripts submenu to create a combined shape or you can export the whole scene as an xml file, which skeinforge can then slice. + +==Operation== +The default 'Activate Multiply' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Center=== +Default is the origin. + +The center of the shape will be moved to the "Center X" and "Center Y" coordinates. + +====Center X==== +====Center Y==== + +===Number of Cells=== +====Number of Columns==== +Default is one. + +Defines the number of columns in the array table. + +====Number of Rows==== +Default is one. + +Defines the number of rows in the table. + +===Reverse Sequence every Odd Layer=== +Default is off. + +When selected the build sequence will be reversed on every odd layer so that the tool will travel less. The problem is that the builds would be made with different amount of time to cool, so some would be too hot and some too cold, which is why the default is off. + +===Separation over Perimeter Width=== +Default is fifteen. + +Defines the ratio of separation between the shape copies over the extrusion width. + +==Examples== +The following examples multiply the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and multiply.py. + +> python multiply.py +This brings up the multiply dialog. + +> python multiply.py Screw Holder Bottom.stl +The multiply tool is parsing the file: +Screw Holder Bottom.stl +.. +The multiply tool has created the file: +.. Screw Holder Bottom_multiply.gcode + +""" + + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, text='', repository=None): + 'Multiply the fill file or text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Multiply the fill text.' + if gcodec.isProcedureDoneOrFileIsEmpty(gcodeText, 'multiply'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(MultiplyRepository()) + if not repository.activateMultiply.value: + return gcodeText + return MultiplySkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return MultiplyRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Multiply a gcode linear move file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'multiply', shouldAnalyze) + + +class MultiplyRepository: + 'A class to handle the multiply settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.multiply.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( + fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Multiply', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Multiply') + self.activateMultiply = settings.BooleanSetting().getFromValue('Activate Multiply', self, False) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Center -', self ) + self.centerX = settings.FloatSpin().getFromValue(-100.0, 'Center X (mm):', self, 100.0, 0.0) + self.centerY = settings.FloatSpin().getFromValue(-100.0, 'Center Y (mm):', self, 100.0, 0.0) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Number of Cells -', self) + self.numberOfColumns = settings.IntSpin().getFromValue(1, 'Number of Columns (integer):', self, 10, 1) + self.numberOfRows = settings.IntSpin().getFromValue(1, 'Number of Rows (integer):', self, 10, 1) + settings.LabelSeparator().getFromRepository(self) + self.reverseSequenceEveryOddLayer = settings.BooleanSetting().getFromValue('Reverse Sequence every Odd Layer', self, False) + self.separationOverPerimeterWidth = settings.FloatSpin().getFromValue( + 5.0, 'Separation over Perimeter Width (ratio):', self, 25.0, 15.0) + self.executeTitle = 'Multiply' + + def execute(self): + 'Multiply button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( + self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class MultiplySkein: + 'A class to multiply a skein of extrusions.' + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.isExtrusionActive = False + self.layerCount = settings.LayerCount() + self.layerIndex = 0 + self.layerLines = [] + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + self.rowIndex = 0 + self.shouldAccumulate = True + + def addElement(self, offset): + 'Add moved element to the output.' + for line in self.layerLines: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '(': + movedLocation = self.getMovedLocationSetOldLocation(offset, splitLine) + line = self.distanceFeedRate.getBoundaryLine(movedLocation) + elif firstWord == 'G1': + movedLocation = self.getMovedLocationSetOldLocation(offset, splitLine) + line = self.distanceFeedRate.getLinearGcodeMovement(movedLocation.dropAxis(), movedLocation.z) + elif firstWord == '(': + movedLocation = self.getMovedLocationSetOldLocation(offset, splitLine) + line = self.distanceFeedRate.getInfillBoundaryLine(movedLocation) + self.distanceFeedRate.addLine(line) + + def addLayer(self): + 'Add multiplied layer to the output.' + self.layerCount.printProgressIncrement('multiply') + self.addRemoveThroughLayer() + offset = self.centerOffset - self.arrayCenter - self.shapeCenter + for rowIndex in xrange(self.repository.numberOfRows.value): + yRowOffset = float(rowIndex) * self.extentPlusSeparation.imag + if self.layerIndex % 2 == 1 and self.repository.reverseSequenceEveryOddLayer.value: + yRowOffset = self.arrayExtent.imag - yRowOffset + for columnIndex in xrange(self.repository.numberOfColumns.value): + xColumnOffset = float(columnIndex) * self.extentPlusSeparation.real + if self.rowIndex % 2 == 1: + xColumnOffset = self.arrayExtent.real - xColumnOffset + elementOffset = complex(offset.real + xColumnOffset, offset.imag + yRowOffset) + self.addElement(elementOffset) + self.rowIndex += 1 + if len(self.layerLines) > 1: + self.layerIndex += 1 + self.layerLines = [] + + def addRemoveThroughLayer(self): + 'Parse gcode initialization and store the parameters.' + for layerLineIndex in xrange(len(self.layerLines)): + line = self.layerLines[layerLineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.addLine(line) + if firstWord == '(': + self.layerLines = self.layerLines[layerLineIndex + 1 :] + return + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the multiply gcode.' + self.centerOffset = complex(repository.centerX.value, repository.centerY.value) + self.repository = repository + self.numberOfColumns = repository.numberOfColumns.value + self.numberOfRows = repository.numberOfRows.value + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + self.setCorners() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getMovedLocationSetOldLocation(self, offset, splitLine): + 'Get the moved location and set the old location.' + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.oldLocation = location + return Vector3(location.x + offset.real, location.y + offset.imag, location.z) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('multiply') + self.distanceFeedRate.addLine(line) + self.lineIndex += 1 + return + elif firstWord == '(': + self.absolutePerimeterWidth = abs(float(splitLine[1])) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line and add it to the multiply skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '()': + self.addLayer() + self.distanceFeedRate.addLine(line) + return + elif firstWord == '()': + self.shouldAccumulate = False + if self.shouldAccumulate: + self.layerLines.append(line) + return + self.distanceFeedRate.addLine(line) + + def setCorners(self): + 'Set maximum and minimum corners and z.' + cornerMaximumComplex = complex(-987654321.0, -987654321.0) + cornerMinimumComplex = -cornerMaximumComplex + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.isExtrusionActive: + locationComplex = location.dropAxis() + cornerMaximumComplex = euclidean.getMaximum(locationComplex, cornerMaximumComplex) + cornerMinimumComplex = euclidean.getMinimum(locationComplex, cornerMinimumComplex) + self.oldLocation = location + elif firstWord == 'M101': + self.isExtrusionActive = True + elif firstWord == 'M103': + self.isExtrusionActive = False + self.extent = cornerMaximumComplex - cornerMinimumComplex + self.shapeCenter = 0.5 * (cornerMaximumComplex + cornerMinimumComplex) + self.separation = self.repository.separationOverPerimeterWidth.value * self.absolutePerimeterWidth + self.extentPlusSeparation = self.extent + complex(self.separation, self.separation) + columnsMinusOne = self.numberOfColumns - 1 + rowsMinusOne = self.numberOfRows - 1 + self.arrayExtent = complex(self.extentPlusSeparation.real * columnsMinusOne, self.extentPlusSeparation.imag * rowsMinusOne) + self.arrayCenter = 0.5 * self.arrayExtent + + +def main(): + 'Display the multiply dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.pyc new file mode 100644 index 0000000..324ce6a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/multiply.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/oozebane.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/oozebane.py new file mode 100644 index 0000000..4c07765 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/oozebane.py @@ -0,0 +1,581 @@ +""" +This page is in the table of contents. +Oozebane is a script to turn off the extruder before the end of a thread and turn it on before the beginning. + +The oozebane manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Oozebane + +After oozebane turns the extruder on, it slows the feed rate down where the thread starts. Then it speeds it up in steps so in theory the thread will remain at roughly the same thickness from the beginning. + +==Operation== +The default 'Activate Oozebane' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===After Startup Distance=== +Default is 1.2. + +When oozebane reaches the point where the extruder would of turned on, it slows down so that the thread will be thick at that point. Afterwards it speeds the extruder back up to operating speed. The speed up distance is the "After Startup Distance". + +===Early Shutdown Distance=== +Default is 1.2. + +Defines the distance before the end of the thread that the extruder will be turned off. It is the most important oozebane setting. A higher distance means the extruder will turn off sooner and the end of the line will be thinner. + +===Early Startup Maximum Distance=== +Default is 1.2. + +Defines the maximum distance before the thread starts that the extruder will be turned on + +===Early Startup Distance Constant=== +Default is twenty. + +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". + +===First Early Startup Distance=== +Default is twenty five. + +Defines the distance before the first thread starts that the extruder will be turned off. This value should be high because, according to Marius, the extruder takes a second or two to extrude when starting for the first time. + +===Minimum Distance for Early Shutdown=== +Default is zero. + +Defines the minimum distance that the extruder has to be off after the thread end for the early shutdown feature to activate. + +===Minimum Distance for Early Startup=== +Default is zero. + +Defines the minimum distance that the extruder has to be off before the thread begins for the early start up feature to activate. + +===Slowdown Startup Steps=== +Default is three. + +When oozebane turns the extruder off, it slows the feed rate down in steps so in theory the thread will remain at roughly the same thickness until the end. The "Slowdown Startup Steps" setting is the number of steps, the more steps the smaller the size of the step that the feed rate will be decreased and the larger the size of the resulting gcode file. + +==Examples== +The following examples oozebane the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and oozebane.py. + +> python oozebane.py +This brings up the oozebane dialog. + +> python oozebane.py Screw Holder Bottom.stl +The oozebane tool is parsing the file: +Screw Holder Bottom.stl +.. +The oozebane tool has created the file: +.. Screw Holder Bottom_oozebane.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, oozebaneRepository = None ): + "Oozebane a gcode linear move file or text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), oozebaneRepository ) + +def getCraftedTextFromText( gcodeText, oozebaneRepository = None ): + "Oozebane a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'oozebane'): + return gcodeText + if oozebaneRepository == None: + oozebaneRepository = settings.getReadRepository( OozebaneRepository() ) + if not oozebaneRepository.activateOozebane.value: + return gcodeText + return OozebaneSkein().getCraftedGcode( gcodeText, oozebaneRepository ) + +def getNewRepository(): + 'Get new repository.' + return OozebaneRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Oozebane a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'oozebane', shouldAnalyze) + + +class OozebaneRepository: + "A class to handle the oozebane settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.oozebane.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Oozebane', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Oozebane') + self.activateOozebane = settings.BooleanSetting().getFromValue('Activate Oozebane', self, False ) + self.afterStartupDistance = settings.FloatSpin().getFromValue( 0.7, 'After Startup Distance (millimeters):', self, 1.7, 1.2 ) + self.earlyShutdownDistance = settings.FloatSpin().getFromValue( 0.7, 'Early Shutdown Distance (millimeters):', self, 1.7, 1.2 ) + self.earlyStartupDistanceConstant = settings.FloatSpin().getFromValue( 10.0, 'Early Startup Distance Constant (millimeters):', self, 30.0, 20.0 ) + self.earlyStartupMaximumDistance = settings.FloatSpin().getFromValue( 0.7, 'Early Startup Maximum Distance (millimeters):', self, 1.7, 1.2 ) + self.firstEarlyStartupDistance = settings.FloatSpin().getFromValue( 5.0, 'First Early Startup Distance (millimeters):', self, 45.0, 25.0 ) + self.minimumDistanceForEarlyStartup = settings.FloatSpin().getFromValue( 0.0, 'Minimum Distance for Early Startup (millimeters):', self, 10.0, 0.0 ) + self.minimumDistanceForEarlyShutdown = settings.FloatSpin().getFromValue( 0.0, 'Minimum Distance for Early Shutdown (millimeters):', self, 10.0, 0.0 ) + self.slowdownStartupSteps = settings.IntSpin().getFromValue( 2, 'Slowdown Startup Steps (positive integer):', self, 5, 3 ) + self.executeTitle = 'Oozebane' + + def execute(self): + "Oozebane button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class OozebaneSkein: + "A class to oozebane a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.distanceFromThreadEndToThreadBeginning = None + self.earlyStartupDistance = None + self.extruderInactiveLongEnough = True + self.feedRateMinute = 961.0 + self.isExtruderActive = False + self.isFirstExtrusion = True + self.isShutdownEarly = False + self.isStartupEarly = False + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + self.operatingFeedRateMinute = 959.0 + self.shutdownStepIndex = 999999999 + self.startupStepIndex = 999999999 + + def addAfterStartupLine( self, splitLine ): + "Add the after startup lines." + distanceAfterThreadBeginning = self.getDistanceAfterThreadBeginning() + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + segment = self.oldLocation - location + segmentLength = segment.magnitude() + distanceBack = distanceAfterThreadBeginning - self.afterStartupDistances[ self.startupStepIndex ] + if segmentLength > 0.0: + locationBack = location + segment * distanceBack / segmentLength + feedRate = self.operatingFeedRateMinute * self.afterStartupFlowRates[ self.startupStepIndex ] + if not self.isCloseToEither( locationBack, location, self.oldLocation ): + self.distanceFeedRate.addLine( self.getLinearMoveWithFeedRate( feedRate, locationBack ) ) + self.startupStepIndex += 1 + + def addLineSetShutdowns(self, line): + "Add a line and set the shutdown variables." + self.distanceFeedRate.addLine(line) + self.isShutdownEarly = True + + def getActiveFeedRateRatio(self): + "Get the feed rate of the first active move over the operating feed rate." + isSearchExtruderActive = self.isExtruderActive + for afterIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + if isSearchExtruderActive: + return gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) / self.operatingFeedRateMinute + elif firstWord == 'M101': + isSearchExtruderActive = True + print('active feed rate ratio was not found in oozebane.') + return 1.0 + + def getAddAfterStartupLines(self, line): + "Get and / or add after the startup lines." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + while self.isDistanceAfterThreadBeginningGreater(): + self.addAfterStartupLine(splitLine) + if self.startupStepIndex >= len( self.afterStartupDistances ): + self.startupStepIndex = len( self.afterStartupDistances ) + 999999999999 + return self.getLinearMoveWithFeedRateSplitLine( self.operatingFeedRateMinute, splitLine ) + feedRate = self.operatingFeedRateMinute * self.getStartupFlowRateMultiplier( self.getDistanceAfterThreadBeginning() / self.afterStartupDistance, len( self.afterStartupDistances ) ) + return self.getLinearMoveWithFeedRateSplitLine( feedRate, splitLine ) + + def getAddBeforeStartupLines(self, line): + "Get and / or add before the startup lines." + distanceThreadBeginning = self.getDistanceToThreadBeginning() + if distanceThreadBeginning == None: + return line + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + self.extruderInactiveLongEnough = False + self.isStartupEarly = True + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + segment = self.oldLocation - location + segmentLength = segment.magnitude() + distanceBack = self.earlyStartupDistance - distanceThreadBeginning + if segmentLength <= 0.0: + print('This should never happen, segmentLength is zero in getAddBeforeStartupLines in oozebane.') + print(line) + self.extruderInactiveLongEnough = True + self.isStartupEarly = False + return line + locationBack = location + segment * distanceBack / segmentLength + self.distanceFeedRate.addLine( self.getLinearMoveWithFeedRate( gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) , locationBack ) ) + self.distanceFeedRate.addLine('M101') + if self.isCloseToEither( locationBack, location, self.oldLocation ): + return '' + return self.getLinearMoveWithFeedRate( self.operatingFeedRateMinute, location ) + + def getAddShutSlowDownLine(self, line): + "Add the shutdown and slowdown lines." + if self.shutdownStepIndex >= len( self.earlyShutdownDistances ): + self.shutdownStepIndex = len( self.earlyShutdownDistances ) + 99999999 + return False + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + distanceThreadEnd = self.getDistanceToExtruderOffCommand( self.earlyShutdownDistances[ self.shutdownStepIndex ] ) + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if distanceThreadEnd == None: + distanceThreadEnd = self.getDistanceToExtruderOffCommand( self.earlyShutdownDistances[0] ) + if distanceThreadEnd != None: + shutdownFlowRateMultiplier = self.getShutdownFlowRateMultiplier( 1.0 - distanceThreadEnd / self.earlyShutdownDistance, len( self.earlyShutdownDistances ) ) + line = self.getLinearMoveWithFeedRate( self.feedRateMinute * shutdownFlowRateMultiplier, location ) + self.distanceFeedRate.addLine(line) + return False + segment = self.oldLocation - location + segmentLength = segment.magnitude() + distanceBack = self.earlyShutdownDistances[ self.shutdownStepIndex ] - distanceThreadEnd + locationBack = location + if segmentLength > 0.0: + locationBack = location + segment * distanceBack / segmentLength + if self.shutdownStepIndex == 0: + if not self.isCloseToEither( locationBack, location, self.oldLocation ): + line = self.getLinearMoveWithFeedRate( self.feedRateMinute, locationBack ) + self.distanceFeedRate.addLine(line) + self.addLineSetShutdowns('M103') + return True + if self.isClose( locationBack, self.oldLocation ): + return True + feedRate = self.feedRateMinute * self.earlyShutdownFlowRates[ self.shutdownStepIndex ] + line = self.getLinearMoveWithFeedRate( feedRate, locationBack ) + if self.isClose( locationBack, location ): + line = self.getLinearMoveWithFeedRate( feedRate, location ) + self.distanceFeedRate.addLine(line) + return True + + def getAddShutSlowDownLines(self, line): + "Get and / or add the shutdown and slowdown lines." + while self.getAddShutSlowDownLine(line): + self.shutdownStepIndex += 1 + return '' + + def getCraftedGcode( self, gcodeText, oozebaneRepository ): + "Parse gcode text and store the oozebane gcode." + self.lines = archive.getTextLines(gcodeText) + self.oozebaneRepository = oozebaneRepository + self.parseInitialization( oozebaneRepository ) + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getDistanceAfterThreadBeginning(self): + "Get the distance after the beginning of the thread." + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + lastThreadLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + totalDistance = 0.0 + extruderOnReached = False + for beforeIndex in xrange( self.lineIndex - 1, 3, - 1 ): + line = self.lines[ beforeIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine( lastThreadLocation, splitLine ) + totalDistance += location.distance( lastThreadLocation ) + lastThreadLocation = location + if extruderOnReached: + return totalDistance + elif firstWord == 'M101': + extruderOnReached = True + return None + + def getDistanceToExtruderOffCommand( self, remainingDistance ): + "Get the distance to the word." + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + lastThreadLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + totalDistance = 0.0 + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine( lastThreadLocation, splitLine ) + totalDistance += location.distance( lastThreadLocation ) + lastThreadLocation = location + if totalDistance >= remainingDistance: + return None + elif firstWord == 'M103': + return totalDistance + return None + + def getDistanceToThreadBeginning(self): + "Get the distance to the beginning of the thread." + if self.earlyStartupDistance == None: + return None + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + lastThreadLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + totalDistance = 0.0 + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine( lastThreadLocation, splitLine ) + totalDistance += location.distance( lastThreadLocation ) + lastThreadLocation = location + if totalDistance >= self.earlyStartupDistance: + return None + elif firstWord == 'M101': + return totalDistance + return None + + def getDistanceToThreadBeginningAfterThreadEnd( self, remainingDistance ): + "Get the distance to the thread beginning after the end of this thread." + extruderOnReached = False + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + lastThreadLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + threadEndReached = False + totalDistance = 0.0 + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine( lastThreadLocation, splitLine ) + if threadEndReached: + totalDistance += location.distance( lastThreadLocation ) + if totalDistance >= remainingDistance: + return None + if extruderOnReached: + return totalDistance + lastThreadLocation = location + elif firstWord == 'M101': + extruderOnReached = True + elif firstWord == 'M103': + threadEndReached = True + return None + + def getDistanceToThreadEnd(self): + "Get the distance to the end of the thread." + if self.shutdownStepIndex >= len( self.earlyShutdownDistances ): + return None + return self.getDistanceToExtruderOffCommand( self.earlyShutdownDistances[ self.shutdownStepIndex ] ) + + def getLinearMoveWithFeedRate( self, feedRate, location ): + "Get a linear move line with the feed rate." + return self.distanceFeedRate.getLinearGcodeMovementWithFeedRate( feedRate, location.dropAxis(), location.z ) + + def getLinearMoveWithFeedRateSplitLine( self, feedRate, splitLine ): + "Get a linear move line with the feed rate and split line." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + return self.getLinearMoveWithFeedRate( feedRate, location ) + + def getOozebaneLine(self, line): + "Get oozebaned gcode line." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + if self.oldLocation == None: + return line + if self.startupStepIndex < len( self.afterStartupDistances ): + return self.getAddAfterStartupLines(line) + if self.extruderInactiveLongEnough: + return self.getAddBeforeStartupLines(line) + if self.shutdownStepIndex < len( self.earlyShutdownDistances ): + return self.getAddShutSlowDownLines(line) + if self.isStartupEarly: + return self.getLinearMoveWithFeedRateSplitLine( self.operatingFeedRateMinute, splitLine ) + return line + + def getShutdownFlowRateMultiplier( self, along, numberOfDistances ): + "Get the shut down flow rate multipler." + if numberOfDistances <= 0: + return 1.0 + return 1.0 - 0.5 / float( numberOfDistances ) - along * float( numberOfDistances - 1 ) / float( numberOfDistances ) + + def getStartupFlowRateMultiplier( self, along, numberOfDistances ): + "Get the startup flow rate multipler." + if numberOfDistances <= 0: + return 1.0 + return min( 1.0, 0.5 / float( numberOfDistances ) + along ) + + def isClose( self, location, otherLocation ): + "Determine if the location is close to the other location." + return location.distanceSquared( otherLocation ) < self.closeSquared + + def isCloseToEither( self, location, otherLocationFirst, otherLocationSecond ): + "Determine if the location is close to the other locations." + if self.isClose( location, otherLocationFirst ): + return True + return self.isClose( location, otherLocationSecond ) + + def isDistanceAfterThreadBeginningGreater(self): + "Determine if the distance after the thread beginning is greater than the step index after startup distance." + if self.startupStepIndex >= len( self.afterStartupDistances ): + return False + return self.getDistanceAfterThreadBeginning() > self.afterStartupDistances[ self.startupStepIndex ] + + def parseInitialization( self, oozebaneRepository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('oozebane') + return + elif firstWord == '(': + self.operatingFeedRateMinute = 60.0 * float(splitLine[1]) + self.feedRateMinute = self.operatingFeedRateMinute + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.setExtrusionWidth( oozebaneRepository ) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the bevel gcode." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.setEarlyStartupDistance(splitLine) + line = self.getOozebaneLine(line) + self.oldLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + elif firstWord == 'M101': + self.isExtruderActive = True + self.extruderInactiveLongEnough = False + if self.getDistanceToExtruderOffCommand( self.earlyShutdownDistance ) == None: + self.setEarlyShutdown() + if self.getDistanceToExtruderOffCommand( 1.03 * ( self.earlyShutdownDistance + self.afterStartupDistance ) ) == None: + afterStartupRatio = 1.0 + if self.minimumDistanceForEarlyStartup > 0.0: + if self.distanceFromThreadEndToThreadBeginning != None: + afterStartupRatio = self.distanceFromThreadEndToThreadBeginning / self.minimumDistanceForEarlyStartup + self.setAfterStartupFlowRates( afterStartupRatio ) + self.startupStepIndex = 9999999999 + if len( self.afterStartupDistances ) > 0: + self.startupStepIndex = 0 + if self.isStartupEarly: + self.isStartupEarly = False + return + elif firstWord == 'M103': + self.isExtruderActive = False + self.shutdownStepIndex = 999999999 + if self.getDistanceToThreadBeginning() == None: + self.extruderInactiveLongEnough = True + self.distanceFromThreadEndToThreadBeginning = None + self.earlyStartupDistance = None + if self.isShutdownEarly: + self.isShutdownEarly = False + return + self.distanceFeedRate.addLine(line) + + def setAfterStartupFlowRates( self, afterStartupRatio ): + "Set the after startup flow rates." + afterStartupRatio = min( 1.0, afterStartupRatio ) + afterStartupRatio = max( 0.0, afterStartupRatio ) + self.afterStartupDistance = afterStartupRatio * self.getActiveFeedRateRatio() * self.oozebaneRepository.afterStartupDistance.value + self.afterStartupDistances = [] + self.afterStartupFlowRate = 1.0 + self.afterStartupFlowRates = [] + afterStartupSteps = int( math.floor( afterStartupRatio * float( self.oozebaneRepository.slowdownStartupSteps.value ) ) ) + if afterStartupSteps < 1: + return + if afterStartupSteps < 2: + afterStartupSteps = 2 + for stepIndex in xrange( afterStartupSteps ): + afterWay = ( stepIndex + 1 ) / float( afterStartupSteps ) + afterMiddleWay = self.getStartupFlowRateMultiplier( stepIndex / float( afterStartupSteps ), afterStartupSteps ) + self.afterStartupDistances.append( afterWay * self.afterStartupDistance ) + if stepIndex == 0: + self.afterStartupFlowRate = afterMiddleWay + else: + self.afterStartupFlowRates.append( afterMiddleWay ) + if afterStartupSteps > 0: + self.afterStartupFlowRates.append(1.0) + + def setEarlyShutdown(self): + "Set the early shutdown variables." + distanceToThreadBeginning = self.getDistanceToThreadBeginningAfterThreadEnd( self.minimumDistanceForEarlyShutdown ) + earlyShutdownRatio = 1.0 + if distanceToThreadBeginning != None: + if self.minimumDistanceForEarlyShutdown > 0.0: + earlyShutdownRatio = distanceToThreadBeginning / self.minimumDistanceForEarlyShutdown + self.setEarlyShutdownFlowRates( earlyShutdownRatio ) + if len( self.earlyShutdownDistances ) > 0: + self.shutdownStepIndex = 0 + + def setEarlyShutdownFlowRates( self, earlyShutdownRatio ): + "Set the extrusion width." + earlyShutdownRatio = min( 1.0, earlyShutdownRatio ) + earlyShutdownRatio = max( 0.0, earlyShutdownRatio ) + self.earlyShutdownDistance = earlyShutdownRatio * self.getActiveFeedRateRatio() * self.oozebaneRepository.earlyShutdownDistance.value + self.earlyShutdownDistances = [] + self.earlyShutdownFlowRates = [] + earlyShutdownSteps = int( math.floor( earlyShutdownRatio * float( self.oozebaneRepository.slowdownStartupSteps.value ) ) ) + if earlyShutdownSteps < 2: + earlyShutdownSteps = 0 + earlyShutdownStepsMinusOne = float( earlyShutdownSteps ) - 1.0 + for stepIndex in xrange( earlyShutdownSteps ): + downMiddleWay = self.getShutdownFlowRateMultiplier( stepIndex / earlyShutdownStepsMinusOne, earlyShutdownSteps ) + downWay = 1.0 - stepIndex / earlyShutdownStepsMinusOne + self.earlyShutdownFlowRates.append( downMiddleWay ) + self.earlyShutdownDistances.append( downWay * self.earlyShutdownDistance ) + + def setEarlyStartupDistance( self, splitLine ): + "Set the early startup distance." + if self.earlyStartupDistance != None: + return + self.distanceFromThreadEndToThreadBeginning = 0.0 + lastThreadLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.oldLocation != None: + self.distanceFromThreadEndToThreadBeginning = lastThreadLocation.distance( self.oldLocation ) + for afterIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[ afterIndex ] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine( lastThreadLocation, splitLine ) + self.distanceFromThreadEndToThreadBeginning += location.distance( lastThreadLocation ) + lastThreadLocation = location + elif firstWord == 'M101': + distanceConstantRatio = self.distanceFromThreadEndToThreadBeginning / self.earlyStartupDistanceConstant + earlyStartupOperatingDistance = self.earlyStartupMaximumDistance * ( 1.0 - math.exp( - distanceConstantRatio ) ) + if self.isFirstExtrusion: + earlyStartupOperatingDistance = self.oozebaneRepository.firstEarlyStartupDistance.value + self.isFirstExtrusion = False + self.earlyStartupDistance = earlyStartupOperatingDistance * self.getActiveFeedRateRatio() + return + + def setExtrusionWidth( self, oozebaneRepository ): + "Set the extrusion width." + self.closeSquared = 0.01 * self.perimeterWidth * self.perimeterWidth + self.earlyStartupMaximumDistance = oozebaneRepository.earlyStartupMaximumDistance.value + self.earlyStartupDistanceConstant = oozebaneRepository.earlyStartupDistanceConstant.value + self.minimumDistanceForEarlyStartup = oozebaneRepository.minimumDistanceForEarlyStartup.value + self.minimumDistanceForEarlyShutdown = oozebaneRepository.minimumDistanceForEarlyShutdown.value + self.setEarlyShutdownFlowRates(1.0) + self.setAfterStartupFlowRates(1.0) + + +def main(): + "Display the oozebane dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/oozebane.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/oozebane.pyc new file mode 100644 index 0000000..7832c3d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/oozebane.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/outset.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/outset.py new file mode 100644 index 0000000..4556642 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/outset.py @@ -0,0 +1,168 @@ +""" +This page is in the table of contents. +Outset outsets the perimeters of the slices of a gcode file. The outside perimeters will be outset by half the perimeter width, and the inside perimeters will be inset by half the perimeter width. Outset is needed for subtractive machining, like cutting or milling. + +==Operation== +The default 'Activate Outset' checkbox is on. When it is on, the gcode will be outset, when it is off, the gcode will not be changed. + +==Examples== +The following examples outset the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and outset.py. + +> python outset.py +This brings up the outset dialog. + +> python outset.py Screw Holder Bottom.stl +The outset tool is parsing the file: +Screw Holder Bottom.stl +.. +The outset tool has created the file: +.. Screw Holder Bottom_outset.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text='', repository=None): + 'Outset the preface file or text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Outset the preface gcode text.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'outset'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( OutsetRepository() ) + if not repository.activateOutset.value: + return gcodeText + return OutsetSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return OutsetRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Outset the carving of a gcode file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'outset', shouldAnalyze) + + +class OutsetRepository: + 'A class to handle the outset settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.outset.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Outset', self, '') + self.activateOutset = settings.BooleanSetting().getFromValue('Activate Outset', self, True ) + self.executeTitle = 'Outset' + + def execute(self): + 'Outset button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class OutsetSkein: + 'A class to outset a skein of extrusions.' + def __init__(self): + self.boundary = None + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.layerCount = settings.LayerCount() + self.lineIndex = 0 + self.rotatedLoopLayer = None + + def addGcodeFromRemainingLoop( self, loop, radius, z ): + 'Add the remainder of the loop.' + boundary = intercircle.getLargestInsetLoopFromLoopRegardless( loop, radius ) + euclidean.addNestedRingBeginning( self.distanceFeedRate, boundary, z ) + self.distanceFeedRate.addPerimeterBlock(loop, z) + self.distanceFeedRate.addLine('()') + self.distanceFeedRate.addLine('()') + + def addOutset(self, rotatedLoopLayer): + 'Add outset to the layer.' + extrudateLoops = intercircle.getInsetLoopsFromLoops(-self.absoluteHalfPerimeterWidth, rotatedLoopLayer.loops) + triangle_mesh.sortLoopsInOrderOfArea(False, extrudateLoops) + for extrudateLoop in extrudateLoops: + self.addGcodeFromRemainingLoop(extrudateLoop, self.absoluteHalfPerimeterWidth, rotatedLoopLayer.z) + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the bevel gcode.' + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for lineIndex in xrange(self.lineIndex, len(self.lines)): + self.parseLine( lineIndex ) + return self.distanceFeedRate.output.getvalue() + + 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.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('outset') + return + elif firstWord == '(': + self.absoluteHalfPerimeterWidth = 0.5 * abs(float(splitLine[1])) + self.distanceFeedRate.addLine(line) + + def parseLine( self, lineIndex ): + 'Parse a gcode line and add it to the outset skein.' + line = self.lines[lineIndex].lstrip() + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + self.boundary.append(location.dropAxis()) + elif firstWord == '(': + self.layerCount.printProgressIncrement('outset') + self.rotatedLoopLayer = euclidean.RotatedLoopLayer(float(splitLine[1])) + self.distanceFeedRate.addLine(line) + elif firstWord == '()': + self.addOutset( self.rotatedLoopLayer ) + self.rotatedLoopLayer = None + elif firstWord == '()': + self.boundary = [] + self.rotatedLoopLayer.loops.append( self.boundary ) + if self.rotatedLoopLayer == None: + self.distanceFeedRate.addLine(line) + + +def main(): + 'Display the outset dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/preface.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/preface.py new file mode 100644 index 0000000..02b5e9f --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/preface.py @@ -0,0 +1,233 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Preface converts the svg slices into gcode extrusion layers, optionally with home, positioning, turn off, and unit commands. + +The preface manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Preface + +==Settings== +===Meta=== +Default is empty. + +The 'Meta' field is to add meta tags or a note to all your files. Whatever is in that field will be added in a meta tagged line to the output. + +===Set Positioning to Absolute=== +Default is on. + +When selected, preface will add the G90 command to set positioning to absolute. + +===Set Units to Millimeters=== +Default is on. + +When selected, preface will add the G21 command to set the units to millimeters. + +===Start at Home=== +Default is off. + +When selected, the G28 go to home gcode will be added at the beginning of the file. + +===Turn Extruder Off=== +====Turn Extruder Off at Shut Down==== +Default is on. + +When selected, the M103 turn extruder off gcode will be added at the end of the file. + +====Turn Extruder Off at Start Up==== +Default is on. + +When selected, the M103 turn extruder off gcode will be added at the beginning of the file. + +==Examples== +The following examples preface the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and preface.py. + +> python preface.py +This brings up the preface dialog. + +> python preface.py Screw Holder Bottom.stl +The preface tool is parsing the file: +Screw Holder Bottom.stl +.. +The preface tool has created the file: +.. Screw Holder Bottom_preface.gcode + +""" + +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 datetime import date, datetime +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.svg_reader import SVGReader +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +from time import strftime +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text='', repository = None ): + "Preface and convert an svg file or text." + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText( text, repository = None ): + "Preface and convert an svg text." + if gcodec.isProcedureDoneOrFileIsEmpty( text, 'preface'): + return text + if repository == None: + repository = settings.getReadRepository(PrefaceRepository()) + return PrefaceSkein().getCraftedGcode(repository, text) + +def getNewRepository(): + 'Get new repository.' + return PrefaceRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Preface the carving of a gcode file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'preface', shouldAnalyze) + + +class PrefaceRepository: + "A class to handle the preface settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.preface.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Preface', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Preface') + self.meta = settings.StringSetting().getFromValue('Meta:', self, '') + self.setPositioningToAbsolute = settings.BooleanSetting().getFromValue('Set Positioning to Absolute', self, True ) + self.setUnitsToMillimeters = settings.BooleanSetting().getFromValue('Set Units to Millimeters', self, True ) + self.startAtHome = settings.BooleanSetting().getFromValue('Start at Home', self, False ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Turn Extruder Off -', self ) + self.turnExtruderOffAtShutDown = settings.BooleanSetting().getFromValue('Turn Extruder Off at Shut Down', self, True ) + self.turnExtruderOffAtStartUp = settings.BooleanSetting().getFromValue('Turn Extruder Off at Start Up', self, True ) + self.executeTitle = 'Preface' + + def execute(self): + "Preface button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class PrefaceSkein: + "A class to preface a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.lineIndex = 0 + self.oldLocation = None + self.svgReader = SVGReader() + + def addInitializationToOutput(self): + "Add initialization gcode to the output." + self.distanceFeedRate.addTagBracketedLine('format', 'skeinforge gcode') + absoluteFilePathUntilDot = archive.getUntilDot(archive.getCraftPluginsDirectoryPath('preface.py')) + dateTodayString = date.today().isoformat().replace('-', '.')[2 :] + if absoluteFilePathUntilDot == '/home/enrique/Desktop/backup/babbleold/script/reprap/fabmetheus/skeinforge_application/skeinforge_plugins/craft_plugins/preface': #is this script on Enrique's computer? + archive.writeFileText(archive.getVersionFileName(), dateTodayString) + versionText = archive.getFileText(archive.getVersionFileName()) + self.distanceFeedRate.addTagBracketedLine('version', versionText) + dateTimeTuple = datetime.now().timetuple() + created = dateTodayString + '|%s:%s' % (dateTimeTuple[3], dateTimeTuple[4]) + self.distanceFeedRate.addTagBracketedLine('created', created) + self.distanceFeedRate.addLine('()') + if self.repository.setPositioningToAbsolute.value: + self.distanceFeedRate.addLine('G90 ;set positioning to absolute') # Set positioning to absolute. + if self.repository.setUnitsToMillimeters.value: + self.distanceFeedRate.addLine('G21 ;set units to millimeters') # Set units to millimeters. + if self.repository.startAtHome.value: + self.distanceFeedRate.addLine('G28 ;start at home') # Start at home. + if self.repository.turnExtruderOffAtStartUp.value: + self.distanceFeedRate.addLine('M103') # Turn extruder off. + craftTypeName = skeinforge_profile.getCraftTypeName() + self.distanceFeedRate.addTagBracketedLine('craftTypeName', craftTypeName) + self.distanceFeedRate.addTagBracketedLine('decimalPlacesCarried', self.distanceFeedRate.decimalPlacesCarried) + layerThickness = float(self.svgReader.sliceDictionary['layerThickness']) + self.distanceFeedRate.addTagRoundedLine('layerThickness', layerThickness) + if self.repository.meta.value: + self.distanceFeedRate.addTagBracketedLine('meta', self.repository.meta.value) + perimeterWidth = float(self.svgReader.sliceDictionary['perimeterWidth']) + self.distanceFeedRate.addTagRoundedLine('perimeterWidth', perimeterWidth) + self.distanceFeedRate.addTagBracketedLine('profileName', skeinforge_profile.getProfileName(craftTypeName)) + self.distanceFeedRate.addLine('()') + pluginFileNames = skeinforge_craft.getPluginFileNames() + for pluginFileName in pluginFileNames: + self.addToolSettingLines(pluginFileName) + self.distanceFeedRate.addLine('()') + self.distanceFeedRate.addTagBracketedLine('timeStampPreface', strftime('%Y%m%d_%H%M%S')) + procedureNames = self.svgReader.sliceDictionary['procedureName'].replace(',', ' ').split() + for procedureName in procedureNames: + self.distanceFeedRate.addTagBracketedProcedure(procedureName) + self.distanceFeedRate.addTagBracketedProcedure('preface') + self.distanceFeedRate.addLine('()') # Initialization is finished, extrusion is starting. + self.distanceFeedRate.addLine('()') # Initialization is finished, crafting is starting. + + def addPreface( self, rotatedLoopLayer ): + "Add preface to the carve layer." + self.distanceFeedRate.addLine('( %s )' % rotatedLoopLayer.z ) # Indicate that a new layer is starting. + if rotatedLoopLayer.rotation != None: + self.distanceFeedRate.addTagBracketedLine('bridgeRotation', str( rotatedLoopLayer.rotation ) ) # Indicate the bridge rotation. + for loop in rotatedLoopLayer.loops: + self.distanceFeedRate.addGcodeFromLoop(loop, rotatedLoopLayer.z) + self.distanceFeedRate.addLine('()') + + def addShutdownToOutput(self): + "Add shutdown gcode to the output." + self.distanceFeedRate.addLine('()') # GCode formatted comment + if self.repository.turnExtruderOffAtShutDown.value: + self.distanceFeedRate.addLine('M103') # Turn extruder motor off. + + def addToolSettingLines(self, toolName): + "Add tool setting lines." + craftModule = skeinforge_craft.getCraftModule(toolName) + preferences = settings.getReadRepository(craftModule.getNewRepository()).preferences + for preference in preferences: + if preference.name.startswith('Activate %s' % toolName.capitalize()): + if preference.value == False: + return + for preference in preferences: + valueWithoutReturn = str(preference.value).replace('\n', ' ').replace('\r', ' ') + if preference.name != 'WindowPosition' and not preference.name.startswith('Open File'): + line = '%s %s %s' % (toolName, preference.name.replace(' ', '_'), valueWithoutReturn) + self.distanceFeedRate.addTagBracketedLine('setting', line) + + def getCraftedGcode( self, repository, gcodeText ): + "Parse gcode text and store the bevel gcode." + self.repository = repository + self.svgReader.parseSVG('', gcodeText) + if self.svgReader.sliceDictionary == None: + print('Warning, nothing will be done because the sliceDictionary could not be found getCraftedGcode in preface.') + return '' + self.distanceFeedRate.decimalPlacesCarried = int(self.svgReader.sliceDictionary['decimalPlacesCarried']) + self.addInitializationToOutput() + for rotatedLoopLayerIndex, rotatedLoopLayer in enumerate(self.svgReader.rotatedLoopLayers): + settings.printProgressByNumber(rotatedLoopLayerIndex, len(self.svgReader.rotatedLoopLayers), 'preface') + self.addPreface( rotatedLoopLayer ) + self.addShutdownToOutput() + return self.distanceFeedRate.output.getvalue() + + +def main(): + "Display the preface dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/preface.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/preface.pyc new file mode 100644 index 0000000..6f7e8cc Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/preface.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py new file mode 100644 index 0000000..e9a7f4a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/raft.py @@ -0,0 +1,1121 @@ +""" +This page is in the table of contents. +Raft is a script to create a raft, elevate the nozzle and set the temperature. + +The raft manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Raft + +Allan Ecker aka The Masked Retriever's has written two quicktips for raft which follow below. +"Skeinforge Quicktip: The Raft, Part 1" at: +http://blog.thingiverse.com/2009/07/14/skeinforge-quicktip-the-raft-part-1/ +"Skeinforge Quicktip: The Raft, Part II" at: +http://blog.thingiverse.com/2009/08/04/skeinforge-quicktip-the-raft-part-ii/ + +Pictures of rafting in action are available from the Metalab blog at: +http://reprap.soup.io/?search=rafting + +Raft is based on the Nophead's reusable raft, which has a base layer running one way, and a couple of perpendicular layers above. Each set of layers can be set to a different temperature. There is the option of having the extruder orbit the raft for a while, so the heater barrel has time to reach a different temperature, without ooze accumulating around the nozzle. + +If you want to only set the temperature or only create support material or only elevate the nozzle without creating a raft, set the Base Layers and Interface Layers to zero. + +The important values for the raft settings are the temperatures of the raft, the first layer and the next layers. These will be different for each material. The default settings for ABS, HDPE, PCL & PLA are extrapolated from Nophead's experiments. + +==Operation== +The default 'Activate Raft' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. The raft script sets the temperature. + +==Settings== +===Add Raft, Elevate Nozzle, Orbit=== +Default is on. + +When selected, the script will also create a raft, elevate the nozzle, orbit and set the altitude of the bottom of the raft. + +===Base=== +====Base Feed Rate Multiplier==== +Default is one. + +Defines the base feed rate multiplier. The greater the 'Base Feed Rate Multiplier', the thinner the base, the lower the 'Base Feed Rate Multiplier', the thicker the base. + +====Base Flow Rate Multiplier==== +Default is one. + +Defines the base flow rate multiplier. The greater the 'Base Flow Rate Multiplier', the thicker the base, the lower the 'Base Flow Rate Multiplier', the thinner the base. + +====Base Infill Density==== +Default is 0.5. + +Defines the infill density ratio of the base of the raft. + +====Base Layer Height over Layer Thickness==== +Default is two. + +Defines the ratio of the height & width of the base layer compared to the height and width of the object infill. The feed rate will be slower for raft layers which have thicker extrusions than the object infill. + +====Base Layers==== +Default is one. + +Defines the number of base layers. + +====Base Nozzle Lift over Base Layer Thickness==== +Default is 0.4. + +Defines the amount the nozzle is above the center of the base extrusion divided by the base layer thickness. + +===Initial Circling=== +Default is off. + +When selected, the extruder will initially circle around until it reaches operating temperature. + +===Infill Overhang over Extrusion Width=== +Default is 0.05. + +Defines the ratio of the infill overhang over the the extrusion width of the raft. + +===Interface=== +====Interface Feed Rate Multiplier==== +Default is one. + +Defines the interface feed rate multiplier. The greater the 'Interface Feed Rate Multiplier', the thinner the interface, the lower the 'Interface Feed Rate Multiplier', the thicker the interface. + +====Interface Flow Rate Multiplier==== +Default is one. + +Defines the interface flow rate multiplier. The greater the 'Interface Flow Rate Multiplier', the thicker the interface, the lower the 'Interface Flow Rate Multiplier', the thinner the interface. + +====Interface Infill Density==== +Default is 0.5. + +Defines the infill density ratio of the interface of the raft. + +====Interface Layer Thickness over Extrusion Height==== +Default is one. + +Defines the ratio of the height & width of the interface layer compared to the height and width of the object infill. The feed rate will be slower for raft layers which have thicker extrusions than the object infill. + +====Interface Layers==== +Default is two. + +Defines the number of interface layers. + +====Interface Nozzle Lift over Interface Layer Thickness==== +Default is 0.45. + +Defines the amount the nozzle is above the center of the interface extrusion divided by the interface layer thickness. + +===Name of Alteration Files=== +If support material is generated, raft looks for alteration files in the alterations folder in the .skeinforge folder in the home directory. Raft 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. If it doesn't find the file it then looks in the alterations folder in the skeinforge_plugins folder. + +====Name of Support End File==== +Default is support_end.gcode. + +If support material is generated and if there is a file with the name of the "Name of Support End File" setting, it will be added to the end of the support gcode. + +====Name of Support Start File==== +If support material is generated and if there is a file with the name of the "Name of Support Start File" setting, it will be added to the start of the support gcode. + +===Object First Layer Feed Rate Infill Multiplier=== +Default is 0.4. + +Defines the object first layer infill feed rate multiplier. The greater the 'Object First Layer Feed Rate Infill Multiplier, the thinner the infill, the lower the 'Object First Layer Feed Rate Infill Multiplier', the thicker the infill. + +===Object First Layer Feed Rate Perimeter Multiplier=== +Default is 0.4. + +Defines the object first layer perimeter feed rate multiplier. The greater the 'Object First Layer Feed Rate Perimeter Multiplier, the thinner the perimeter, the lower the 'Object First Layer Feed Rate Perimeter Multiplier', the thicker the perimeter. + +====Object First Layer Flow Rate Infill Multiplier==== +Default is 0.4. + +Defines the object first layer infill flow rate multiplier. The greater the 'Object First Layer Flow Rate Infill Multiplier', the thicker the infill, the lower the 'Object First Layer Flow Rate Infill Multiplier, the thinner the infill. + +====Object First Layer Flow Rate Perimeter Multiplier==== +Default is 0.4. + +Defines the object first layer perimeter flow rate multiplier. The greater the 'Object First Layer Flow Rate Perimeter Multiplier', the thicker the perimeter, the lower the 'Object First Layer Flow Rate Perimeter Multiplier, the thinner the perimeter. + +===Operating Nozzle Lift over Layer Thickness=== +Default is 0.5. + +Defines the amount the nozzle is above the center of the operating extrusion divided by the layer thickness. + +===Raft Size=== +The raft fills a rectangle whose base size is the rectangle around the bottom layer of the object expanded on each side by the 'Raft Margin' plus the 'Raft Additional Margin over Length (%)' percentage times the length of the side. + +====Raft Margin==== +Default is three millimeters. + +====Raft Additional Margin over Length==== +Default is 1 percent. + +===Support=== +Good articles on support material are at: +http://davedurant.wordpress.com/2010/07/31/skeinforge-support-part-1/ +http://davedurant.wordpress.com/2010/07/31/skeinforge-support-part-2/ + +====Support Cross Hatch==== +Default is off. + +When selected, the support material will cross hatched. Cross hatching the support makes it stronger and harder to remove, which is why the default is off. + +====Support Flow Rate over Operating Flow Rate==== +Default is 0.9. + +Defines the ratio of the flow rate when the support is extruded over the operating flow rate. With a number less than one, the support flow rate will be smaller so the support will be thinner and easier to remove. + +====Support Gap over Perimeter Extrusion Width==== +Default is 0.5. + +Defines the gap between the support material and the object over the perimeter extrusion width. + +====Support Material Choice==== +Default is 'None' because the raft takes time to generate. + +=====Empty Layers Only===== +When selected, support material will be only on the empty layers. This is useful when making identical objects in a stack. + +=====Everywhere===== +When selected, support material will be added wherever there are overhangs, even inside the object. Because support material inside objects is hard or impossible to remove, this option should only be chosen if the object has a cavity that needs support and there is some way to extract the support material. + +=====Exterior Only===== +When selected, support material will be added only the exterior of the object. This is the best option for most objects which require support material. + +=====None===== +When selected, raft will not add support material. + +====Support Minimum Angle==== +Default is sixty degrees. + +Defines the minimum angle that a surface overhangs before support material is added. This angle is defined from the vertical, so zero is a vertical wall, ten is a wall with a bit of overhang, thirty is the typical safe angle for filament extrusion, sixty is a really high angle for extrusion and ninety is an unsupported horizontal ceiling. + +==Examples== +The following examples raft the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and raft.py. + +> python raft.py +This brings up the raft dialog. + +> python raft.py Screw Holder Bottom.stl +The raft tool is parsing the file: +Screw Holder Bottom.stl +.. +The raft tool has created the file: +Screw Holder Bottom_raft.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +#maybe later wide support +#raft outline temperature http://hydraraptor.blogspot.com/2008/09/screw-top-pot.html +def getCraftedText( fileName, text='', repository=None): + 'Raft the file or text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Raft a gcode linear move text.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'raft'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( RaftRepository() ) + if not repository.activateRaft.value: + return gcodeText + return RaftSkein().getCraftedGcode(gcodeText, repository) + +def getCrossHatchPointLine( crossHatchPointLineTable, y ): + 'Get the cross hatch point line.' + if not crossHatchPointLineTable.has_key(y): + crossHatchPointLineTable[ y ] = {} + return crossHatchPointLineTable[ y ] + +def getEndpointsFromYIntersections( x, yIntersections ): + 'Get endpoints from the y intersections.' + endpoints = [] + for yIntersectionIndex in xrange( 0, len( yIntersections ), 2 ): + firstY = yIntersections[ yIntersectionIndex ] + secondY = yIntersections[ yIntersectionIndex + 1 ] + if firstY != secondY: + firstComplex = complex( x, firstY ) + secondComplex = complex( x, secondY ) + endpointFirst = euclidean.Endpoint() + endpointSecond = euclidean.Endpoint().getFromOtherPoint( endpointFirst, secondComplex ) + endpointFirst.getFromOtherPoint( endpointSecond, firstComplex ) + endpoints.append( endpointFirst ) + endpoints.append( endpointSecond ) + return endpoints + +def getExtendedLineSegment(extensionDistance, lineSegment, loopXIntersections): + 'Get extended line segment.' + pointBegin = lineSegment[0].point + pointEnd = lineSegment[1].point + segment = pointEnd - pointBegin + segmentLength = abs(segment) + if segmentLength <= 0.0: + print('This should never happen in getExtendedLineSegment in raft, the segment should have a length greater than zero.') + print(lineSegment) + return None + segmentExtend = segment * extensionDistance / segmentLength + lineSegment[0].point -= segmentExtend + lineSegment[1].point += segmentExtend + for loopXIntersection in loopXIntersections: + setExtendedPoint(lineSegment[0], pointBegin, loopXIntersection) + setExtendedPoint(lineSegment[1], pointEnd, loopXIntersection) + return lineSegment + +def getLoopsBySegmentsDictionary(segmentsDictionary, width): + 'Get loops from a horizontal segments dictionary.' + points = [] + for endpoint in getVerticalEndpoints(segmentsDictionary, width, 0.1 * width, width): + points.append(endpoint.point) + for endpoint in euclidean.getEndpointsFromSegmentTable(segmentsDictionary): + points.append(endpoint.point) + return triangle_mesh.getDescendingAreaOrientedLoops(points, points, width + width) + +def getNewRepository(): + 'Get new repository.' + return RaftRepository() + +def getVerticalEndpoints(horizontalSegmentsTable, horizontalStep, verticalOverhang, verticalStep): + 'Get vertical endpoints.' + interfaceSegmentsTableKeys = horizontalSegmentsTable.keys() + interfaceSegmentsTableKeys.sort() + verticalTableTable = {} + for interfaceSegmentsTableKey in interfaceSegmentsTableKeys: + interfaceSegments = horizontalSegmentsTable[interfaceSegmentsTableKey] + for interfaceSegment in interfaceSegments: + begin = int(round(interfaceSegment[0].point.real / verticalStep)) + end = int(round(interfaceSegment[1].point.real / verticalStep)) + for stepIndex in xrange(begin, end + 1): + if stepIndex not in verticalTableTable: + verticalTableTable[stepIndex] = {} + verticalTableTable[stepIndex][interfaceSegmentsTableKey] = None + verticalTableTableKeys = verticalTableTable.keys() + verticalTableTableKeys.sort() + verticalEndpoints = [] + for verticalTableTableKey in verticalTableTableKeys: + verticalTable = verticalTableTable[verticalTableTableKey] + verticalTableKeys = verticalTable.keys() + verticalTableKeys.sort() + xIntersections = [] + for verticalTableKey in verticalTableKeys: + y = verticalTableKey * horizontalStep + if verticalTableKey - 1 not in verticalTableKeys: + xIntersections.append(y - verticalOverhang) + if verticalTableKey + 1 not in verticalTableKeys: + xIntersections.append(y + verticalOverhang) + for segment in euclidean.getSegmentsFromXIntersections(xIntersections, verticalTableTableKey * verticalStep): + for endpoint in segment: + endpoint.point = complex(endpoint.point.imag, endpoint.point.real) + verticalEndpoints.append(endpoint) + return verticalEndpoints + +def setExtendedPoint( lineSegmentEnd, pointOriginal, x ): + 'Set the point in the extended line segment.' + if x > min( lineSegmentEnd.point.real, pointOriginal.real ) and x < max( lineSegmentEnd.point.real, pointOriginal.real ): + lineSegmentEnd.point = complex( x, pointOriginal.imag ) + +def writeOutput(fileName, shouldAnalyze=True): + 'Raft a gcode linear move file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'raft', shouldAnalyze) + + +class RaftRepository: + 'A class to handle the raft settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.raft.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( + fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Raft', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute( + 'http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Raft') + self.activateRaft = settings.BooleanSetting().getFromValue('Activate Raft', self, True) + self.addRaftElevateNozzleOrbitSetAltitude = settings.BooleanSetting().getFromValue( + 'Add Raft, Elevate Nozzle, Orbit:', self, True) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Base -', self) + self.baseFeedRateMultiplier = settings.FloatSpin().getFromValue(0.7, 'Base Feed Rate Multiplier (ratio):', self, 1.1, 1.0) + self.baseFlowRateMultiplier = settings.FloatSpin().getFromValue(0.7, 'Base Flow Rate Multiplier (ratio):', self, 1.1, 1.0) + self.baseInfillDensity = settings.FloatSpin().getFromValue(0.3, 'Base Infill Density (ratio):', self, 0.9, 0.5) + self.baseLayerThicknessOverLayerThickness = settings.FloatSpin().getFromValue( + 1.0, 'Base Layer Thickness over Layer Thickness:', self, 3.0, 2.0) + self.baseLayers = settings.IntSpin().getFromValue(0, 'Base Layers (integer):', self, 3, 1) + self.baseNozzleLiftOverBaseLayerThickness = settings.FloatSpin().getFromValue( + 0.2, 'Base Nozzle Lift over Base Layer Thickness (ratio):', self, 0.8, 0.4) + settings.LabelSeparator().getFromRepository(self) + self.initialCircling = settings.BooleanSetting().getFromValue('Initial Circling:', self, False) + self.infillOverhangOverExtrusionWidth = settings.FloatSpin().getFromValue( + 0.0, 'Infill Overhang over Extrusion Width (ratio):', self, 0.5, 0.05) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Interface -', self) + self.interfaceFeedRateMultiplier = settings.FloatSpin().getFromValue( + 0.7, 'Interface Feed Rate Multiplier (ratio):', self, 1.1, 1.0) + self.interfaceFlowRateMultiplier = settings.FloatSpin().getFromValue( + 0.7, 'Interface Flow Rate Multiplier (ratio):', self, 1.1, 1.0) + self.interfaceInfillDensity = settings.FloatSpin().getFromValue( + 0.3, 'Interface Infill Density (ratio):', self, 0.9, 0.5) + self.interfaceLayerThicknessOverLayerThickness = settings.FloatSpin().getFromValue( + 1.0, 'Interface Layer Thickness over Layer Thickness:', self, 3.0, 1.0) + self.interfaceLayers = settings.IntSpin().getFromValue( + 0, 'Interface Layers (integer):', self, 3, 2) + self.interfaceNozzleLiftOverInterfaceLayerThickness = settings.FloatSpin().getFromValue( + 0.25, 'Interface Nozzle Lift over Interface Layer Thickness (ratio):', self, 0.85, 0.45) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Name of Alteration Files -', self) + self.nameOfSupportEndFile = settings.StringSetting().getFromValue('Name of Support End File:', self, 'support_end.gcode') + self.nameOfSupportStartFile = settings.StringSetting().getFromValue( + 'Name of Support Start File:', self, 'support_start.gcode') + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Object First Layer -', self) + self.objectFirstLayerFeedRateInfillMultiplier = settings.FloatSpin().getFromValue( + 0.2, 'Object First Layer Feed Rate Infill Multiplier (ratio):', self, 1.0, 0.4) + self.objectFirstLayerFeedRatePerimeterMultiplier = settings.FloatSpin().getFromValue( + 0.2, 'Object First Layer Feed Rate Perimeter Multiplier (ratio):', self, 1.0, 0.4) + self.objectFirstLayerFlowRateInfillMultiplier = settings.FloatSpin().getFromValue( + 0.2, 'Object First Layer Flow Rate Infill Multiplier (ratio):', self, 1.0, 0.4) + self.objectFirstLayerFlowRatePerimeterMultiplier = settings.FloatSpin().getFromValue( + 0.2, 'Object First Layer Flow Rate Perimeter Multiplier (ratio):', self, 1.0, 0.4) + settings.LabelSeparator().getFromRepository(self) + self.operatingNozzleLiftOverLayerThickness = settings.FloatSpin().getFromValue( + 0.3, 'Operating Nozzle Lift over Layer Thickness (ratio):', self, 0.7, 0.5) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Raft Size -', self) + self.raftAdditionalMarginOverLengthPercent = settings.FloatSpin().getFromValue( + 0.5, 'Raft Additional Margin over Length (%):', self, 1.5, 1.0) + self.raftMargin = settings.FloatSpin().getFromValue( + 1.0, 'Raft Margin (mm):', self, 5.0, 3.0) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Support -', self) + self.supportCrossHatch = settings.BooleanSetting().getFromValue('Support Cross Hatch', self, False) + self.supportFlowRateOverOperatingFlowRate = settings.FloatSpin().getFromValue( + 0.7, 'Support Flow Rate over Operating Flow Rate (ratio):', self, 1.1, 1.0) + self.supportGapOverPerimeterExtrusionWidth = settings.FloatSpin().getFromValue( + 0.5, 'Support Gap over Perimeter Extrusion Width (ratio):', self, 1.5, 1.0) + self.supportMaterialChoice = settings.MenuButtonDisplay().getFromName('Support Material Choice: ', self) + self.supportChoiceNone = settings.MenuRadio().getFromMenuButtonDisplay(self.supportMaterialChoice, 'None', self, True) + self.supportChoiceEmptyLayersOnly = settings.MenuRadio().getFromMenuButtonDisplay(self.supportMaterialChoice, 'Empty Layers Only', self, False) + self.supportChoiceEverywhere = settings.MenuRadio().getFromMenuButtonDisplay(self.supportMaterialChoice, 'Everywhere', self, False) + self.supportChoiceExteriorOnly = settings.MenuRadio().getFromMenuButtonDisplay(self.supportMaterialChoice, 'Exterior Only', self, False) + self.supportMinimumAngle = settings.FloatSpin().getFromValue(40.0, 'Support Minimum Angle (degrees):', self, 80.0, 60.0) + self.executeTitle = 'Raft' + + def execute(self): + 'Raft button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class RaftSkein: + 'A class to raft a skein of extrusions.' + def __init__(self): + self.addLineLayerStart = True + self.baseTemperature = None + self.beginLoop = None + self.boundaryLayers = [] + self.coolingRate = None + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extrusionStart = True + self.extrusionTop = 0.0 + self.feedRateMinute = 961.0 + self.heatingRate = None + self.insetTable = {} + self.interfaceTemperature = None + self.isNestedRing = True + self.isPerimeterPath = False + self.isStartupEarly = False + self.layerIndex = - 1 + self.layerStarted = False + self.layerThickness = 0.4 + self.lineIndex = 0 + self.lines = None + self.objectFirstLayerInfillTemperature = None + self.objectFirstLayerPerimeterTemperature = None + self.objectNextLayersTemperature = None + self.oldFlowRate = None + self.oldLocation = None + self.oldTemperatureOutputString = None + self.operatingFeedRateMinute = None + self.operatingLayerEndLine = '( )' + self.operatingJump = None + self.orbitalFeedRatePerSecond = 2.01 + self.perimeterWidth = 0.6 + self.supportFlowRate = None + self.supportLayers = [] + self.supportLayersTemperature = None + self.supportedLayersTemperature = None + self.travelFeedRateMinute = None + + def addBaseLayer(self): + 'Add a base layer.' + baseLayerThickness = self.layerThickness * self.baseLayerThicknessOverLayerThickness + zCenter = self.extrusionTop + 0.5 * baseLayerThickness + z = zCenter + baseLayerThickness * self.repository.baseNozzleLiftOverBaseLayerThickness.value + if len(self.baseEndpoints) < 1: + print('This should never happen, the base layer has a size of zero.') + return + self.addLayerFromEndpoints( + self.baseEndpoints, + self.repository.baseFeedRateMultiplier.value, + self.repository.baseFlowRateMultiplier.value, + baseLayerThickness, + self.baseLayerThicknessOverLayerThickness, + self.baseStep, + z) + + def addBaseSegments(self, baseExtrusionWidth): + 'Add the base segments.' + baseOverhang = self.repository.infillOverhangOverExtrusionWidth.value * baseExtrusionWidth + self.baseEndpoints = getVerticalEndpoints(self.interfaceSegmentsTable, self.interfaceStep, baseOverhang, self.baseStep) + + def addEmptyLayerSupport( self, boundaryLayerIndex ): + 'Add support material to a layer if it is empty.' + supportLayer = SupportLayer([]) + self.supportLayers.append(supportLayer) + if len( self.boundaryLayers[ boundaryLayerIndex ].loops ) > 0: + return + aboveXIntersectionsTable = {} + euclidean.addXIntersectionsFromLoopsForTable( self.getInsetLoopsAbove(boundaryLayerIndex), aboveXIntersectionsTable, self.interfaceStep ) + belowXIntersectionsTable = {} + euclidean.addXIntersectionsFromLoopsForTable( self.getInsetLoopsBelow(boundaryLayerIndex), belowXIntersectionsTable, self.interfaceStep ) + supportLayer.xIntersectionsTable = euclidean.getIntersectionOfXIntersectionsTables( [ aboveXIntersectionsTable, belowXIntersectionsTable ] ) + + def addFlowRate(self, flowRate): + 'Add a flow rate value if different.' + if flowRate != None: + self.distanceFeedRate.addLine('M108 S' + euclidean.getFourSignificantFigures(flowRate)) + + def addInterfaceLayer(self): + 'Add an interface layer.' + interfaceLayerThickness = self.layerThickness * self.interfaceLayerThicknessOverLayerThickness + zCenter = self.extrusionTop + 0.5 * interfaceLayerThickness + z = zCenter + interfaceLayerThickness * self.repository.interfaceNozzleLiftOverInterfaceLayerThickness.value + if len(self.interfaceEndpoints) < 1: + print('This should never happen, the interface layer has a size of zero.') + return + self.addLayerFromEndpoints( + self.interfaceEndpoints, + self.repository.interfaceFeedRateMultiplier.value, + self.repository.interfaceFlowRateMultiplier.value, + interfaceLayerThickness, + self.interfaceLayerThicknessOverLayerThickness, + self.interfaceStep, + z) + + def addInterfaceTables(self, interfaceExtrusionWidth): + 'Add interface tables.' + overhang = self.repository.infillOverhangOverExtrusionWidth.value * interfaceExtrusionWidth + self.interfaceEndpoints = [] + self.interfaceIntersectionsTableKeys = self.interfaceIntersectionsTable.keys() + self.interfaceSegmentsTable = {} + for yKey in self.interfaceIntersectionsTableKeys: + self.interfaceIntersectionsTable[yKey].sort() + y = yKey * self.interfaceStep + lineSegments = euclidean.getSegmentsFromXIntersections(self.interfaceIntersectionsTable[yKey], y) + xIntersectionIndexList = [] + for lineSegmentIndex in xrange(len(lineSegments)): + lineSegment = lineSegments[lineSegmentIndex] + endpointBegin = lineSegment[0] + endpointEnd = lineSegment[1] + endpointBegin.point = complex(self.baseStep * math.floor(endpointBegin.point.real / self.baseStep) - overhang, y) + endpointEnd.point = complex(self.baseStep * math.ceil(endpointEnd.point.real / self.baseStep) + overhang, y) + if endpointEnd.point.real > endpointBegin.point.real: + euclidean.addXIntersectionIndexesFromSegment(lineSegmentIndex, lineSegment, xIntersectionIndexList) + xIntersections = euclidean.getJoinOfXIntersectionIndexes(xIntersectionIndexList) + joinedSegments = euclidean.getSegmentsFromXIntersections(xIntersections, y) + if len(joinedSegments) > 0: + self.interfaceSegmentsTable[yKey] = joinedSegments + for joinedSegment in joinedSegments: + self.interfaceEndpoints += joinedSegment + + def addLayerFromEndpoints( + self, + endpoints, + feedRateMultiplier, + flowRateMultiplier, + layerLayerThickness, + layerThicknessRatio, + step, + z): + 'Add a layer from endpoints and raise the extrusion top.' + layerThicknessRatioSquared = layerThicknessRatio * layerThicknessRatio + feedRateMinute = self.feedRateMinute * feedRateMultiplier / layerThicknessRatioSquared + if len(endpoints) < 1: + return + aroundPixelTable = {} + aroundWidth = 0.25 * step + paths = euclidean.getPathsFromEndpoints(endpoints, 1.5 * step, aroundPixelTable, aroundWidth) + self.addLayerLine(z) + if self.oldFlowRate != None: + self.addFlowRate(flowRateMultiplier * self.oldFlowRate) + for path in paths: + simplifiedPath = euclidean.getSimplifiedPath(path, step) + self.distanceFeedRate.addGcodeFromFeedRateThreadZ(feedRateMinute, simplifiedPath, self.travelFeedRateMinute, z) + self.extrusionTop += layerLayerThickness + self.addFlowRate(self.oldFlowRate) + + def addLayerLine(self, z): + 'Add the layer gcode line and close the last layer gcode block.' + if self.layerStarted: + self.distanceFeedRate.addLine('()') + self.distanceFeedRate.addLine('( %s )' % self.distanceFeedRate.getRounded(z)) # Indicate that a new layer is starting. + if self.beginLoop != None: + zBegin = self.extrusionTop + self.layerThickness + intercircle.addOrbitsIfLarge(self.distanceFeedRate, self.beginLoop, self.orbitalFeedRatePerSecond, self.temperatureChangeTimeBeforeRaft, zBegin) + self.beginLoop = None + self.layerStarted = True + + def addOperatingOrbits(self, boundaryLoops, pointComplex, temperatureChangeTime, z): + 'Add the orbits before the operating layers.' + if len(boundaryLoops) < 1: + return + insetBoundaryLoops = intercircle.getInsetLoopsFromLoops(self.perimeterWidth, boundaryLoops) + if len(insetBoundaryLoops) < 1: + insetBoundaryLoops = boundaryLoops + largestLoop = euclidean.getLargestLoop(insetBoundaryLoops) + if pointComplex != None: + largestLoop = euclidean.getLoopStartingNearest(self.perimeterWidth, pointComplex, largestLoop) + intercircle.addOrbitsIfLarge(self.distanceFeedRate, largestLoop, self.orbitalFeedRatePerSecond, temperatureChangeTime, z) + + def addRaft(self): + 'Add the raft.' + if len(self.boundaryLayers) < 0: + print('this should never happen, there are no boundary layers in addRaft') + return + self.baseLayerThicknessOverLayerThickness = self.repository.baseLayerThicknessOverLayerThickness.value + baseExtrusionWidth = self.perimeterWidth * self.baseLayerThicknessOverLayerThickness + self.baseStep = baseExtrusionWidth / self.repository.baseInfillDensity.value + self.interfaceLayerThicknessOverLayerThickness = self.repository.interfaceLayerThicknessOverLayerThickness.value + interfaceExtrusionWidth = self.perimeterWidth * self.interfaceLayerThicknessOverLayerThickness + self.interfaceStep = interfaceExtrusionWidth / self.repository.interfaceInfillDensity.value + self.setCornersZ() + self.cornerMinimumComplex = self.cornerMinimum.dropAxis() + originalExtent = self.cornerMaximumComplex - self.cornerMinimumComplex + self.raftOutsetRadius = self.repository.raftMargin.value + self.repository.raftAdditionalMarginOverLengthPercent.value * 0.01 * max(originalExtent.real, originalExtent.imag) + self.setBoundaryLayers() + outsetSeparateLoops = intercircle.getInsetSeparateLoopsFromLoops(-self.raftOutsetRadius, self.boundaryLayers[0].loops, 0.8) + self.interfaceIntersectionsTable = {} + euclidean.addXIntersectionsFromLoopsForTable(outsetSeparateLoops, self.interfaceIntersectionsTable, self.interfaceStep) + if len(self.supportLayers) > 0: + supportIntersectionsTable = self.supportLayers[0].xIntersectionsTable + euclidean.joinXIntersectionsTables(supportIntersectionsTable, self.interfaceIntersectionsTable) + self.addInterfaceTables(interfaceExtrusionWidth) + self.addRaftPerimeters() + self.baseIntersectionsTable = {} + complexRadius = complex(self.raftOutsetRadius, self.raftOutsetRadius) + self.complexHigh = complexRadius + self.cornerMaximumComplex + self.complexLow = self.cornerMinimumComplex - complexRadius + self.beginLoop = euclidean.getSquareLoopWiddershins(self.cornerMinimumComplex, self.cornerMaximumComplex) + if not intercircle.orbitsAreLarge(self.beginLoop, self.temperatureChangeTimeBeforeRaft): + self.beginLoop = None + if self.repository.baseLayers.value > 0: + self.addTemperatureLineIfDifferent(self.baseTemperature) + self.addBaseSegments(baseExtrusionWidth) + for baseLayerIndex in xrange(self.repository.baseLayers.value): + self.addBaseLayer() + if self.repository.interfaceLayers.value > 0: + self.addTemperatureLineIfDifferent(self.interfaceTemperature) + self.interfaceIntersectionsTableKeys.sort() + for interfaceLayerIndex in xrange(self.repository.interfaceLayers.value): + self.addInterfaceLayer() + self.operatingJump = self.extrusionTop + self.layerThickness * self.repository.operatingNozzleLiftOverLayerThickness.value + for boundaryLayer in self.boundaryLayers: + if self.operatingJump != None: + boundaryLayer.z += self.operatingJump + if self.repository.baseLayers.value > 0 or self.repository.interfaceLayers.value > 0: + boundaryZ = self.boundaryLayers[0].z + if self.layerStarted: + self.distanceFeedRate.addLine('()') + self.layerStarted = False + self.distanceFeedRate.addLine('( )') + self.addLayerLine(boundaryZ) + temperatureChangeTimeBeforeFirstLayer = self.getTemperatureChangeTime(self.objectFirstLayerPerimeterTemperature) + self.addTemperatureLineIfDifferent(self.objectFirstLayerPerimeterTemperature) + largestOutsetLoop = intercircle.getLargestInsetLoopFromLoop(euclidean.getLargestLoop(outsetSeparateLoops), -self.raftOutsetRadius) + intercircle.addOrbitsIfLarge(self.distanceFeedRate, largestOutsetLoop, self.orbitalFeedRatePerSecond, temperatureChangeTimeBeforeFirstLayer, boundaryZ) + self.addLineLayerStart = False + + def addRaftedLine( self, splitLine ): + 'Add elevated gcode line with operating feed rate.' + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + feedRateMinuteMultiplied = self.feedRateMinute + self.oldLocation = location + z = location.z + if self.operatingJump != None: + z += self.operatingJump + flowRate = self.oldFlowRate + temperature = self.objectNextLayersTemperature + if self.layerIndex == 0: + if self.isPerimeterPath: + feedRateMinuteMultiplied *= self.repository.objectFirstLayerFeedRatePerimeterMultiplier.value + if flowRate != None: + flowRate *= self.repository.objectFirstLayerFlowRatePerimeterMultiplier.value + temperature = self.objectFirstLayerPerimeterTemperature + else: + feedRateMinuteMultiplied *= self.repository.objectFirstLayerFeedRateInfillMultiplier.value + if flowRate != None: + flowRate *= self.repository.objectFirstLayerFlowRateInfillMultiplier.value + temperature = self.objectFirstLayerInfillTemperature + self.addFlowRate(flowRate) + self.addTemperatureLineIfDifferent(temperature) + self.distanceFeedRate.addGcodeMovementZWithFeedRate(feedRateMinuteMultiplied, location.dropAxis(), z) + self.addFlowRate(self.oldFlowRate) + + def addRaftPerimeters(self): + 'Add raft perimeters if there is a raft.' + for supportLayer in self.supportLayers: + supportSegmentTable = supportLayer.supportSegmentTable + if len(supportSegmentTable) > 0: + outset = 0.5 * self.perimeterWidth + self.addRaftPerimetersByLoops(getLoopsBySegmentsDictionary(supportSegmentTable, self.interfaceStep), outset) + if self.repository.baseLayers.value < 1 and self.repository.interfaceLayers.value < 1: + return + outset = (1.0 + self.repository.infillOverhangOverExtrusionWidth.value) * self.perimeterWidth + self.addRaftPerimetersByLoops(getLoopsBySegmentsDictionary(self.interfaceSegmentsTable, self.interfaceStep), outset) + + def addRaftPerimetersByLoops(self, loops, outset): + 'Add raft perimeters to the gcode for loops.' + loops = intercircle.getInsetSeparateLoopsFromLoops(-outset, loops) + for loop in loops: + self.distanceFeedRate.addLine('()') + for point in loop: + roundedX = self.distanceFeedRate.getRounded(point.real) + roundedY = self.distanceFeedRate.getRounded(point.imag) + self.distanceFeedRate.addTagBracketedLine('raftPoint', 'X%s Y%s' % (roundedX, roundedY)) + self.distanceFeedRate.addLine('()') + + def addSegmentTablesToSupportLayers(self): + 'Add segment tables to the support layers.' + for supportLayer in self.supportLayers: + supportLayer.supportSegmentTable = {} + xIntersectionsTable = supportLayer.xIntersectionsTable + for xIntersectionsTableKey in xIntersectionsTable: + y = xIntersectionsTableKey * self.interfaceStep + supportLayer.supportSegmentTable[ xIntersectionsTableKey ] = euclidean.getSegmentsFromXIntersections( xIntersectionsTable[ xIntersectionsTableKey ], y ) + + def addSupportLayerTemperature(self, endpoints, z): + 'Add support layer and temperature before the object layer.' + self.distanceFeedRate.addLine('()') + self.distanceFeedRate.addLinesSetAbsoluteDistanceMode(self.supportStartLines) + self.addTemperatureOrbits(endpoints, self.supportedLayersTemperature, z) + aroundPixelTable = {} + aroundWidth = 0.25 * self.interfaceStep + boundaryLoops = self.boundaryLayers[self.layerIndex].loops + halfSupportOutset = 0.5 * self.supportOutset + aroundBoundaryLoops = intercircle.getAroundsFromLoops(boundaryLoops, halfSupportOutset) + for aroundBoundaryLoop in aroundBoundaryLoops: + euclidean.addLoopToPixelTable(aroundBoundaryLoop, aroundPixelTable, aroundWidth) + paths = euclidean.getPathsFromEndpoints(endpoints, 1.5 * self.interfaceStep, aroundPixelTable, aroundWidth) + feedRateMinuteMultiplied = self.operatingFeedRateMinute + supportFlowRateMultiplied = self.supportFlowRate + if self.layerIndex == 0: + feedRateMinuteMultiplied *= self.repository.objectFirstLayerFeedRateInfillMultiplier.value + if supportFlowRateMultiplied != None: + supportFlowRateMultiplied *= self.repository.objectFirstLayerFlowRateInfillMultiplier.value + self.addFlowRate(supportFlowRateMultiplied) + for path in paths: + self.distanceFeedRate.addGcodeFromFeedRateThreadZ(feedRateMinuteMultiplied, path, self.travelFeedRateMinute, z) + self.addFlowRate(self.oldFlowRate) + self.addTemperatureOrbits(endpoints, self.supportLayersTemperature, z) + self.distanceFeedRate.addLinesSetAbsoluteDistanceMode(self.supportEndLines) + self.distanceFeedRate.addLine('()') + + def addSupportSegmentTable( self, layerIndex ): + 'Add support segments from the boundary layers.' + aboveLayer = self.boundaryLayers[ layerIndex + 1 ] + aboveLoops = aboveLayer.loops + supportLayer = self.supportLayers[layerIndex] + if len( aboveLoops ) < 1: + return + boundaryLayer = self.boundaryLayers[layerIndex] + rise = aboveLayer.z - boundaryLayer.z + outsetSupportLoops = intercircle.getInsetSeparateLoopsFromLoops( - self.minimumSupportRatio * rise, boundaryLayer.loops ) + numberOfSubSteps = 4 + subStepSize = self.interfaceStep / float( numberOfSubSteps ) + aboveIntersectionsTable = {} + euclidean.addXIntersectionsFromLoopsForTable( aboveLoops, aboveIntersectionsTable, subStepSize ) + outsetIntersectionsTable = {} + euclidean.addXIntersectionsFromLoopsForTable( outsetSupportLoops, outsetIntersectionsTable, subStepSize ) + euclidean.subtractXIntersectionsTable( aboveIntersectionsTable, outsetIntersectionsTable ) + for aboveIntersectionsTableKey in aboveIntersectionsTable.keys(): + supportIntersectionsTableKey = int( round( float( aboveIntersectionsTableKey ) / numberOfSubSteps ) ) + xIntersectionIndexList = [] + if supportIntersectionsTableKey in supportLayer.xIntersectionsTable: + euclidean.addXIntersectionIndexesFromXIntersections( 0, xIntersectionIndexList, supportLayer.xIntersectionsTable[ supportIntersectionsTableKey ] ) + euclidean.addXIntersectionIndexesFromXIntersections( 1, xIntersectionIndexList, aboveIntersectionsTable[ aboveIntersectionsTableKey ] ) + supportLayer.xIntersectionsTable[ supportIntersectionsTableKey ] = euclidean.getJoinOfXIntersectionIndexes( xIntersectionIndexList ) + + def addTemperatureLineIfDifferent(self, temperature): + 'Add a line of temperature if different.' + if temperature == None: + return + temperatureOutputString = euclidean.getRoundedToThreePlaces(temperature) + if temperatureOutputString == self.oldTemperatureOutputString: + return + if temperatureOutputString != None: + self.distanceFeedRate.addLine('M104 S' + temperatureOutputString) # Set temperature. + self.oldTemperatureOutputString = temperatureOutputString + + def addTemperatureOrbits( self, endpoints, temperature, z ): + 'Add the temperature and orbits around the support layer.' + if self.layerIndex < 0: + return + boundaryLoops = self.boundaryLayers[self.layerIndex].loops + temperatureTimeChange = self.getTemperatureChangeTime( temperature ) + self.addTemperatureLineIfDifferent( temperature ) + if len( boundaryLoops ) < 1: + layerCornerHigh = complex(-987654321.0, -987654321.0) + layerCornerLow = complex(987654321.0, 987654321.0) + for endpoint in endpoints: + layerCornerHigh = euclidean.getMaximum( layerCornerHigh, endpoint.point ) + layerCornerLow = euclidean.getMinimum( layerCornerLow, endpoint.point ) + squareLoop = euclidean.getSquareLoopWiddershins( layerCornerLow, layerCornerHigh ) + intercircle.addOrbitsIfLarge( self.distanceFeedRate, squareLoop, self.orbitalFeedRatePerSecond, temperatureTimeChange, z ) + return + perimeterInset = 0.4 * self.perimeterWidth + insetBoundaryLoops = intercircle.getInsetLoopsFromLoops( perimeterInset, boundaryLoops ) + if len( insetBoundaryLoops ) < 1: + insetBoundaryLoops = boundaryLoops + largestLoop = euclidean.getLargestLoop( insetBoundaryLoops ) + intercircle.addOrbitsIfLarge( self.distanceFeedRate, largestLoop, self.orbitalFeedRatePerSecond, temperatureTimeChange, z ) + + def addToFillXIntersectionIndexTables( self, supportLayer ): + 'Add fill segments from the boundary layers.' + supportLoops = supportLayer.supportLoops + supportLayer.fillXIntersectionsTable = {} + if len(supportLoops) < 1: + return + euclidean.addXIntersectionsFromLoopsForTable( supportLoops, supportLayer.fillXIntersectionsTable, self.interfaceStep ) + + def extendXIntersections( self, loops, radius, xIntersectionsTable ): + 'Extend the support segments.' + xIntersectionsTableKeys = xIntersectionsTable.keys() + for xIntersectionsTableKey in xIntersectionsTableKeys: + lineSegments = euclidean.getSegmentsFromXIntersections( xIntersectionsTable[ xIntersectionsTableKey ], xIntersectionsTableKey ) + xIntersectionIndexList = [] + loopXIntersections = [] + euclidean.addXIntersectionsFromLoops( loops, loopXIntersections, xIntersectionsTableKey ) + for lineSegmentIndex in xrange( len( lineSegments ) ): + lineSegment = lineSegments[ lineSegmentIndex ] + extendedLineSegment = getExtendedLineSegment( radius, lineSegment, loopXIntersections ) + if extendedLineSegment != None: + euclidean.addXIntersectionIndexesFromSegment( lineSegmentIndex, extendedLineSegment, xIntersectionIndexList ) + xIntersections = euclidean.getJoinOfXIntersectionIndexes( xIntersectionIndexList ) + if len( xIntersections ) > 0: + xIntersectionsTable[ xIntersectionsTableKey ] = xIntersections + else: + del xIntersectionsTable[ xIntersectionsTableKey ] + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the raft gcode.' + self.repository = repository + self.minimumSupportRatio = math.tan( math.radians( repository.supportMinimumAngle.value ) ) + self.supportEndLines = settings.getAlterationFileLines(repository.nameOfSupportEndFile.value) + self.supportStartLines = settings.getAlterationFileLines(repository.nameOfSupportStartFile.value) + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + self.temperatureChangeTimeBeforeRaft = 0.0 + if self.repository.initialCircling.value: + maxBaseInterfaceTemperature = max(self.baseTemperature, self.interfaceTemperature) + firstMaxTemperature = max(maxBaseInterfaceTemperature, self.objectFirstLayerPerimeterTemperature) + self.temperatureChangeTimeBeforeRaft = self.getTemperatureChangeTime(firstMaxTemperature) + if repository.addRaftElevateNozzleOrbitSetAltitude.value: + self.addRaft() + self.addTemperatureLineIfDifferent( self.objectFirstLayerPerimeterTemperature ) + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return gcodec.getGcodeWithoutDuplication('M108', self.distanceFeedRate.output.getvalue()) + + def getElevatedBoundaryLine( self, splitLine ): + 'Get elevated boundary gcode line.' + location = gcodec.getLocationFromSplitLine(None, splitLine) + if self.operatingJump != None: + location.z += self.operatingJump + return self.distanceFeedRate.getBoundaryLine( location ) + + def getInsetLoops( self, boundaryLayerIndex ): + 'Inset the support loops if they are not already inset.' + if boundaryLayerIndex not in self.insetTable: + self.insetTable[ boundaryLayerIndex ] = intercircle.getInsetSeparateLoopsFromLoops( self.quarterPerimeterWidth, self.boundaryLayers[ boundaryLayerIndex ].loops ) + return self.insetTable[ boundaryLayerIndex ] + + def getInsetLoopsAbove( self, boundaryLayerIndex ): + 'Get the inset loops above the boundary layer index.' + for aboveLayerIndex in xrange( boundaryLayerIndex + 1, len(self.boundaryLayers) ): + if len( self.boundaryLayers[ aboveLayerIndex ].loops ) > 0: + return self.getInsetLoops( aboveLayerIndex ) + return [] + + def getInsetLoopsBelow( self, boundaryLayerIndex ): + 'Get the inset loops below the boundary layer index.' + for belowLayerIndex in xrange( boundaryLayerIndex - 1, - 1, - 1 ): + if len( self.boundaryLayers[ belowLayerIndex ].loops ) > 0: + return self.getInsetLoops( belowLayerIndex ) + return [] + + def getStepsUntilEnd( self, begin, end, stepSize ): + 'Get steps from the beginning until the end.' + step = begin + steps = [] + while step < end: + steps.append( step ) + step += stepSize + return steps + + def getSupportEndpoints(self): + 'Get the support layer segments.' + if len(self.supportLayers) <= self.layerIndex: + return [] + supportSegmentTable = self.supportLayers[self.layerIndex].supportSegmentTable + if self.layerIndex % 2 == 1 and self.repository.supportCrossHatch.value: + return getVerticalEndpoints(supportSegmentTable, self.interfaceStep, 0.1 * self.perimeterWidth, self.interfaceStep) + return euclidean.getEndpointsFromSegmentTable(supportSegmentTable) + + def getTemperatureChangeTime( self, temperature ): + 'Get the temperature change time.' + if temperature == None: + return 0.0 + oldTemperature = 25.0 # typical chamber temperature + if self.oldTemperatureOutputString != None: + oldTemperature = float( self.oldTemperatureOutputString ) + if temperature == oldTemperature: + return 0.0 + if temperature > oldTemperature: + return ( temperature - oldTemperature ) / self.heatingRate + return ( oldTemperature - temperature ) / abs( self.coolingRate ) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '(': + self.baseTemperature = float(splitLine[1]) + elif firstWord == '(': + self.coolingRate = float(splitLine[1]) + elif firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('raft') + elif firstWord == '(': + self.heatingRate = float(splitLine[1]) + elif firstWord == '(': + self.interfaceTemperature = float(splitLine[1]) + elif firstWord == '(': + return + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + elif firstWord == '(': + self.objectFirstLayerInfillTemperature = float(splitLine[1]) + elif firstWord == '(': + self.objectFirstLayerPerimeterTemperature = float(splitLine[1]) + elif firstWord == '(': + self.objectNextLayersTemperature = float(splitLine[1]) + elif firstWord == '(': + self.orbitalFeedRatePerSecond = float(splitLine[1]) + elif firstWord == '(': + self.operatingFeedRateMinute = 60.0 * float(splitLine[1]) + self.feedRateMinute = self.operatingFeedRateMinute + elif firstWord == '(': + self.oldFlowRate = float(splitLine[1]) + self.supportFlowRate = self.oldFlowRate * self.repository.supportFlowRateOverOperatingFlowRate.value + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.quarterPerimeterWidth = 0.25 * self.perimeterWidth + self.supportOutset = self.perimeterWidth + self.perimeterWidth * self.repository.supportGapOverPerimeterExtrusionWidth.value + elif firstWord == '(': + self.supportLayersTemperature = float(splitLine[1]) + elif firstWord == '(': + self.supportedLayersTemperature = float(splitLine[1]) + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line and add it to the raft skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + if self.extrusionStart: + self.addRaftedLine(splitLine) + return + elif firstWord == 'M101': + if self.isStartupEarly: + self.isStartupEarly = False + return + elif firstWord == 'M108': + self.oldFlowRate = float(splitLine[1][1 :]) + elif firstWord == '(': + line = self.getElevatedBoundaryLine(splitLine) + elif firstWord == '()': + self.extrusionStart = False + self.distanceFeedRate.addLine( self.operatingLayerEndLine ) + elif firstWord == '(': + settings.printProgress(self.layerIndex, 'raft') + self.layerIndex += 1 + boundaryLayer = None + layerZ = self.extrusionTop + float(splitLine[1]) + if len(self.boundaryLayers) > 0: + boundaryLayer = self.boundaryLayers[self.layerIndex] + layerZ = boundaryLayer.z + if self.operatingJump != None: + line = '( %s )' % self.distanceFeedRate.getRounded( layerZ ) + if self.layerStarted and self.addLineLayerStart: + self.distanceFeedRate.addLine('()') + self.layerStarted = False + if self.layerIndex > len(self.supportLayers) + 1: + self.distanceFeedRate.addLine( self.operatingLayerEndLine ) + self.operatingLayerEndLine = '' + if self.addLineLayerStart: + self.distanceFeedRate.addLine(line) + self.addLineLayerStart = True + line = '' + endpoints = self.getSupportEndpoints() + if self.layerIndex == 1: + if len(endpoints) < 1: + temperatureChangeTimeBeforeNextLayers = self.getTemperatureChangeTime( self.objectNextLayersTemperature ) + self.addTemperatureLineIfDifferent( self.objectNextLayersTemperature ) + if self.repository.addRaftElevateNozzleOrbitSetAltitude.value and len( boundaryLayer.loops ) > 0: + self.addOperatingOrbits( boundaryLayer.loops, euclidean.getXYComplexFromVector3( self.oldLocation ), temperatureChangeTimeBeforeNextLayers, layerZ ) + if len(endpoints) > 0: + self.addSupportLayerTemperature( endpoints, layerZ ) + elif firstWord == '(' or firstWord == '()': + self.isPerimeterPath = True + elif firstWord == '()' or firstWord == '()': + self.isPerimeterPath = False + self.distanceFeedRate.addLine(line) + + def setBoundaryLayers(self): + 'Set the boundary layers.' + if self.repository.supportChoiceNone.value: + return + if len(self.boundaryLayers) < 2: + return + if self.repository.supportChoiceEmptyLayersOnly.value: + supportLayer = SupportLayer([]) + self.supportLayers.append(supportLayer) + for boundaryLayerIndex in xrange(1, len(self.boundaryLayers) -1): + self.addEmptyLayerSupport(boundaryLayerIndex) + self.truncateSupportSegmentTables() + self.addSegmentTablesToSupportLayers() + return + for boundaryLayer in self.boundaryLayers: + # thresholdRadius of 0.8 is needed to avoid the ripple inset bug http://hydraraptor.blogspot.com/2010/12/crackers.html + supportLoops = intercircle.getInsetSeparateLoopsFromLoops(-self.supportOutset, boundaryLayer.loops, 0.8) + supportLayer = SupportLayer(supportLoops) + self.supportLayers.append(supportLayer) + for supportLayerIndex in xrange(len(self.supportLayers) - 1): + self.addSupportSegmentTable(supportLayerIndex) + self.truncateSupportSegmentTables() + for supportLayerIndex in xrange(len(self.supportLayers) - 1): + boundaryLoops = self.boundaryLayers[supportLayerIndex].loops + self.extendXIntersections( boundaryLoops, self.supportOutset, self.supportLayers[supportLayerIndex].xIntersectionsTable) + for supportLayer in self.supportLayers: + self.addToFillXIntersectionIndexTables(supportLayer) + if self.repository.supportChoiceExteriorOnly.value: + for supportLayerIndex in xrange(1, len(self.supportLayers)): + self.subtractJoinedFill(supportLayerIndex) + for supportLayer in self.supportLayers: + euclidean.subtractXIntersectionsTable(supportLayer.xIntersectionsTable, supportLayer.fillXIntersectionsTable) + for supportLayerIndex in xrange(len(self.supportLayers) - 2, -1, -1): + xIntersectionsTable = self.supportLayers[supportLayerIndex].xIntersectionsTable + aboveXIntersectionsTable = self.supportLayers[supportLayerIndex + 1].xIntersectionsTable + euclidean.joinXIntersectionsTables(aboveXIntersectionsTable, xIntersectionsTable) + for supportLayerIndex in xrange(len(self.supportLayers)): + supportLayer = self.supportLayers[supportLayerIndex] + self.extendXIntersections(supportLayer.supportLoops, self.raftOutsetRadius, supportLayer.xIntersectionsTable) + for supportLayer in self.supportLayers: + euclidean.subtractXIntersectionsTable(supportLayer.xIntersectionsTable, supportLayer.fillXIntersectionsTable) + self.addSegmentTablesToSupportLayers() + + def setCornersZ(self): + 'Set maximum and minimum corners and z.' + boundaryLoop = None + boundaryLayer = None + layerIndex = - 1 + self.cornerMaximumComplex = complex(-912345678.0, -912345678.0) + self.cornerMinimum = Vector3(912345678.0, 912345678.0, 912345678.0) + self.firstLayerLoops = [] + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '()': + boundaryLoop = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if boundaryLoop == None: + boundaryLoop = [] + boundaryLayer.loops.append(boundaryLoop) + boundaryLoop.append(location.dropAxis()) + self.cornerMaximumComplex = euclidean.getMaximum(self.cornerMaximumComplex, location.dropAxis()) + self.cornerMinimum.minimize(location) + elif firstWord == '(': + z = float(splitLine[1]) + boundaryLayer = euclidean.LoopLayer(z) + self.boundaryLayers.append(boundaryLayer) + elif firstWord == '(': + layerIndex += 1 + if self.repository.supportChoiceNone.value: + if layerIndex > 1: + return + + def subtractJoinedFill( self, supportLayerIndex ): + 'Join the fill then subtract it from the support layer table.' + supportLayer = self.supportLayers[supportLayerIndex] + fillXIntersectionsTable = supportLayer.fillXIntersectionsTable + belowFillXIntersectionsTable = self.supportLayers[ supportLayerIndex - 1 ].fillXIntersectionsTable + euclidean.joinXIntersectionsTables( belowFillXIntersectionsTable, supportLayer.fillXIntersectionsTable ) + euclidean.subtractXIntersectionsTable( supportLayer.xIntersectionsTable, supportLayer.fillXIntersectionsTable ) + + def truncateSupportSegmentTables(self): + 'Truncate the support segments after the last support segment which contains elements.' + for supportLayerIndex in xrange( len(self.supportLayers) - 1, - 1, - 1 ): + if len( self.supportLayers[supportLayerIndex].xIntersectionsTable ) > 0: + self.supportLayers = self.supportLayers[ : supportLayerIndex + 1 ] + return + self.supportLayers = [] + + +class SupportLayer: + 'Support loops with segment tables.' + def __init__( self, supportLoops ): + self.supportLoops = supportLoops + self.supportSegmentTable = {} + self.xIntersectionsTable = {} + + def __repr__(self): + 'Get the string representation of this loop layer.' + return '%s' % ( self.supportLoops ) + + +def main(): + 'Display the raft dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/raft.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/raft.pyc new file mode 100644 index 0000000..5d951c9 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/raft.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/scale.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/scale.py new file mode 100644 index 0000000..78620b1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/scale.py @@ -0,0 +1,159 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Scale scales the carving to compensate for shrinkage after the extrusion has cooled. + +It is best to only change the XY Plane Scale, because that does not affect other variables. If you choose to change the Z Axis Scale, that increases the layer thickness so you must increase the feed rate in speed by the same amount and maybe some other variables which depend on layer thickness. + +==Operation== +The default 'Activate Scale' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===XY Plane Scale=== +Default is 1.01. + +Defines the amount the xy plane of the carving will be scaled. The xy coordinates will be scaled, but the perimeterWidth is not changed, so this can be changed without affecting other variables. + +===Z Axis Scale=== +Default is one. + +Defines the amount the z axis of the carving will be scaled. The default is one because changing this changes many variables related to the layer thickness. For example, the feedRate should be multiplied by the Z Axis Scale because the layers would be farther apart.. + +===SVG Viewer=== +Default is webbrowser. + +If the 'SVG Viewer' is set to the default 'webbrowser', the scalable vector graphics file will be sent to the default browser to be opened. If the 'SVG Viewer' is set to a program name, the scalable vector graphics file will be sent to that program to be opened. + +==Examples== +The following examples scale the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and scale.py. + +> python scale.py +This brings up the scale dialog. + +> python scale.py Screw Holder Bottom.stl +The scale tool is parsing the file: +Screw Holder Bottom.stl +.. +The scale tool has created the file: +.. Screw Holder Bottom_scale.gcode + +""" + +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 datetime import date +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.svg_reader import SVGReader +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from fabmetheus_utilities import svg_writer +from fabmetheus_utilities import xml_simple_writer +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import cStringIO +import os +import sys +import time + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, svgText='', repository=None): + "Scale and convert an svg file or svgText." + return getCraftedTextFromText(fileName, archive.getTextIfEmpty(fileName, svgText), repository) + +def getCraftedTextFromText(fileName, svgText, repository=None): + "Scale and convert an svgText." + if gcodec.isProcedureDoneOrFileIsEmpty(svgText, 'scale'): + return svgText + if repository == None: + repository = settings.getReadRepository(ScaleRepository()) + if repository.activateScale.value: + return ScaleSkein().getCraftedGcode(fileName, repository, svgText) + return svgText + +def getNewRepository(): + 'Get new repository.' + return ScaleRepository() + +def setLoopLayerScale(rotatedLoopLayer, xyPlaneScale, zAxisScale): + "Set the slice element scale." + for loop in rotatedLoopLayer.loops: + for pointIndex in xrange(len(loop)): + loop[pointIndex] *= xyPlaneScale + rotatedLoopLayer.z *= zAxisScale + +def writeOutput(fileName, shouldAnalyze=True): + 'Scale the carving.' + skeinforge_craft.writeSVGTextWithNounMessage(fileName, ScaleRepository(), shouldAnalyze) + + +class ScaleRepository: + "A class to handle the scale settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.scale.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName(fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Scale', self, '') + self.activateScale = settings.BooleanSetting().getFromValue('Activate Scale', self, False) + self.xyPlaneScale = settings.FloatSpin().getFromValue(0.99, 'XY Plane Scale (ratio):', self, 1.03, 1.01) + self.zAxisScale = settings.FloatSpin().getFromValue(0.99, 'Z Axis Scale (ratio):', self, 1.02, 1.0) + self.svgViewer = settings.StringSetting().getFromValue('SVG Viewer:', self, 'webbrowser') + self.executeTitle = 'Scale' + + def execute(self): + "Scale button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class ScaleSkein: + "A class to scale a skein of extrusions." + def getCraftedGcode(self, fileName, repository, svgText): + "Parse svgText and store the scale svgText." + svgReader = SVGReader() + svgReader.parseSVG('', svgText) + if svgReader.sliceDictionary == None: + print('Warning, nothing will be done because the sliceDictionary could not be found getCraftedGcode in preface.') + return '' + xyPlaneScale = repository.xyPlaneScale.value + zAxisScale = repository.zAxisScale.value + decimalPlacesCarried = int(svgReader.sliceDictionary['decimalPlacesCarried']) + layerThickness = zAxisScale * float(svgReader.sliceDictionary['layerThickness']) + perimeterWidth = float(svgReader.sliceDictionary['perimeterWidth']) + rotatedLoopLayers = svgReader.rotatedLoopLayers + for rotatedLoopLayer in rotatedLoopLayers: + setLoopLayerScale(rotatedLoopLayer, xyPlaneScale, zAxisScale) + cornerMaximum = Vector3(-912345678.0, -912345678.0, -912345678.0) + cornerMinimum = Vector3(912345678.0, 912345678.0, 912345678.0) + svg_writer.setSVGCarvingCorners(cornerMaximum, cornerMinimum, layerThickness, rotatedLoopLayers) + svgWriter = svg_writer.SVGWriter( + True, + cornerMaximum, + cornerMinimum, + decimalPlacesCarried, + layerThickness, + perimeterWidth) + commentElement = svg_writer.getCommentElement(svgReader.documentElement) + procedureNameString = svgReader.sliceDictionary['procedureName'] + ',scale' + return svgWriter.getReplacedSVGTemplate(fileName, procedureNameString, rotatedLoopLayers, commentElement) + + +def main(): + "Display the scale dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/scale.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/scale.pyc new file mode 100644 index 0000000..be841e6 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/scale.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skin.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skin.py new file mode 100644 index 0000000..9484b6d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skin.py @@ -0,0 +1,344 @@ +""" +This page is in the table of contents. +Skin is a script to smooth the surface skin of an object by replacing the perimeter surface with a surface printed at half the carve +height. This gives the impression that the object was carved at a much thinner height giving a high-quality finish, but still prints +in a relatively short time. The latest process has some similarities with a description at: +http://adventuresin3-dprinting.blogspot.com/2011/05/skinning.html + +The skin manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Skin + + +==Operation== +The default 'Activate Skin' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Hop When Extruding Infill=== +Default is off. + +When selected, the extruder will hop before and after extruding the lower infill in order to avoid the regular thickness threads. + +====Layer From==== +Default is one. + +Defines which layer of the print the skinning process starts from. It is not wise to set this to zero, skinning the bottom layer is likely to cause the bottom perimeter not to adhere well to the print surface. + +====Tips==== +Due to the very small Z-axis moves skinning can generate as it prints the perimeter, it can cause the Z-axis speed to be limited by the Limit plug-in, if you have it enabled. This can cause some printers to pause excessively during each layer change. To overcome this, ensure that the Z-axis max speed in the Limit tool is set to an appropriate value for your printer, e.g. 10mm/s + +Since Skin prints two half-height perimeter layers for each layer, printing the perimeter last causes the print head to travel down from the current print height. Depending on the shape of your extruder nozzle, you may get higher quality prints if you print the perimeters first, so the print head always travels up. This is set via the Thread Sequence Choice setting in the Fill tool. + + +==Examples== +The following examples skin the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and skin.py. + +> python skin.py +This brings up the skin dialog. + +> python skin.py Screw Holder Bottom.stl +The skin tool is parsing the file: +Screw Holder Bottom.stl +.. +The skin tool has created the file: +.. Screw Holder Bottom_skin.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique aht yahoo.com) & James Blackwell (jim_blag ahht hotmail.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, gcodeText, repository=None): + 'Skin a gcode linear move text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, gcodeText), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Skin a gcode linear move text.' + if gcodec.isProcedureDoneOrFileIsEmpty(gcodeText, 'skin'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(SkinRepository()) + if not repository.activateSkin.value: + return gcodeText + return SkinSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return SkinRepository() + +def writeOutput(fileName, shouldAnalyze=True): + 'Skin a gcode linear move file. Chain skin the gcode if it is not already skinned.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'skin', shouldAnalyze) + + +class SkinRepository: + 'A class to handle the skin settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.skin.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Skin', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Skin') + self.activateSkin = settings.BooleanSetting().getFromValue('Activate Skin', self, False) + self.halfWidthPerimeter = settings.BooleanSetting().getFromValue('Half Width Perimeter', self, True) + self.hopWhenExtrudingInfill = settings.BooleanSetting().getFromValue('Hop When Extruding Infill', self, False) + self.layersFrom = settings.IntSpin().getSingleIncrementFromValue(0, 'Layers From (index):', self, 912345678, 1) + self.executeTitle = 'Skin' + + def execute(self): + 'Skin button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class SkinSkein: + 'A class to skin a skein of extrusions.' + def __init__(self): + 'Initialize.' + self.clipOverPerimeterWidth = 0.0 + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = 959.0 + self.infill = None + self.infillBoundaries = None + self.infillBoundary = None + self.layerCount = settings.LayerCount() + self.layerIndex = -1 + self.lineIndex = 0 + self.lines = None + self.maximumZFeedRateMinute = 60.0 + self.oldFlowRate = None + self.oldLocation = None + self.perimeter = None + self.travelFeedRateMinute = 957.0 + + def addFlowRateLine(self, flowRate): + 'Add a flow rate line.' + self.distanceFeedRate.addLine('M108 S' + euclidean.getFourSignificantFigures(flowRate)) + + def addPerimeterLoop(self, thread, z): + 'Add the perimeter loop to the gcode.' + self.distanceFeedRate.addGcodeFromFeedRateThreadZ(self.feedRateMinute, thread, self.travelFeedRateMinute, z) + + def addSkinnedInfill(self): + 'Add skinned infill.' + if self.infillBoundaries == None: + return + offsetY = 0.5 * self.skinInfillWidth + upperZ = self.oldLocation.z + lowerZ = upperZ - self.halfLayerThickness + self.addFlowRateLine(0.25 * self.oldFlowRate) + self.addSkinnedInfillBoundary(self.infillBoundaries, 0.0, upperZ, lowerZ) + self.addSkinnedInfillBoundary(self.infillBoundaries, offsetY, upperZ, upperZ) + self.addFlowRateLine(self.oldFlowRate) + self.infillBoundaries = None + + def addSkinnedInfillBoundary(self, infillBoundaries, offsetY, upperZ, z): + 'Add skinned infill boundary.' + aroundInset = 0.25 * self.skinInfillInset + arounds = [] + aroundWidth = 0.25 * self.skinInfillInset + endpoints = [] + pixelTable = {} + rotatedLoops = [] + for infillBoundary in infillBoundaries: + infillBoundaryRotated = euclidean.getRotatedComplexes(self.reverseRotation, infillBoundary) + if offsetY != 0.0: + for infillPointRotatedIndex, infillPointRotated in enumerate(infillBoundaryRotated): + infillBoundaryRotated[infillPointRotatedIndex] = complex(infillPointRotated.real, infillPointRotated.imag - offsetY) + rotatedLoops.append(infillBoundaryRotated) + infillDictionary = triangle_mesh.getInfillDictionary( + aroundInset, arounds, aroundWidth, self.skinInfillInset, self.skinInfillWidth, pixelTable, rotatedLoops) + for infillDictionaryKey in infillDictionary.keys(): + xIntersections = infillDictionary[infillDictionaryKey] + xIntersections.sort() + for segment in euclidean.getSegmentsFromXIntersections(xIntersections, infillDictionaryKey * self.skinInfillWidth): + for endpoint in segment: + endpoint.point = complex(endpoint.point.real, endpoint.point.imag + offsetY) + endpoints.append(endpoint) + infillPaths = euclidean.getPathsFromEndpoints(endpoints, 5.0 * self.skinInfillWidth, pixelTable, aroundWidth) + for infillPath in infillPaths: + infillRotated = euclidean.getRotatedComplexes(self.rotation, infillPath) + if upperZ > z and self.repository.hopWhenExtrudingInfill.value: + self.distanceFeedRate.addGcodeMovementZWithFeedRate(self.maximumZFeedRateMinute, infillRotated[0], upperZ) + self.distanceFeedRate.addGcodeFromFeedRateThreadZ(self.feedRateMinute, infillRotated, self.travelFeedRateMinute, z) + lastPointRotated = infillRotated[-1] + self.oldLocation = Vector3(lastPointRotated.real, lastPointRotated.imag, upperZ) + if upperZ > z and self.repository.hopWhenExtrudingInfill.value: + self.distanceFeedRate.addGcodeMovementZWithFeedRate(self.maximumZFeedRateMinute, lastPointRotated, upperZ) + + def addSkinnedPerimeter(self): + 'Add skinned perimeter.' + if self.perimeter == None: + return + perimeterThread = self.perimeter[: -1] + lowerZ = self.oldLocation.z - self.halfLayerThickness + innerPerimeter = intercircle.getLargestInsetLoopFromLoop(perimeterThread, self.quarterPerimeterWidth) + outerPerimeter = intercircle.getLargestInsetLoopFromLoop(perimeterThread, -self.quarterPerimeterWidth) + innerPerimeter = self.getClippedSimplifiedLoopPathByLoop(innerPerimeter) + outerPerimeter = self.getClippedSimplifiedLoopPathByLoop(outerPerimeter) + if len(innerPerimeter) < 4 or len(outerPerimeter) < 4 or not self.repository.halfWidthPerimeter.value: + self.addFlowRateLine(0.5 * self.oldFlowRate) + self.addPerimeterLoop(self.perimeter, lowerZ) + self.addPerimeterLoop(self.perimeter, self.oldLocation.z) + else: + self.addFlowRateLine(0.25 * self.oldFlowRate) + self.addPerimeterLoop(innerPerimeter, lowerZ) + self.addPerimeterLoop(outerPerimeter, lowerZ) + self.addPerimeterLoop(innerPerimeter, self.oldLocation.z) + self.addPerimeterLoop(outerPerimeter, self.oldLocation.z) + self.addFlowRateLine(self.oldFlowRate) + self.perimeter = None + + def getClippedSimplifiedLoopPathByLoop(self, loop): + 'Get clipped and simplified loop path from a loop.' + if len(loop) == 0: + return [] + loopPath = loop + [loop[0]] + return euclidean.getClippedSimplifiedLoopPath(self.clipLength, loopPath, self.halfPerimeterWidth) + + def getCraftedGcode( self, gcodeText, repository ): + 'Parse gcode text and store the skin gcode.' + self.lines = archive.getTextLines(gcodeText) + self.repository = repository + self.layersFromBottom = self.repository.layersFrom.value + self.parseInitialization() + self.skinInfillInset = 0.5 * (self.infillWidth + self.skinInfillWidth) * (1.0 - self.infillPerimeterOverlap) + self.clipLength = 0.5 * self.clipOverPerimeterWidth * self.perimeterWidth + self.parseBoundaries() + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return gcodec.getGcodeWithoutDuplication('M108', self.distanceFeedRate.output.getvalue()) + + def parseBoundaries(self): + 'Parse the boundaries and add them to the boundary layers.' + self.boundaryLayers = [] + self.layerIndexTop = -1 + boundaryLoop = None + boundaryLayer = None + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '()': + boundaryLoop = None + elif firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if boundaryLoop == None: + boundaryLoop = [] + boundaryLayer.loops.append(boundaryLoop) + boundaryLoop.append(location.dropAxis()) + elif firstWord == '(': + boundaryLayer = euclidean.LoopLayer(float(splitLine[1])) + self.boundaryLayers.append(boundaryLayer) + self.layerIndexTop += 1 + for boundaryLayerIndex, boundaryLayer in enumerate(self.boundaryLayers): + if len(boundaryLayer.loops) > 0: + self.layersFromBottom += boundaryLayerIndex + return + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '(': + self.clipOverPerimeterWidth = float(splitLine[1]) + elif firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('skin') + return + elif firstWord == '(': + self.infillPerimeterOverlap = float(splitLine[1]) + elif firstWord == '(': + self.infillWidth = float(splitLine[1]) + self.skinInfillWidth = 0.5 * self.infillWidth + elif firstWord == '(': + self.halfLayerThickness = 0.5 * float(splitLine[1]) + elif firstWord == '(': + self.maximumZFeedRateMinute = 60.0 * float(splitLine[1]) + elif firstWord == '(': + self.oldFlowRate = float(splitLine[1]) + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.halfPerimeterWidth = 0.5 * self.perimeterWidth + self.quarterPerimeterWidth = 0.25 * self.perimeterWidth + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line and add it to the skin skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.oldLocation = location + if self.infillBoundaries != None: + return + if self.perimeter != None: + self.perimeter.append(location.dropAxis()) + return + elif firstWord == '()': + if self.layerIndex >= self.layersFromBottom and self.layerIndex == self.layerIndexTop: + self.infillBoundaries = [] + elif firstWord == '()': + self.addSkinnedInfill() + elif firstWord == '()': + if self.infillBoundaries != None: + self.infillBoundary = [] + self.infillBoundaries.append(self.infillBoundary) + elif firstWord == '(': + if self.infillBoundaries != None: + location = gcodec.getLocationFromSplitLine(None, splitLine) + self.infillBoundary.append(location.dropAxis()) + elif firstWord == '(': + self.layerCount.printProgressIncrement('skin') + self.layerIndex += 1 + elif firstWord == 'M101' or firstWord == 'M103': + if self.infillBoundaries != None or self.perimeter != None: + return + elif firstWord == 'M108': + self.oldFlowRate = gcodec.getDoubleAfterFirstLetter(splitLine[1]) + elif firstWord == '(': + if self.layerIndex >= self.layersFromBottom: + self.perimeter = [] + elif firstWord == '(': + self.rotation = gcodec.getRotationBySplitLine(splitLine) + self.reverseRotation = complex(self.rotation.real, -self.rotation.imag) + elif firstWord == '()': + self.addSkinnedPerimeter() + self.distanceFeedRate.addLine(line) + + +def main(): + 'Display the skin dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skin.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skin.pyc new file mode 100644 index 0000000..96bae52 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skin.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py new file mode 100644 index 0000000..3334ac5 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.py @@ -0,0 +1,344 @@ +""" +This page is in the table of contents. +Skirt is a script to give the extruder some extra time to begin extruding properly before beginning the object, and to put a baffle around the model in order to keep the extrusion warm. + +It is loosely based on Lenbook's outline plugin: +http://www.thingiverse.com/thing:4918 + +it is also loosely based on the outline that Nophead sometimes uses: +http://hydraraptor.blogspot.com/2010/01/hot-metal-and-serendipity.html + +and also loosely based on the baffles that Nophead made to keep corners warm: +http://hydraraptor.blogspot.com/2010/09/some-corners-like-it-hot.html + +If you want only an outline, set 'Layers To' to one. This gives the extruder some extra time to begin extruding properly before beginning your object, and gives you an early verification of where your object will be extruded. + +If you also want an insulating skirt around the entire object, set 'Layers To' to a huge number, like 9876554321. This will additionally make an insulating baffle around the object; to prevent moving air from cooling the object, which increases warping, especially in corners. + +==Operation== +The default 'Activate Skirt' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Convex=== +Default is on. + +When selected, the skirt will be convex, going around the model with only convex angles. If convex is not selected, the skirt will hug the model, going into every nook and cranny. + +===Gap over Perimeter Width=== +Default is three. + +Defines the ratio of the gap between the object and the skirt over the perimeter width. If the ratio is too low, the skirt will connect to the object, if the ratio is too high, the skirt willl not provide much insulation for the object. + +====Layers To==== +Default is a one. + +Defines the number of layers of the skirt. If you want only an outline, set 'Layers To' to one. If you want an insulating skirt around the entire object, set 'Layers To' to a huge number, like 9876554321. + +==Examples== +The following examples skirt the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and skirt.py. + +> python skirt.py +This brings up the skirt dialog. + +> python skirt.py Screw Holder Bottom.stl +The skirt tool is parsing the file: +Screw Holder Bottom.stl +.. +The skirt tool has created the file: +.. Screw Holder Bottom_skirt.gcode + +""" + + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, text='', repository=None): + 'Skirt the fill file or text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Skirt the fill text.' + if gcodec.isProcedureDoneOrFileIsEmpty(gcodeText, 'skirt'): + return gcodeText + if repository == None: + repository = settings.getReadRepository(SkirtRepository()) + if not repository.activateSkirt.value: + return gcodeText + return SkirtSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return SkirtRepository() + +def getOuterLoops(loops): + 'Get widdershins outer loops.' + outerLoops = [] + for loop in loops: + if not euclidean.isPathInsideLoops(outerLoops, loop): + outerLoops.append(loop) + intercircle.directLoops(True, outerLoops) + return outerLoops + +def writeOutput(fileName, shouldAnalyze=True): + 'Skirt a gcode linear move file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'skirt', shouldAnalyze) + + +class LoopCrossDictionary: + 'Loop with a horizontal and vertical dictionary.' + def __init__(self): + 'Initialize LoopCrossDictionary.' + self.loop = [] + + def __repr__(self): + 'Get the string representation of this LoopCrossDictionary.' + return str(self.__dict__) + + +class SkirtRepository: + 'A class to handle the skirt settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.skirt.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( + fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Skirt', self, '') + self.activateSkirt = settings.BooleanSetting().getFromValue('Activate Skirt', self, False) + self.convex = settings.BooleanSetting().getFromValue('Convex:', self, True) + self.gapOverPerimeterWidth = settings.FloatSpin().getFromValue( + 1.0, 'Gap over Perimeter Width (ratio):', self, 5.0, 3.0) + self.layersTo = settings.IntSpin().getSingleIncrementFromValue(0, 'Layers To (index):', self, 912345678, 1) + self.executeTitle = 'Skirt' + + def execute(self): + 'Skirt button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( + self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class SkirtSkein: + 'A class to skirt a skein of extrusions.' + def __init__(self): + 'Initialize variables.' + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = 961.0 + self.isExtruderActive = False + self.isSupportLayer = False + self.layerCount = settings.LayerCount() + self.layerIndex = -1 + self.lineIndex = 0 + self.lines = None + self.oldFlowRate = None + self.oldLocation = None + self.oldTemperatureInput = None + self.skirtFlowRate = None + self.skirtTemperature = None + self.travelFeedRateMinute = 957.0 + self.unifiedLoop = LoopCrossDictionary() + + def addFlowRate(self, flowRate): + 'Add a line of temperature if different.' + if flowRate != None: + self.distanceFeedRate.addLine('M108 S' + euclidean.getFourSignificantFigures(flowRate)) + + def addSkirt(self, z): + 'At skirt at z to gcode output.' + self.setSkirtFeedFlowTemperature() + self.distanceFeedRate.addLine('()') + oldTemperature = self.oldTemperatureInput + self.addTemperatureLineIfDifferent(self.skirtTemperature) + self.addFlowRate(self.skirtFlowRate) + for outsetLoop in self.outsetLoops: + closedLoop = outsetLoop + [outsetLoop[0]] + self.distanceFeedRate.addGcodeFromFeedRateThreadZ(self.feedRateMinute, closedLoop, self.travelFeedRateMinute, z) + self.addFlowRate(self.oldFlowRate) + self.addTemperatureLineIfDifferent(oldTemperature) + self.distanceFeedRate.addLine('()') + + def addTemperatureLineIfDifferent(self, temperature): + 'Add a line of temperature if different.' + if temperature == None or temperature == self.oldTemperatureInput: + return + self.distanceFeedRate.addLine('M104 S' + euclidean.getRoundedToThreePlaces(temperature)) + self.oldTemperatureInput = temperature + + def createSegmentDictionaries(self, loopCrossDictionary): + 'Create horizontal and vertical segment dictionaries.' + loopCrossDictionary.horizontalDictionary = self.getHorizontalXIntersectionsTable(loopCrossDictionary.loop) + flippedLoop = euclidean.getDiagonalFlippedLoop(loopCrossDictionary.loop) + loopCrossDictionary.verticalDictionary = self.getHorizontalXIntersectionsTable(flippedLoop) + + def createSkirtLoops(self): + 'Create the skirt loops.' + points = euclidean.getPointsByHorizontalDictionary(self.perimeterWidth, self.unifiedLoop.horizontalDictionary) + points += euclidean.getPointsByVerticalDictionary(self.perimeterWidth, self.unifiedLoop.verticalDictionary) + loops = triangle_mesh.getDescendingAreaOrientedLoops(points, points, 2.5 * self.perimeterWidth) + outerLoops = getOuterLoops(loops) + outsetLoops = intercircle.getInsetSeparateLoopsFromLoops(-self.skirtOutset, outerLoops) + self.outsetLoops = getOuterLoops(outsetLoops) + if self.repository.convex.value: + self.outsetLoops = [euclidean.getLoopConvex(euclidean.getConcatenatedList(self.outsetLoops))] + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the skirt gcode.' + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + self.parseBoundaries() + self.createSkirtLoops() + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return gcodec.getGcodeWithoutDuplication('M108', self.distanceFeedRate.output.getvalue()) + + def getHorizontalXIntersectionsTable(self, loop): + 'Get the horizontal x intersections table from the loop.' + horizontalXIntersectionsTable = {} + euclidean.addXIntersectionsFromLoopForTable(loop, horizontalXIntersectionsTable, self.perimeterWidth) + return horizontalXIntersectionsTable + + def parseBoundaries(self): + 'Parse the boundaries and union them.' + self.createSegmentDictionaries(self.unifiedLoop) + if self.repository.layersTo.value < 1: + return + loopCrossDictionary = None + layerIndex = -1 + for line in self.lines[self.lineIndex :]: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == '()' or firstWord == '()': + self.createSegmentDictionaries(loopCrossDictionary) + self.unifyLayer(loopCrossDictionary) + loopCrossDictionary = None + elif firstWord == '(' or firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + if loopCrossDictionary == None: + loopCrossDictionary = LoopCrossDictionary() + loopCrossDictionary.loop.append(location.dropAxis()) + elif firstWord == '(': + layerIndex += 1 + if layerIndex > self.repository.layersTo.value: + return + self.layerCount.printProgressIncrement('skirt') + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('skirt') + return + elif firstWord == '(': + self.oldTemperatureInput = float(splitLine[1]) + self.skirtTemperature = self.oldTemperatureInput + elif firstWord == '(': + self.feedRateMinute = 60.0 * float(splitLine[1]) + elif firstWord == '(': + self.oldFlowRate = float(splitLine[1]) + self.skirtFlowRate = self.oldFlowRate + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.skirtOutset = (self.repository.gapOverPerimeterWidth.value + 0.5) * self.perimeterWidth + self.distanceFeedRate.addTagRoundedLine('skirtOutset', self.skirtOutset) + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line and add it to the skirt skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '()' or firstWord == '()' or firstWord == '(': + return + self.distanceFeedRate.addLine(line) + if firstWord == 'G1': + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + elif firstWord == '(': + self.layerIndex += 1 + if self.layerIndex < self.repository.layersTo.value: + self.addSkirt(float(splitLine[1])) + elif firstWord == 'M101': + self.isExtruderActive = True + elif firstWord == 'M103': + self.isExtruderActive = False + elif firstWord == 'M104': + self.oldTemperatureInput = gcodec.getDoubleAfterFirstLetter(splitLine[1]) + self.skirtTemperature = self.oldTemperatureInput + elif firstWord == 'M108': + self.oldFlowRate = gcodec.getDoubleAfterFirstLetter(splitLine[1]) + self.skirtFlowRate = self.oldFlowRate + elif firstWord == '()': + self.isSupportLayer = True + elif firstWord == '()': + self.isSupportLayer = False + + def setSkirtFeedFlowTemperature(self): + 'Set the skirt feed rate, flow rate and temperature to that of the next extrusion.' + isExtruderActive = self.isExtruderActive + isSupportLayer = self.isSupportLayer + for lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + if isExtruderActive: + if not isSupportLayer: + return + elif firstWord == 'M101': + isExtruderActive = True + elif firstWord == 'M103': + isExtruderActive = False + elif firstWord == 'M104': + self.skirtTemperature = gcodec.getDoubleAfterFirstLetter(splitLine[1]) + elif firstWord == 'M108': + self.skirtFlowRate = gcodec.getDoubleAfterFirstLetter(splitLine[1]) + elif firstWord == '()': + isSupportLayer = True + elif firstWord == '()': + isSupportLayer = False + + def unifyLayer(self, loopCrossDictionary): + 'Union the loopCrossDictionary with the unifiedLoop.' + euclidean.joinXIntersectionsTables(loopCrossDictionary.horizontalDictionary, self.unifiedLoop.horizontalDictionary) + euclidean.joinXIntersectionsTables(loopCrossDictionary.verticalDictionary, self.unifiedLoop.verticalDictionary) + + +def main(): + 'Display the skirt dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.pyc new file mode 100644 index 0000000..1251944 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/skirt.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py new file mode 100644 index 0000000..edb967c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/speed.py @@ -0,0 +1,292 @@ +""" +This page is in the table of contents. +Speed is a script to set the feed rate, and flow rate. + +The speed manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Speed + +==Operation== +The default 'Activate Speed' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. The speed script sets the feed rate, and flow rate. + +==Settings== +===Add Flow Rate=== +Default is on. + +When selected, the flow rate will be added to the gcode. + +===Bridge=== +====Bridge Feed Rate Multiplier==== +Default is one. + +Defines the ratio of the feed rate on the bridge layers over the feed rate of the typical non bridge layers. + +====Bridge Flow Rate Multiplier==== +Default is one. + +Defines the ratio of the flow rate on the bridge layers over the flow rate of the typical non bridge layers. + +===Duty Cyle=== +====Duty Cyle at Beginning==== +Default is one, which will set the extruder motor to full current. + +Defines the duty cycle of the stepper motor pulse width modulation by adding an M113 command toward the beginning of the gcode text. If the hardware has the option of using a potentiometer to set the duty cycle, to select the potentiometer option set 'Duty Cyle at Beginning' to an empty string. To turn off the extruder, set the 'Duty Cyle at Beginning' to zero. + +====Duty Cyle at Ending==== +Default is zero, which will turn off the extruder motor. + +Defines the duty cycle of the stepper motor pulse width modulation by adding an M113 command toward the ending of the gcode text. If the hardware has the option of using a potentiometer to set the duty cycle, to select the potentiometer option set 'Duty Cyle at Beginning' to an empty string. To turn off the extruder, set the 'Duty Cyle at Ending' to zero. + +===Feed Rate=== +Default is sixteen millimeters per second. + +Defines the operating feed rate. + +===Flow Rate Setting=== +Default is 210. + +Defines the operating flow rate. + +===Orbital Feed Rate over Operating Feed Rate=== +Default is 0.5. + +Defines the speed of the orbit compared to the operating extruder speed. If you want the orbit to be very short, set the "Orbital Feed Rate over Operating Feed Rate" setting to a low value like 0.1. + +===Maximum Z Feed Rate=== +Default is one millimeter per second. + +Defines the maximum speed that the tool head will move in the z direction. Also defines the speed of a vertical hop, like the infill hop in skin. + +===Perimeter=== +To have higher build quality on the outside at the expense of slower build speed, a typical setting for the 'Perimeter Feed Rate over Operating Feed Rate' would be 0.5. To go along with that, if you are using a speed controlled extruder, the 'Perimeter Flow Rate over Operating Flow Rate' 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 'Flow Rate 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 Flow Rate over Operating Flow Rate ~ Perimeter Feed Rate over Operating Feed Rate * ( Flow Rate PWM Setting - Minimum Flow Rate PWM Setting ) + Minimum Flow Rate PWM Setting + +====Perimeter Feed Rate over Operating Feed Rate==== +Default is one. + +Defines the ratio of the feed rate of the perimeter over the feed rate of the infill. + +====Perimeter Flow Rate over Operating Feed Rate==== +Default is one. + +Defines the ratio of the flow rate of the perimeter over the flow rate of the infill. + +===Travel Feed Rate=== +Default is sixteen millimeters per second. + +Defines the feed rate when the extruder is off. The 'Travel Feed Rate' could be set as high as the extruder can be moved, it is not limited by the maximum extrusion rate. + +==Examples== +The following examples speed the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and speed.py. + +> python speed.py +This brings up the speed dialog. + +> python speed.py Screw Holder Bottom.stl +The speed tool is parsing the file: +Screw Holder Bottom.stl +.. +The speed tool has created the file: +.. Screw Holder Bottom_speed.gcode + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text='', repository=None): + "Speed the file or text." + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + "Speed a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'speed'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( SpeedRepository() ) + if not repository.activateSpeed.value: + return gcodeText + return SpeedSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return SpeedRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Speed a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'speed', shouldAnalyze) + + +class SpeedRepository: + "A class to handle the speed settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.speed.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Speed', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Speed') + self.activateSpeed = settings.BooleanSetting().getFromValue('Activate Speed', self, True ) + self.addFlowRate = settings.BooleanSetting().getFromValue('Add Flow Rate:', self, True ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Bridge -', self ) + self.bridgeFeedRateMultiplier = settings.FloatSpin().getFromValue( 0.8, 'Bridge Feed Rate Multiplier (ratio):', self, 1.2, 1.0 ) + self.bridgeFlowRateMultiplier = settings.FloatSpin().getFromValue( 0.8, 'Bridge Flow Rate Multiplier (ratio):', self, 1.2, 1.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Duty Cyle -', self ) + self.dutyCycleAtBeginning = settings.FloatSpin().getFromValue( 0.0, 'Duty Cyle at Beginning (portion):', self, 1.0, 1.0 ) + self.dutyCycleAtEnding = settings.FloatSpin().getFromValue( 0.0, 'Duty Cyle at Ending (portion):', self, 1.0, 0.0 ) + settings.LabelSeparator().getFromRepository(self) + self.feedRatePerSecond = settings.FloatSpin().getFromValue( 2.0, 'Feed Rate (mm/s):', self, 50.0, 16.0 ) + self.flowRateSetting = settings.FloatSpin().getFromValue( 50.0, 'Flow Rate Setting (float):', self, 250.0, 210.0 ) + self.orbitalFeedRateOverOperatingFeedRate = settings.FloatSpin().getFromValue( 0.1, 'Orbital Feed Rate over Operating Feed Rate (ratio):', self, 0.9, 0.5 ) + self.maximumZFeedRatePerSecond = settings.FloatSpin().getFromValue(0.5, 'Maximum Z Feed Rate (mm/s):', self, 10.0, 1.0) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Perimeter -', self ) + self.perimeterFeedRateOverOperatingFeedRate = settings.FloatSpin().getFromValue( 0.5, 'Perimeter Feed Rate over Operating Feed Rate (ratio):', self, 1.0, 1.0 ) + self.perimeterFlowRateOverOperatingFlowRate = settings.FloatSpin().getFromValue( 0.5, 'Perimeter Flow Rate over Operating Flow Rate (ratio):', self, 1.0, 1.0 ) + settings.LabelSeparator().getFromRepository(self) + self.travelFeedRatePerSecond = settings.FloatSpin().getFromValue( 2.0, 'Travel Feed Rate (mm/s):', self, 50.0, 16.0 ) + self.executeTitle = 'Speed' + + def execute(self): + "Speed button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class SpeedSkein: + "A class to speed a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRatePerSecond = 16.0 + self.isBridgeLayer = False + self.isExtruderActive = False + self.isPerimeterPath = False + self.lineIndex = 0 + self.lines = None + self.oldFlowRate = None + + def addFlowRateLine(self): + "Add flow rate line." + if not self.repository.addFlowRate.value: + return + flowRate = self.repository.flowRateSetting.value + if self.isBridgeLayer: + flowRate *= self.repository.bridgeFlowRateMultiplier.value + if self.isPerimeterPath: + flowRate *= self.repository.perimeterFlowRateOverOperatingFlowRate.value + if flowRate != self.oldFlowRate: + self.distanceFeedRate.addLine('M108 S' + euclidean.getFourSignificantFigures(flowRate)) + self.oldFlowRate = flowRate + + def addParameterString( self, firstWord, parameterWord ): + "Add parameter string." + if parameterWord == '': + self.distanceFeedRate.addLine(firstWord) + return + self.distanceFeedRate.addParameter( firstWord, parameterWord ) + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the speed gcode." + self.repository = repository + self.feedRatePerSecond = repository.feedRatePerSecond.value + self.travelFeedRateMinute = 60.0 * self.repository.travelFeedRatePerSecond.value + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + self.addParameterString('M113', self.repository.dutyCycleAtEnding.value ) # Set duty cycle . + return self.distanceFeedRate.output.getvalue() + + def getSpeededLine(self, line, splitLine): + 'Get gcode line with feed rate.' + if gcodec.getIndexOfStartingWithSecond('F', splitLine) > 0: + return line + feedRateMinute = 60.0 * self.feedRatePerSecond + if self.isBridgeLayer: + feedRateMinute *= self.repository.bridgeFeedRateMultiplier.value + if self.isPerimeterPath: + feedRateMinute *= self.repository.perimeterFeedRateOverOperatingFeedRate.value + self.addFlowRateLine() + if not self.isExtruderActive: + feedRateMinute = self.travelFeedRateMinute + return self.distanceFeedRate.getLineWithFeedRate(feedRateMinute, line, splitLine) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in range(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '(': + self.layerThickness = float(splitLine[1]) + elif firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('speed') + return + elif firstWord == '(': + self.absolutePerimeterWidth = abs(float(splitLine[1])) + self.distanceFeedRate.addTagBracketedLine('maximumZTravelFeedRatePerSecond', self.repository.maximumZFeedRatePerSecond.value ) + self.distanceFeedRate.addTagBracketedLine('operatingFeedRatePerSecond', self.feedRatePerSecond ) + if self.repository.addFlowRate.value: + self.distanceFeedRate.addTagBracketedLine('operatingFlowRate', self.repository.flowRateSetting.value ) + orbitalFeedRatePerSecond = self.feedRatePerSecond * self.repository.orbitalFeedRateOverOperatingFeedRate.value + self.distanceFeedRate.addTagBracketedLine('orbitalFeedRatePerSecond', orbitalFeedRatePerSecond ) + self.distanceFeedRate.addTagBracketedLine('travelFeedRatePerSecond', self.repository.travelFeedRatePerSecond.value ) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the speed skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '()': + self.distanceFeedRate.addLine(line) + self.addParameterString('M113', self.repository.dutyCycleAtBeginning.value ) # Set duty cycle . + return + elif firstWord == 'G1': + line = self.getSpeededLine(line, splitLine) + elif firstWord == 'M101': + self.isExtruderActive = True + elif firstWord == 'M103': + self.isExtruderActive = False + elif firstWord == '(': + self.isBridgeLayer = True + elif firstWord == '(': + self.isBridgeLayer = False + self.addFlowRateLine() + elif firstWord == '(' or firstWord == '()': + self.isPerimeterPath = True + elif firstWord == '()' or firstWord == '()': + self.isPerimeterPath = False + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the speed dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/speed.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/speed.pyc new file mode 100644 index 0000000..30086cf Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/speed.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/splodge.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/splodge.py new file mode 100644 index 0000000..2708f73 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/splodge.py @@ -0,0 +1,327 @@ +""" +This page is in the table of contents. +Splodge turns the extruder on just before the start of a thread. This is to give the extrusion a bit anchoring at the beginning. + +The splodge manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Splodge + +==Operation== +The default 'Activate Splodge' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Initial=== +====Initial Lift over Extra Thickness==== +Default is one. + +Defines the amount the extruder will be lifted over the extra thickness of the initial splodge thread. The higher the ratio, the more the extruder will be lifted over the splodge, if the ratio is too low the extruder might plow through the splodge extrusion. + +====Initial Splodge Feed Rate==== +Default is one millimeter per second. + +Defines the feed rate at which the initial extra extrusion will be added. With the default feed rate, the splodge will be added slower so it will be thicker than the regular extrusion. + +====Initial Splodge Quantity Length==== +Default is thirty millimeters. + +Defines the quantity length of extra extrusion at the operating feed rate that will be added to the initial thread. If a splodge quantity length is smaller than 0.1 times the perimeter width, no splodge of that type will be added. + +===Operating=== +====Operating Lift over Extra Thickness==== +Default is one. + +Defines the amount the extruder will be lifted over the extra thickness of the operating splodge thread. + +====Operating Splodge Feed Rate==== +Default is one millimeter per second. + +Defines the feed rate at which the next extra extrusions will be added. + +====Operating Splodge Quantity Length==== +Default is thirty millimeters. + +Defines the quantity length of extra extrusion at the operating feed rate that will be added for the next threads. + +==Examples== +The following examples splodge the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and splodge.py. + +> python splodge.py +This brings up the splodge dialog. + +> python splodge.py Screw Holder Bottom.stl +The splodge tool is parsing the file: +Screw Holder Bottom.stl +.. +The splodge tool has created the file: +.. Screw Holder Bottom_splodge.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, splodgeRepository = None ): + "Splodge a gcode linear move file or text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), splodgeRepository ) + +def getCraftedTextFromText( gcodeText, splodgeRepository = None ): + "Splodge a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'splodge'): + return gcodeText + if splodgeRepository == None: + splodgeRepository = settings.getReadRepository( SplodgeRepository() ) + if not splodgeRepository.activateSplodge.value: + return gcodeText + return SplodgeSkein().getCraftedGcode( gcodeText, splodgeRepository ) + +def getNewRepository(): + 'Get new repository.' + return SplodgeRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Splodge a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'splodge', shouldAnalyze) + + +class SplodgeRepository: + "A class to handle the splodge settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.splodge.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Splodge', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Splodge') + self.activateSplodge = settings.BooleanSetting().getFromValue('Activate Splodge', self, False ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Initial -', self ) + self.initialLiftOverExtraThickness = settings.FloatSpin().getFromValue( 0.5, 'Initial Lift over Extra Thickness (ratio):', self, 1.5, 1.0 ) + self.initialSplodgeFeedRate = settings.FloatSpin().getFromValue( 0.4, 'Initial Splodge Feed Rate (mm/s):', self, 2.4, 1.0 ) + self.initialSplodgeQuantityLength = settings.FloatSpin().getFromValue( 10.0, 'Initial Splodge Quantity Length (millimeters):', self, 90.0, 30.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Operating -', self ) + self.operatingLiftOverExtraThickness = settings.FloatSpin().getFromValue( 0.5, 'Operating Lift over Extra Thickness (ratio):', self, 1.5, 1.0 ) + self.operatingSplodgeFeedRate = settings.FloatSpin().getFromValue( 0.4, 'Operating Splodge Feed Rate (mm/s):', self, 2.4, 1.0 ) + self.operatingSplodgeQuantityLength = settings.FloatSpin().getFromValue( 0.4, 'Operating Splodge Quantity Length (millimeters):', self, 2.4, 1.0 ) + settings.LabelSeparator().getFromRepository(self) + self.executeTitle = 'Splodge' + + def execute(self): + "Splodge button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class SplodgeSkein: + "A class to splodge a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = 961.0 + self.isExtruderActive = False + self.hasInitialSplodgeBeenAdded = False + self.isLastExtruderCommandActivate = False + self.lastLineOutput = None + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + self.operatingFeedRatePerSecond = 15.0 + + def addLineUnlessIdentical(self, line): + "Add a line, unless it is identical to the last line." + if line == self.lastLineOutput: + return + self.lastLineOutput = line + self.distanceFeedRate.addLine(line) + + def addLineUnlessIdenticalReactivate(self, line): + "Add a line, unless it is identical to the last line or another M101." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'M101': + if not self.isLastExtruderCommandActivate: + self.addLineUnlessIdentical(line) + self.isLastExtruderCommandActivate = True + return + if firstWord == 'M103': + self.isLastExtruderCommandActivate = False + self.addLineUnlessIdentical(line) + + def getCraftedGcode( self, gcodeText, splodgeRepository ): + "Parse gcode text and store the splodge gcode." + self.lines = archive.getTextLines(gcodeText) + self.setRotations() + self.splodgeRepository = splodgeRepository + self.parseInitialization( splodgeRepository ) + self.boundingRectangle = gcodec.BoundingRectangle().getFromGcodeLines( self.lines[self.lineIndex :], 0.5 * self.perimeterWidth ) + self.initialSplodgeFeedRateMinute = 60.0 * splodgeRepository.initialSplodgeFeedRate.value + self.initialStartupDistance = splodgeRepository.initialSplodgeQuantityLength.value * splodgeRepository.initialSplodgeFeedRate.value / self.operatingFeedRatePerSecond + self.operatingSplodgeFeedRateMinute = 60.0 * splodgeRepository.operatingSplodgeFeedRate.value + self.operatingStartupDistance = splodgeRepository.operatingSplodgeQuantityLength.value * splodgeRepository.operatingSplodgeFeedRate.value / self.operatingFeedRatePerSecond + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getInitialSplodgeLine( self, line, location ): + "Add the initial splodge line." + if not self.isJustBeforeExtrusion(): + return line + self.hasInitialSplodgeBeenAdded = True + if self.splodgeRepository.initialSplodgeQuantityLength.value < self.minimumQuantityLength: + return line + return self.getSplodgeLineGivenDistance( self.initialSplodgeFeedRateMinute, line, self.splodgeRepository.initialLiftOverExtraThickness.value, location, self.initialStartupDistance ) + + def getNextActiveLocationComplex(self): + "Get the next active line." + isActive = False + for lineIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'M101': + isActive = True + if firstWord == 'G1' and isActive: + return gcodec.getLocationFromSplitLine(self.oldLocation, splitLine).dropAxis() + return None + + def getOperatingSplodgeLine( self, line, location ): + "Get the operating splodge line." + if not self.isJustBeforeExtrusion(): + return line + if self.splodgeRepository.operatingSplodgeQuantityLength.value < self.minimumQuantityLength: + return line + return self.getSplodgeLineGivenDistance( self.operatingSplodgeFeedRateMinute, line, self.splodgeRepository.operatingLiftOverExtraThickness.value, location, self.operatingStartupDistance ) + + def getSplodgeLine(self, line, location, splitLine): + "Get splodged gcode line." + self.feedRateMinute = gcodec.getFeedRateMinute(self.feedRateMinute, splitLine) + if self.hasInitialSplodgeBeenAdded: + return self.getOperatingSplodgeLine(line, location) + return self.getInitialSplodgeLine(line, location) + + def getSplodgeLineGivenDistance( self, feedRateMinute, line, liftOverExtraThickness, location, startupDistance ): + "Add the splodge line." + locationComplex = location.dropAxis() + relativeStartComplex = None + nextLocationComplex = self.getNextActiveLocationComplex() + if nextLocationComplex != None: + if nextLocationComplex != locationComplex: + relativeStartComplex = locationComplex - nextLocationComplex + if relativeStartComplex == None: + relativeStartComplex = complex( 19.9, 9.9 ) + if self.oldLocation != None: + oldLocationComplex = self.oldLocation.dropAxis() + if oldLocationComplex != locationComplex: + relativeStartComplex = oldLocationComplex - locationComplex + relativeStartComplex *= startupDistance / abs( relativeStartComplex ) + startComplex = self.getStartInsideBoundingRectangle( locationComplex, relativeStartComplex ) + feedRateMultiplier = feedRateMinute / self.operatingFeedRatePerSecond / 60.0 + splodgeLayerThickness = self.layerThickness / math.sqrt( feedRateMultiplier ) + extraLayerThickness = splodgeLayerThickness - self.layerThickness + lift = extraLayerThickness * liftOverExtraThickness + startLine = self.distanceFeedRate.getLinearGcodeMovementWithFeedRate( self.feedRateMinute, startComplex, location.z + lift ) + self.addLineUnlessIdenticalReactivate( startLine ) + self.addLineUnlessIdenticalReactivate('M101') + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + lineLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.distanceFeedRate.addGcodeMovementZWithFeedRate( feedRateMinute, locationComplex, lineLocation.z + lift ) + return '' + + def getStartInsideBoundingRectangle( self, locationComplex, relativeStartComplex ): + "Get a start inside the bounding rectangle." + startComplex = locationComplex + relativeStartComplex + if self.boundingRectangle.isPointInside( startComplex ): + return startComplex + for rotation in self.rotations: + rotatedRelativeStartComplex = relativeStartComplex * rotation + startComplex = locationComplex + rotatedRelativeStartComplex + if self.boundingRectangle.isPointInside( startComplex ): + return startComplex + return startComplex + + def isJustBeforeExtrusion(self): + "Determine if activate command is before linear move command." + for lineIndex in xrange(self.lineIndex + 1, len(self.lines)): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1' or firstWord == 'M103': + return False + if firstWord == 'M101': + return True + return False + + def parseInitialization( self, splodgeRepository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.addLineUnlessIdenticalReactivate(gcodec.getTagBracketedProcedure('splodge')) + return + elif firstWord == '(': + self.layerThickness = float(splitLine[1]) + elif firstWord == '(': + self.operatingFeedRatePerSecond = float(splitLine[1]) + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.minimumQuantityLength = 0.1 * self.perimeterWidth + self.addLineUnlessIdenticalReactivate(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the bevel gcode." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + line = self.getSplodgeLine(line, location, splitLine) + self.oldLocation = location + elif firstWord == 'M101': + self.isExtruderActive = True + elif firstWord == 'M103': + self.isExtruderActive = False + self.addLineUnlessIdenticalReactivate(line) + + def setRotations(self): + "Set the rotations." + self.rootHalf = math.sqrt( 0.5 ) + self.rotations = [] + self.rotations.append( complex( self.rootHalf, self.rootHalf ) ) + self.rotations.append( complex( self.rootHalf, - self.rootHalf ) ) + self.rotations.append( complex( 0.0, 1.0 ) ) + self.rotations.append( complex(0.0, -1.0) ) + self.rotations.append( complex( - self.rootHalf, self.rootHalf ) ) + self.rotations.append( complex( - self.rootHalf, - self.rootHalf ) ) + + +def main(): + "Display the splodge dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/splodge.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/splodge.pyc new file mode 100644 index 0000000..b93901d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/splodge.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/stretch.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/stretch.py new file mode 100644 index 0000000..dbd2e54 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/stretch.py @@ -0,0 +1,413 @@ +""" +This page is in the table of contents. +Stretch is a script to stretch the threads to partially compensate for filament shrinkage when extruded. + +The stretch manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Stretch + +All the defaults assume that the thread sequence choice setting in fill is the perimeter being extruded first, then the loops, then the infill. If the thread sequence choice is different, the optimal thread parameters will also be different. In general, if the infill is extruded first, the infill would have to be stretched more so that even after the filament shrinkage, it would still be long enough to connect to the loop or perimeter. + +==Operation== +The default 'Activate Stretch' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Loop Stretch Over Perimeter Width=== +Default is 0.1. + +Defines the ratio of the maximum amount the loop aka inner shell threads will be stretched compared to the perimeter width, in general this value should be the same as the 'Perimeter Outside Stretch Over Perimeter Width' setting. + +===Path Stretch Over Perimeter Width=== +Default is zero. + +Defines the ratio of the maximum amount the threads which are not loops, like the infill threads, will be stretched compared to the perimeter width. + +===Perimeter=== +====Perimeter Inside Stretch Over Perimeter Width==== +Default is 0.32. + +Defines the ratio of the maximum amount the inside perimeter thread will be stretched compared to the perimeter width, this is the most important setting in stretch. The higher the value the more it will stretch the perimeter and the wider holes will be. If the value is too small, the holes could be drilled out after fabrication, if the value is too high, the holes would be too wide and the part would have to junked. + +====Perimeter Outside Stretch Over Perimeter Width==== +Default is 0.1. + +Defines the ratio of the maximum amount the outside perimeter thread will be stretched compared to the perimeter width, in general this value should be around a third of the 'Perimeter Inside Stretch Over Perimeter Width' setting. + +===Stretch from Distance over Perimeter Width=== +Default is two. + +In general, stretch will widen holes and push corners out. The algorithm works by checking at each turning point on the extrusion path what the direction of the thread is at a distance of 'Stretch from Distance over Perimeter Width' times the perimeter width, on both sides, and moves the thread in the opposite direction. The magnitude of the stretch increases with the amount that the direction of the two threads is similar and by the '..Stretch Over Perimeter Width' ratio. In practice the filament contraction will be similar but different from the algorithm, so even once the optimal parameters are determined, the stretch script will not be able to eliminate the inaccuracies caused by contraction, but it should reduce them. + +==Examples== +The following examples stretch the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and stretch.py. + +> python stretch.py +This brings up the stretch dialog. + +> python stretch.py Screw Holder Bottom.stl +The stretch tool is parsing the file: +Screw Holder Bottom.stl +.. +The stretch tool has created the file: +.. Screw Holder Bottom_stretch.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +#maybe speed up feedRate option +def getCraftedText( fileName, gcodeText, stretchRepository = None ): + "Stretch a gcode linear move text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, gcodeText), stretchRepository ) + +def getCraftedTextFromText( gcodeText, stretchRepository = None ): + "Stretch a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'stretch'): + return gcodeText + if stretchRepository == None: + stretchRepository = settings.getReadRepository( StretchRepository() ) + if not stretchRepository.activateStretch.value: + return gcodeText + return StretchSkein().getCraftedGcode( gcodeText, stretchRepository ) + +def getNewRepository(): + 'Get new repository.' + return StretchRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Stretch a gcode linear move file. Chain stretch the gcode if it is not already stretched." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'stretch', shouldAnalyze) + + +class LineIteratorBackward: + "Backward line iterator class." + def __init__( self, isLoop, lineIndex, lines ): + self.firstLineIndex = None + self.isLoop = isLoop + self.lineIndex = lineIndex + self.lines = lines + + def getIndexBeforeNextDeactivate(self): + "Get index two lines before the deactivate command." + for lineIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'M103': + return lineIndex - 2 + print('This should never happen in stretch, no deactivate command was found for this thread.') + raise StopIteration, "You've reached the end of the line." + + def getNext(self): + "Get next line going backward or raise exception." + while self.lineIndex > 3: + if self.lineIndex == self.firstLineIndex: + raise StopIteration, "You've reached the end of the line." + if self.firstLineIndex == None: + self.firstLineIndex = self.lineIndex + nextLineIndex = self.lineIndex - 1 + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'M103': + if self.isLoop: + nextLineIndex = self.getIndexBeforeNextDeactivate() + else: + raise StopIteration, "You've reached the end of the line." + if firstWord == 'G1': + if self.isBeforeExtrusion(): + if self.isLoop: + nextLineIndex = self.getIndexBeforeNextDeactivate() + else: + raise StopIteration, "You've reached the end of the line." + else: + self.lineIndex = nextLineIndex + return line + self.lineIndex = nextLineIndex + raise StopIteration, "You've reached the end of the line." + + def isBeforeExtrusion(self): + "Determine if index is two or more before activate command." + linearMoves = 0 + for lineIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + linearMoves += 1 + if firstWord == 'M101': + return linearMoves > 0 + if firstWord == 'M103': + return False + print('This should never happen in isBeforeExtrusion in stretch, no activate command was found for this thread.') + return False + + +class LineIteratorForward: + "Forward line iterator class." + def __init__( self, isLoop, lineIndex, lines ): + self.firstLineIndex = None + self.isLoop = isLoop + self.lineIndex = lineIndex + self.lines = lines + + def getIndexJustAfterActivate(self): + "Get index just after the activate command." + for lineIndex in xrange( self.lineIndex - 1, 3, - 1 ): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'M101': + return lineIndex + 1 + print('This should never happen in stretch, no activate command was found for this thread.') + raise StopIteration, "You've reached the end of the line." + + def getNext(self): + "Get next line or raise exception." + while self.lineIndex < len(self.lines): + if self.lineIndex == self.firstLineIndex: + raise StopIteration, "You've reached the end of the line." + if self.firstLineIndex == None: + self.firstLineIndex = self.lineIndex + nextLineIndex = self.lineIndex + 1 + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'M103': + if self.isLoop: + nextLineIndex = self.getIndexJustAfterActivate() + else: + raise StopIteration, "You've reached the end of the line." + self.lineIndex = nextLineIndex + if firstWord == 'G1': + return line + raise StopIteration, "You've reached the end of the line." + + +class StretchRepository: + "A class to handle the stretch settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.stretch.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Stretch', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Stretch') + self.activateStretch = settings.BooleanSetting().getFromValue('Activate Stretch', self, False ) + self.crossLimitDistanceOverPerimeterWidth = settings.FloatSpin().getFromValue( 3.0, 'Cross Limit Distance Over Perimeter Width (ratio):', self, 10.0, 5.0 ) + self.loopStretchOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.05, 'Loop Stretch Over Perimeter Width (ratio):', self, 0.25, 0.11 ) + self.pathStretchOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.0, 'Path Stretch Over Perimeter Width (ratio):', self, 0.2, 0.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Perimeter -', self ) + self.perimeterInsideStretchOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.12, 'Perimeter Inside Stretch Over Perimeter Width (ratio):', self, 0.52, 0.32 ) + self.perimeterOutsideStretchOverPerimeterWidth = settings.FloatSpin().getFromValue( 0.05, 'Perimeter Outside Stretch Over Perimeter Width (ratio):', self, 0.25, 0.1 ) + settings.LabelSeparator().getFromRepository(self) + self.stretchFromDistanceOverPerimeterWidth = settings.FloatSpin().getFromValue( 1.0, 'Stretch From Distance Over Perimeter Width (ratio):', self, 3.0, 2.0 ) + self.executeTitle = 'Stretch' + + def execute(self): + "Stretch button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class StretchSkein: + "A class to stretch a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.feedRateMinute = 959.0 + self.isLoop = False + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + self.perimeterWidth = 0.4 + + def getCraftedGcode( self, gcodeText, stretchRepository ): + "Parse gcode text and store the stretch gcode." + self.lines = archive.getTextLines(gcodeText) + self.stretchRepository = stretchRepository + self.parseInitialization() + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseStretch(line) + return self.distanceFeedRate.output.getvalue() + + def getCrossLimitedStretch( self, crossLimitedStretch, crossLineIterator, locationComplex ): + "Get cross limited relative stretch for a location." + try: + line = crossLineIterator.getNext() + except StopIteration: + return crossLimitedStretch + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + pointComplex = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine).dropAxis() + pointMinusLocation = locationComplex - pointComplex + pointMinusLocationLength = abs( pointMinusLocation ) + if pointMinusLocationLength <= self.crossLimitDistanceFraction: + return crossLimitedStretch + parallelNormal = pointMinusLocation / pointMinusLocationLength + parallelStretch = euclidean.getDotProduct( parallelNormal, crossLimitedStretch ) * parallelNormal + if pointMinusLocationLength > self.crossLimitDistance: + return parallelStretch + crossNormal = complex( parallelNormal.imag, - parallelNormal.real ) + crossStretch = euclidean.getDotProduct( crossNormal, crossLimitedStretch ) * crossNormal + crossPortion = ( self.crossLimitDistance - pointMinusLocationLength ) / self.crossLimitDistanceRemainder + return parallelStretch + crossStretch * crossPortion + + def getRelativeStretch( self, locationComplex, lineIterator ): + "Get relative stretch for a location." + lastLocationComplex = locationComplex + oldTotalLength = 0.0 + pointComplex = locationComplex + totalLength = 0.0 + while 1: + try: + line = lineIterator.getNext() + except StopIteration: + locationMinusPoint = locationComplex - pointComplex + locationMinusPointLength = abs( locationMinusPoint ) + if locationMinusPointLength > 0.0: + return locationMinusPoint / locationMinusPointLength + return complex() + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = splitLine[0] + pointComplex = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine).dropAxis() + locationMinusPoint = lastLocationComplex - pointComplex + locationMinusPointLength = abs( locationMinusPoint ) + totalLength += locationMinusPointLength + if totalLength >= self.stretchFromDistance: + distanceFromRatio = ( self.stretchFromDistance - oldTotalLength ) / locationMinusPointLength + totalPoint = distanceFromRatio * pointComplex + ( 1.0 - distanceFromRatio ) * lastLocationComplex + locationMinusTotalPoint = locationComplex - totalPoint + return locationMinusTotalPoint / self.stretchFromDistance + lastLocationComplex = pointComplex + oldTotalLength = totalLength + + def getStretchedLine( self, splitLine ): + "Get stretched gcode line." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + self.oldLocation = location + if self.extruderActive and self.threadMaximumAbsoluteStretch > 0.0: + return self.getStretchedLineFromIndexLocation( self.lineIndex - 1, self.lineIndex + 1, location ) + if self.isJustBeforeExtrusion() and self.threadMaximumAbsoluteStretch > 0.0: + return self.getStretchedLineFromIndexLocation( self.lineIndex - 1, self.lineIndex + 1, location ) + return self.lines[self.lineIndex] + + def getStretchedLineFromIndexLocation( self, indexPreviousStart, indexNextStart, location ): + "Get stretched gcode line from line index and location." + crossIteratorForward = LineIteratorForward( self.isLoop, indexNextStart, self.lines ) + crossIteratorBackward = LineIteratorBackward( self.isLoop, indexPreviousStart, self.lines ) + iteratorForward = LineIteratorForward( self.isLoop, indexNextStart, self.lines ) + iteratorBackward = LineIteratorBackward( self.isLoop, indexPreviousStart, self.lines ) + locationComplex = location.dropAxis() + relativeStretch = self.getRelativeStretch( locationComplex, iteratorForward ) + self.getRelativeStretch( locationComplex, iteratorBackward ) + relativeStretch *= 0.8 +# print('relativeStretch') +# print( relativeStretch ) + relativeStretch = self.getCrossLimitedStretch( relativeStretch, crossIteratorForward, locationComplex ) + relativeStretch = self.getCrossLimitedStretch( relativeStretch, crossIteratorBackward, locationComplex ) +# print( relativeStretch ) + relativeStretchLength = abs( relativeStretch ) + if relativeStretchLength > 1.0: + relativeStretch /= relativeStretchLength + absoluteStretch = relativeStretch * self.threadMaximumAbsoluteStretch + stretchedPoint = location.dropAxis() + absoluteStretch + return self.distanceFeedRate.getLinearGcodeMovementWithFeedRate( self.feedRateMinute, stretchedPoint, location.z ) + + def isJustBeforeExtrusion(self): + "Determine if activate command is before linear move command." + for lineIndex in xrange( self.lineIndex + 1, len(self.lines) ): + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1' or firstWord == 'M103': + return False + if firstWord == 'M101': + return True +# print('This should never happen in isJustBeforeExtrusion in stretch, no activate or deactivate command was found for this thread.') + return False + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('stretch') + return + elif firstWord == '(': + perimeterWidth = float(splitLine[1]) + self.crossLimitDistance = self.perimeterWidth * self.stretchRepository.crossLimitDistanceOverPerimeterWidth.value + self.loopMaximumAbsoluteStretch = self.perimeterWidth * self.stretchRepository.loopStretchOverPerimeterWidth.value + self.pathAbsoluteStretch = self.perimeterWidth * self.stretchRepository.pathStretchOverPerimeterWidth.value + self.perimeterInsideAbsoluteStretch = self.perimeterWidth * self.stretchRepository.perimeterInsideStretchOverPerimeterWidth.value + self.perimeterOutsideAbsoluteStretch = self.perimeterWidth * self.stretchRepository.perimeterOutsideStretchOverPerimeterWidth.value + self.stretchFromDistance = self.stretchRepository.stretchFromDistanceOverPerimeterWidth.value * perimeterWidth + self.threadMaximumAbsoluteStretch = self.pathAbsoluteStretch + self.crossLimitDistanceFraction = 0.333333333 * self.crossLimitDistance + self.crossLimitDistanceRemainder = self.crossLimitDistance - self.crossLimitDistanceFraction + self.distanceFeedRate.addLine(line) + + def parseStretch(self, line): + "Parse a gcode line and add it to the stretch skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + line = self.getStretchedLine(splitLine) + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + self.setStretchToPath() + elif firstWord == '(': + self.isLoop = True + self.threadMaximumAbsoluteStretch = self.loopMaximumAbsoluteStretch + elif firstWord == '()': + self.setStretchToPath() + elif firstWord == '(': + self.isLoop = True + self.threadMaximumAbsoluteStretch = self.perimeterInsideAbsoluteStretch + if splitLine[1] == 'outer': + self.threadMaximumAbsoluteStretch = self.perimeterOutsideAbsoluteStretch + elif firstWord == '()': + self.setStretchToPath() + self.distanceFeedRate.addLine(line) + + def setStretchToPath(self): + "Set the thread stretch to path stretch and is loop false." + self.isLoop = False + self.threadMaximumAbsoluteStretch = self.pathAbsoluteStretch + + +def main(): + "Display the stretch dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/stretch.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/stretch.pyc new file mode 100644 index 0000000..a05737a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/stretch.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.py new file mode 100644 index 0000000..6b58b18 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.py @@ -0,0 +1,200 @@ +""" +This page is in the table of contents. +Temperature is a script to set the temperature for the object and raft. + +==Operation== +The default 'Activate Temperature' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Rate=== +The default cooling rate and heating rate for the extruder were both been derived from bothacker's graph at: +http://bothacker.com/wp-content/uploads/2009/09/18h5m53s9.29.2009.png + +====Cooling Rate==== +Default is three degrees Celcius per second. + +Defines the cooling rate of the extruder. + +====Heating Rate==== +Default is ten degrees Celcius per second. + +Defines the heating rate of the extruder. + +===Temperature=== +====Base Temperature==== +Default for ABS is two hundred degrees Celcius. + +Defines the raft base temperature. + +====Interface Temperature==== +Default for ABS is two hundred degrees Celcius. + +Defines the raft interface temperature. + +====Object First Layer Infill Temperature==== +Default for ABS is 195 degrees Celcius. + +Defines the infill temperature of the first layer of the object. + +====Object First Layer Perimeter Temperature==== +Default for ABS is two hundred and twenty degrees Celcius. + +Defines the perimeter temperature of the first layer of the object. + +====Object Next Layers Temperature==== +Default for ABS is two hundred and thirty degrees Celcius. + +Defines the temperature of the next layers of the object. + +====Support Layers Temperature==== +Default for ABS is two hundred degrees Celcius. + +Defines the support layers temperature. + +====Supported Layers Temperature==== +Default for ABS is two hundred and thirty degrees Celcius. + +Defines the temperature of the supported layers of the object, those layers which are right above a support layer. + +==Examples== +The following examples add temperature information to the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and temperature.py. + +> python temperature.py +This brings up the temperature dialog. + +> python temperature.py Screw Holder Bottom.stl +The temperature tool is parsing the file: +Screw Holder Bottom.stl +.. +The temperature tool has created the file: +.. Screw Holder Bottom_temperature.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text='', repository=None): + "Temperature the file or text." + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + "Temperature a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'temperature'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( TemperatureRepository() ) + if not repository.activateTemperature.value: + return gcodeText + return TemperatureSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return TemperatureRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Temperature a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'temperature', shouldAnalyze) + + +class TemperatureRepository: + "A class to handle the temperature settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.temperature.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Temperature', self, '') + self.activateTemperature = settings.BooleanSetting().getFromValue('Activate Temperature', self, True ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Rate -', self ) + self.coolingRate = settings.FloatSpin().getFromValue( 1.0, 'Cooling Rate (Celcius/second):', self, 20.0, 3.0 ) + self.heatingRate = settings.FloatSpin().getFromValue( 1.0, 'Heating Rate (Celcius/second):', self, 20.0, 10.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Temperature -', self ) + self.baseTemperature = settings.FloatSpin().getFromValue( 140.0, 'Base Temperature (Celcius):', self, 260.0, 200.0 ) + self.interfaceTemperature = settings.FloatSpin().getFromValue( 140.0, 'Interface Temperature (Celcius):', self, 260.0, 200.0 ) + self.objectFirstLayerInfillTemperature = settings.FloatSpin().getFromValue( 140.0, 'Object First Layer Infill Temperature (Celcius):', self, 260.0, 195.0 ) + self.objectFirstLayerPerimeterTemperature = settings.FloatSpin().getFromValue( 140.0, 'Object First Layer Perimeter Temperature (Celcius):', self, 260.0, 220.0 ) + self.objectNextLayersTemperature = settings.FloatSpin().getFromValue( 140.0, 'Object Next Layers Temperature (Celcius):', self, 260.0, 230.0 ) + self.supportLayersTemperature = settings.FloatSpin().getFromValue( 140.0, 'Support Layers Temperature (Celcius):', self, 260.0, 200.0 ) + self.supportedLayersTemperature = settings.FloatSpin().getFromValue( 140.0, 'Supported Layers Temperature (Celcius):', self, 260.0, 230.0 ) + self.executeTitle = 'Temperature' + + def execute(self): + "Temperature button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class TemperatureSkein: + "A class to temperature a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.lineIndex = 0 + self.lines = None + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the temperature gcode." + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + if self.repository.coolingRate.value < 0.1: + print('The cooling rate should be more than 0.1, any cooling rate less than 0.1 will be treated as 0.1.') + self.repository.coolingRate.value = 0.1 + if self.repository.heatingRate.value < 0.1: + print('The heating rate should be more than 0.1, any heating rate less than 0.1 will be treated as 0.1.') + self.repository.heatingRate.value = 0.1 + self.parseInitialization() + self.distanceFeedRate.addLines( self.lines[self.lineIndex :] ) + return self.distanceFeedRate.output.getvalue() + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('temperature') + return + elif firstWord == '(': + self.distanceFeedRate.addTagBracketedLine('coolingRate', self.repository.coolingRate.value ) + self.distanceFeedRate.addTagBracketedLine('heatingRate', self.repository.heatingRate.value ) + self.distanceFeedRate.addTagBracketedLine('baseTemperature', self.repository.baseTemperature.value ) + self.distanceFeedRate.addTagBracketedLine('interfaceTemperature', self.repository.interfaceTemperature.value ) + self.distanceFeedRate.addTagBracketedLine('objectFirstLayerInfillTemperature', self.repository.objectFirstLayerInfillTemperature.value ) + self.distanceFeedRate.addTagBracketedLine('objectFirstLayerPerimeterTemperature', self.repository.objectFirstLayerPerimeterTemperature.value ) + self.distanceFeedRate.addTagBracketedLine('objectNextLayersTemperature', self.repository.objectNextLayersTemperature.value ) + self.distanceFeedRate.addTagBracketedLine('supportLayersTemperature', self.repository.supportLayersTemperature.value ) + self.distanceFeedRate.addTagBracketedLine('supportedLayersTemperature', self.repository.supportedLayersTemperature.value ) + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the temperature dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.pyc new file mode 100644 index 0000000..898c089 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/temperature.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/tower.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/tower.py new file mode 100644 index 0000000..8a6f61d --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/tower.py @@ -0,0 +1,380 @@ +""" +This page is in the table of contents. +Tower commands the fabricator to extrude a disconnected region for a few layers, then go to another disconnected region and extrude there. Its purpose is to reduce the number of stringers between a shape and reduce extruder travel. + +The tower manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Tower + +==Operation== +The default 'Activate Tower' checkbox is off. The default is off because tower could result in the extruder colliding with an already extruded part of the shape and because extruding in one region for more than one layer could result in the shape melting. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Maximum Tower Height=== +Default is five. + +Defines the maximum number of layers that the extruder will extrude in one region before going to another. This is the most important value for tower. + +===Extruder Possible Collision Cone Angle=== +Default is sixty degrees. + +Tower works by looking for islands in each layer and if it finds another island in the layer above, it goes to the next layer above instead of going across to other regions on the original layer. It checks for collision with shapes already extruded within a cone from the nozzle tip. The 'Extruder Possible Collision Cone Angle' setting is the angle of that cone. Realistic values for the cone angle range between zero and ninety. The higher the angle, the less likely a collision with the rest of the shape is, generally the extruder will stay in the region for only a few layers before a collision is detected with the wide cone. + +===Tower Start Layer=== +Default is one. + +Defines the layer index which the script starts extruding towers, after the last raft layer which does not have support material. It is best to not tower at least the first layer because the temperature of the first layer is sometimes different than that of the other layers. + +==Examples== +The following examples tower the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and tower.py. + +> python tower.py +This brings up the tower dialog. + +> python tower.py Screw Holder Bottom.stl +The tower tool is parsing the file: +Screw Holder Bottom.stl +.. +The tower tool has created the file: +.. Screw Holder Bottom_tower.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + +def getCraftedText( fileName, text, towerRepository = None ): + "Tower a gcode linear move file or text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), towerRepository ) + +def getCraftedTextFromText( gcodeText, towerRepository = None ): + "Tower a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'tower'): + return gcodeText + if towerRepository == None: + towerRepository = settings.getReadRepository( TowerRepository() ) + if not towerRepository.activateTower.value: + return gcodeText + return TowerSkein().getCraftedGcode( gcodeText, towerRepository ) + +def getNewRepository(): + 'Get new repository.' + return TowerRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Tower a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'tower', shouldAnalyze) + + +class Island: + "A class to hold the boundary and lines." + def __init__(self): + self.boundary = [] + self.boundingLoop = None + self.lines = [] + + def addToBoundary( self, splitLine ): + "Add to the boundary if it is not complete." + if self.boundingLoop == None: + location = gcodec.getLocationFromSplitLine(None, splitLine) + self.boundary.append(location.dropAxis()) + self.z = location.z + + def createBoundingLoop(self): + "Create the bounding loop if it is not already created." + if self.boundingLoop == None: + self.boundingLoop = intercircle.BoundingLoop().getFromLoop( self.boundary ) + + +class ThreadLayer: + "A layer of loops and paths." + def __init__(self): + "Thread layer constructor." + self.afterExtrusionLines = [] + self.beforeExtrusionLines = [] + self.islands = [] + + def __repr__(self): + "Get the string representation of this thread layer." + return '%s' % self.islands + + +class TowerRepository: + "A class to handle the tower settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.tower.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Tower', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Tower') + self.activateTower = settings.BooleanSetting().getFromValue('Activate Tower', self, False ) + self.extruderPossibleCollisionConeAngle = settings.FloatSpin().getFromValue( 40.0, 'Extruder Possible Collision Cone Angle (degrees):', self, 80.0, 60.0 ) + self.maximumTowerHeight = settings.IntSpin().getFromValue( 2, 'Maximum Tower Height (layers):', self, 10, 5 ) + self.towerStartLayer = settings.IntSpin().getFromValue( 1, 'Tower Start Layer (integer):', self, 5, 1 ) + self.executeTitle = 'Tower' + + def execute(self): + "Tower button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class TowerSkein: + "A class to tower a skein of extrusions." + def __init__(self): + self.afterExtrusionLines = [] + self.beforeExtrusionLines = [] + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.highestZ = - 987654321.0 + self.island = None + self.layerIndex = 0 + self.lineIndex = 0 + self.lines = None + self.minimumBelow = 0.1 + self.oldLayerIndex = None + self.oldLocation = None + self.oldOrderedLocation = Vector3() + self.perimeterWidth = 0.6 + self.shutdownLineIndex = sys.maxint + self.nestedRingCount = 0 + self.threadLayer = None + self.threadLayers = [] + self.travelFeedRateMinute = None + + def addEntireLayer( self, threadLayer ): + "Add entire thread layer." + self.distanceFeedRate.addLines( threadLayer.beforeExtrusionLines ) + for island in threadLayer.islands: + self.distanceFeedRate.addLines( island.lines ) + self.distanceFeedRate.addLines( threadLayer.afterExtrusionLines ) + + def addHighThread(self, location): + "Add thread with a high move if necessary to clear the previous extrusion." + if self.oldLocation != None: + if self.oldLocation.z + self.minimumBelow < self.highestZ: + self.distanceFeedRate.addGcodeMovementZWithFeedRate( self.travelFeedRateMinute, self.oldLocation.dropAxis(), self.highestZ ) + if location.z + self.minimumBelow < self.highestZ: + self.distanceFeedRate.addGcodeMovementZWithFeedRate( self.travelFeedRateMinute, location.dropAxis(), self.highestZ ) + + def addThreadLayerIfNone(self): + "Add a thread layer if it is none." + if self.threadLayer != None: + return + self.threadLayer = ThreadLayer() + self.threadLayers.append( self.threadLayer ) + self.threadLayer.beforeExtrusionLines = self.beforeExtrusionLines + self.beforeExtrusionLines = [] + + def addTowers(self): + "Add towers." + bottomLayerIndex = self.getBottomLayerIndex() + if bottomLayerIndex == None: + return + removedIsland = self.getRemovedIslandAddLayerLinesIfDifferent( self.threadLayers[ bottomLayerIndex ].islands, bottomLayerIndex ) + while 1: + self.climbTower( removedIsland ) + bottomLayerIndex = self.getBottomLayerIndex() + if bottomLayerIndex == None: + return + removedIsland = self.getRemovedIslandAddLayerLinesIfDifferent( self.threadLayers[ bottomLayerIndex ].islands, bottomLayerIndex ) + + def climbTower( self, removedIsland ): + "Climb up the island to any islands directly above." + outsetDistance = 1.5 * self.perimeterWidth + for step in xrange( self.towerRepository.maximumTowerHeight.value ): + aboveIndex = self.oldLayerIndex + 1 + if aboveIndex >= len( self.threadLayers ): + return + outsetRemovedLoop = removedIsland.boundingLoop.getOutsetBoundingLoop( outsetDistance ) + islandsWithin = [] + for island in self.threadLayers[ aboveIndex ].islands: + if self.isInsideRemovedOutsideCone( island, outsetRemovedLoop, aboveIndex ): + islandsWithin.append( island ) + if len( islandsWithin ) < 1: + return + removedIsland = self.getRemovedIslandAddLayerLinesIfDifferent( islandsWithin, aboveIndex ) + self.threadLayers[ aboveIndex ].islands.remove( removedIsland ) + + def getBottomLayerIndex(self): + "Get the index of the first island layer which has islands." + for islandLayerIndex in xrange( len( self.threadLayers ) ): + if len( self.threadLayers[ islandLayerIndex ].islands ) > 0: + return islandLayerIndex + return None + + def getCraftedGcode( self, gcodeText, towerRepository ): + "Parse gcode text and store the tower gcode." + self.lines = archive.getTextLines(gcodeText) + self.towerRepository = towerRepository + self.parseInitialization() + self.parseIfWordUntilWord('(') + self.parseIfWordUntilWord('()') + for lineIndex in xrange(self.lineIndex, len(self.lines)): + self.parseLine( lineIndex ) + concatenateEndIndex = min( len( self.threadLayers ), towerRepository.towerStartLayer.value ) + for threadLayer in self.threadLayers[ : concatenateEndIndex ]: + self.addEntireLayer( threadLayer ) + self.threadLayers = self.threadLayers[ concatenateEndIndex : ] + self.addTowers() + self.distanceFeedRate.addLines( self.lines[ self.shutdownLineIndex : ] ) + return self.distanceFeedRate.output.getvalue() + + def getRemovedIslandAddLayerLinesIfDifferent( self, islands, layerIndex ): + "Add gcode lines for the layer if it is different than the old bottom layer index." + threadLayer = None + if layerIndex != self.oldLayerIndex: + self.oldLayerIndex = layerIndex + threadLayer = self.threadLayers[layerIndex] + self.distanceFeedRate.addLines( threadLayer.beforeExtrusionLines ) + removedIsland = self.getTransferClosestNestedRingLines( self.oldOrderedLocation, islands ) + if threadLayer != None: + self.distanceFeedRate.addLines( threadLayer.afterExtrusionLines ) + return removedIsland + + def getTransferClosestNestedRingLines( self, oldOrderedLocation, remainingNestedRings ): + "Get and transfer the closest remaining nested ring." + if len( remainingNestedRings ) > 0: + oldOrderedLocation.z = remainingNestedRings[0].z + closestDistance = 999999999987654321.0 + closestNestedRing = None + for remainingNestedRing in remainingNestedRings: + distance = euclidean.getNearestDistanceIndex(oldOrderedLocation.dropAxis(), remainingNestedRing.boundary).distance + if distance < closestDistance: + closestDistance = distance + closestNestedRing = remainingNestedRing + remainingNestedRings.remove(closestNestedRing) + hasTravelledHighRoad = False + for line in closestNestedRing.lines: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + if firstWord == 'G1': + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if not hasTravelledHighRoad: + hasTravelledHighRoad = True + self.addHighThread(location) + if location.z > self.highestZ: + self.highestZ = location.z + self.oldLocation = location + self.distanceFeedRate.addLine(line) + return closestNestedRing + + def isInsideRemovedOutsideCone( self, island, removedBoundingLoop, untilLayerIndex ): + "Determine if the island is entirely inside the removed bounding loop and outside the collision cone of the remaining islands." + if not island.boundingLoop.isEntirelyInsideAnother( removedBoundingLoop ): + return False + bottomLayerIndex = self.getBottomLayerIndex() + coneAngleTangent = math.tan( math.radians( self.towerRepository.extruderPossibleCollisionConeAngle.value ) ) + for layerIndex in xrange( bottomLayerIndex, untilLayerIndex ): + islands = self.threadLayers[layerIndex].islands + outsetDistance = self.perimeterWidth * ( untilLayerIndex - layerIndex ) * coneAngleTangent + 0.5 * self.perimeterWidth + for belowIsland in self.threadLayers[layerIndex].islands: + outsetIslandLoop = belowIsland.boundingLoop.getOutsetBoundingLoop( outsetDistance ) + if island.boundingLoop.isOverlappingAnother( outsetIslandLoop ): + return False + return True + + def parseIfWordUntilWord(self, word): + "Parse gcode if there is a word until the word is reached." + for self.lineIndex in xrange(self.lineIndex, gcodec.getFirstWordIndexReverse(word, self.lines, self.lineIndex)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.addLine(line) + if firstWord == 'G1': + self.oldLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.oldLocation.z > self.highestZ: + self.highestZ = self.oldLocation.z + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('tower') + elif firstWord == '(': + return + elif firstWord == '(': + self.minimumBelow = 0.1 * float(splitLine[1]) + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine( self, lineIndex ): + "Parse a gcode line." + line = self.lines[lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + self.afterExtrusionLines.append(line) + if firstWord == 'M103': + self.afterExtrusionLines = [] + elif firstWord == '()': + self.island.createBoundingLoop() + elif firstWord == '(': + self.island.addToBoundary(splitLine) + elif firstWord == '()': + self.shutdownLineIndex = lineIndex + elif firstWord == '(': + self.beforeExtrusionLines = [ line ] + self.island = None + self.nestedRingCount = 0 + self.threadLayer = None + return + elif firstWord == '()': + if self.threadLayer != None: + self.threadLayer.afterExtrusionLines = self.afterExtrusionLines + self.afterExtrusionLines = [] + elif firstWord == '()': + self.afterExtrusionLines = [] + elif firstWord == '()': + self.nestedRingCount += 1 + if self.island == None: + self.island = Island() + self.addThreadLayerIfNone() + self.threadLayer.islands.append( self.island ) + elif firstWord == '()': + self.afterExtrusionLines = [] + if self.island != None: + self.island.lines.append(line) + if firstWord == '()': + self.afterExtrusionLines = [] + self.nestedRingCount -= 1 + if self.nestedRingCount == 0: + self.island = None + if len( self.beforeExtrusionLines ) > 0: + self.beforeExtrusionLines.append(line) + + +def main(): + "Display the tower dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/tower.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/tower.pyc new file mode 100644 index 0000000..ea2f180 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/tower.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/unpause.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/unpause.py new file mode 100644 index 0000000..8b06aac --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/unpause.py @@ -0,0 +1,193 @@ +""" +This page is in the table of contents. +The unpause script is based on the Shane Hathaway's patch to speed up a line segment to compensate for the delay of the microprocessor. The description is at: +http://shane.willowrise.com/archives/delay-compensation-in-firmware/ + +The unpause manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Unpause + +==Operation== +The default 'Activate Unpause' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Delay=== +Default is 28 milliseconds, which Shane found for the Arduino. + +Defines the delay on the microprocessor that will be at least partially compensated for. + +===Maximum Speed=== +Default is 1.3. + +Defines the maximum amount that the feed rate will be sped up to, compared to the original feed rate. + +==Examples== +The following examples unpause the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and unpause.py. + +> python unpause.py +This brings up the unpause dialog. + +> python unpause.py Screw Holder Bottom.stl +The unpause tool is parsing the file: +Screw Holder Bottom.stl +.. +The unpause tool has created the file: +.. Screw Holder Bottom_unpause.gcode + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, gcodeText, repository=None): + "Unpause a gcode linear move file or text." + return getCraftedTextFromText( archive.getTextIfEmpty( fileName, gcodeText ), repository ) + +def getCraftedTextFromText(gcodeText, repository=None): + "Unpause a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'unpause'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( UnpauseRepository() ) + if not repository.activateUnpause.value: + return gcodeText + return UnpauseSkein().getCraftedGcode(gcodeText, repository) + +def getNewRepository(): + 'Get new repository.' + return UnpauseRepository() + +def getSelectedPlugin(repository): + "Get the selected plugin." + for plugin in repository.unpausePlugins: + if plugin.value: + return plugin + return None + +def writeOutput(fileName, shouldAnalyze=True): + "Unpause a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'unpause', shouldAnalyze) + + +class UnpauseRepository: + "A class to handle the unpause settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.unpause.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Unpause', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Unpause') + self.activateUnpause = settings.BooleanSetting().getFromValue('Activate Unpause', self, False ) + self.delay = settings.FloatSpin().getFromValue( 2.0, 'Delay (milliseconds):', self, 42.0, 28.0 ) + self.maximumSpeed = settings.FloatSpin().getFromValue( 1.1, 'Maximum Speed (ratio):', self, 1.9, 1.3 ) + self.executeTitle = 'Unpause' + + def execute(self): + "Unpause button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class UnpauseSkein: + "A class to unpause a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.feedRateMinute = 959.0 + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + + def getCraftedGcode(self, gcodeText, repository): + "Parse gcode text and store the unpause gcode." + self.delaySecond = repository.delay.value * 0.001 + self.maximumSpeed = repository.maximumSpeed.value + self.minimumSpeedUpReciprocal = 1.0 / self.maximumSpeed + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getUnpausedArcMovement( self, line, splitLine ): + "Get an unpaused arc movement." + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + if self.oldLocation == None: + return line + relativeLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.oldLocation += relativeLocation + distance = gcodec.getArcDistance(relativeLocation, splitLine) + return self.getUnpausedMovement(distance, line, splitLine) + + def getUnpausedLinearMovement( self, line, splitLine ): + "Get an unpaused linear movement." + self.feedRateMinute = gcodec.getFeedRateMinute( self.feedRateMinute, splitLine ) + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + if self.oldLocation == None: + self.oldLocation = location + return line + distance = abs(self.oldLocation - location) + self.oldLocation = location + return self.getUnpausedMovement(distance, line, splitLine) + + def getUnpausedMovement(self, distance, line, splitLine): + "Get an unpaused movement." + if distance <= 0.0: + return line + resultantReciprocal = 1.0 - self.delaySecond / distance * self.feedRateMinute / 60.0 + resultantReciprocal = max(self.minimumSpeedUpReciprocal, resultantReciprocal) + return self.distanceFeedRate.getLineWithFeedRate(self.feedRateMinute / resultantReciprocal, line, splitLine) + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('unpause') + return + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + line = self.getUnpausedLinearMovement( line, splitLine ) + if firstWord == 'G2' or firstWord == 'G3': + line = self.getUnpausedArcMovement( line, splitLine ) + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the unpause dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/unpause.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/unpause.pyc new file mode 100644 index 0000000..adc45b6 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/unpause.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/whittle.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/whittle.py new file mode 100644 index 0000000..92db227 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/whittle.py @@ -0,0 +1,172 @@ +""" +This page is in the table of contents. +Whittle will convert each polygon of a gcode file into a helix which has a vertical step down on each rotation. + +==Operation== +The default 'Activate Whittle' checkbox is on. When it is on, the functions described below will work, when it is off, the functions will not be called. If the cutting tool can cut the slab in one cut, the 'Activate Whittle' checkbox should be off, the default is off. + +==Settings== +===Maximum Vertical Step'=== +Default is 0.1 mm. + +Defines the maximum distance that the helix will step down on each rotation. The number of steps in the helix will be the layer thickness divided by the 'Maximum Vertical Step', rounded up. The amount the helix will step down is the layer thickness divided by the number of steps. The thinner the 'Maximum Vertical Step', the more times the cutting tool will circle around on its way to the bottom of the slab. + +==Examples== +The following examples whittle the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and whittle.py. + +> python whittle.py +This brings up the whittle dialog. + +> python whittle.py Screw Holder Bottom.stl +The whittle tool is parsing the file: +Screw Holder Bottom.stl +.. +The whittle tool has created the file: +.. Screw Holder Bottom_whittle.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/02/05 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text='', whittleRepository = None ): + "Whittle the preface file or text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), whittleRepository ) + +def getCraftedTextFromText( gcodeText, whittleRepository = None ): + "Whittle the preface gcode text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'whittle'): + return gcodeText + if whittleRepository == None: + whittleRepository = settings.getReadRepository( WhittleRepository() ) + if not whittleRepository.activateWhittle.value: + return gcodeText + return WhittleSkein().getCraftedGcode( whittleRepository, gcodeText ) + +def getNewRepository(): + 'Get new repository.' + return WhittleRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Whittle the carving of a gcode file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'whittle', shouldAnalyze) + + +class WhittleRepository: + "A class to handle the whittle settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.whittle.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File to be Whittled', self, '') + self.activateWhittle = settings.BooleanSetting().getFromValue('Activate Whittle', self, False ) + self.maximumVerticalStep = settings.FloatSpin().getFromValue( 0.02, 'Maximum Vertical Step (mm):', self, 0.42, 0.1 ) + self.executeTitle = 'Whittle' + + def execute(self): + "Whittle button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class WhittleSkein: + "A class to whittle a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.layerThickness = 0.3333333333 + self.lineIndex = 0 + self.movementLines = [] + self.oldLocation = None + + def getCraftedGcode( self, whittleRepository, gcodeText ): + "Parse gcode text and store the whittle gcode." + self.whittleRepository = whittleRepository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getLinearMove( self, line, splitLine ): + "Get the linear move." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.movementLines.append(line) + z = location.z + self.layerDeltas[0] + self.oldLocation = location + return self.distanceFeedRate.getLineWithZ( line, splitLine, z ) + + 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.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('whittle') + return + elif firstWord == '(': + self.setLayerThinknessVerticalDeltas(splitLine) + self.distanceFeedRate.addTagBracketedLine('layerStep', self.layerStep ) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the whittle skein." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + line = self.getLinearMove( line, splitLine ) + elif firstWord == 'M103': + self.repeatLines() + self.distanceFeedRate.addLine(line) + + def repeatLines(self): + "Repeat the lines at decreasing altitude." + for layerDelta in self.layerDeltas[1 :]: + for movementLine in self.movementLines: + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(movementLine) + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + z = location.z + layerDelta + self.distanceFeedRate.addLine( self.distanceFeedRate.getLineWithZ( movementLine, splitLine, z ) ) + self.movementLines = [] + + def setLayerThinknessVerticalDeltas( self, splitLine ): + "Set the layer thickness and the vertical deltas." + self.layerThickness = float(splitLine[1]) + numberOfSteps = int( math.ceil( self.layerThickness / self.whittleRepository.maximumVerticalStep.value ) ) + self.layerStep = self.layerThickness / float( numberOfSteps ) + self.layerDeltas = [] + halfDeltaMinusHalfTop = 0.5 * self.layerStep * ( 1.0 - numberOfSteps ) + for layerDeltaIndex in xrange( numberOfSteps - 1, - 1, - 1 ): + layerDelta = layerDeltaIndex * self.layerStep + halfDeltaMinusHalfTop + self.layerDeltas.append( layerDelta ) + + +def main(): + "Display the whittle dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/widen.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/widen.py new file mode 100644 index 0000000..ce5bf3c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/widen.py @@ -0,0 +1,225 @@ +#! /usr/bin/env python +""" +This page is in the table of contents. +Widen will widen the outside perimeters away from the inside perimeters, so that the outsides will be at least two perimeter widths away from the insides and therefore the outside filaments will not overlap the inside filaments. + +For example, if a mug has a very thin wall, widen would widen the outside of the mug so that the wall of the mug would be two perimeter widths wide, and the outside wall filament would not overlap the inside filament. + +For another example, if the outside of the object runs right next to a hole, widen would widen the wall around the hole so that the wall would bulge out around the hole, and the outside filament would not overlap the hole filament. + +The widen manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Widen + +==Operation== +The default 'Activate Widen' checkbox is off. When it is on, widen will work, when it is off, widen will not be called. + +==Examples== +The following examples widen the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and widen.py. + +> python widen.py +This brings up the widen dialog. + +> python widen.py Screw Holder Bottom.stl +The widen tool is parsing the file: +Screw Holder Bottom.stl +.. +The widen tool has created the file: +.. Screw Holder Bottom_widen.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.geometry.geometry_utilities import boolean_solid +from fabmetheus_utilities.geometry.solids import triangle_mesh +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import intercircle +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/28/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText(fileName, text='', repository=None): + 'Widen the preface file or text.' + return getCraftedTextFromText(archive.getTextIfEmpty(fileName, text), repository) + +def getCraftedTextFromText(gcodeText, repository=None): + 'Widen the preface gcode text.' + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'widen'): + return gcodeText + if repository == None: + repository = settings.getReadRepository( WidenRepository() ) + if not repository.activateWiden.value: + return gcodeText + return WidenSkein().getCraftedGcode(gcodeText, repository) + +def getIntersectingWithinLoops(loop, loopList, outsetLoop): + 'Get the loops which are intersecting or which it is within.' + intersectingWithinLoops = [] + for otherLoop in loopList: + if getIsIntersectingWithinLoop(loop, otherLoop, outsetLoop): + intersectingWithinLoops.append(otherLoop) + return intersectingWithinLoops + +def getIsIntersectingWithinLoop(loop, otherLoop, outsetLoop): + 'Determine if the loop is intersecting or is within the other loop.' + if euclidean.isLoopIntersectingLoop(loop, otherLoop): + return True + return euclidean.isPathInsideLoop(otherLoop, loop) != euclidean.isPathInsideLoop(otherLoop, outsetLoop) + +def getIsPointInsideALoop(loops, point): + 'Determine if a point is inside a loop of a loop list.' + for loop in loops: + if euclidean.isPointInsideLoop(loop, point): + return True + return False + +def getNewRepository(): + 'Get new repository.' + return WidenRepository() + +def getWidenedLoop(loop, loopList, outsetLoop, radius): + 'Get the widened loop.' + intersectingWithinLoops = getIntersectingWithinLoops(loop, loopList, outsetLoop) + if len(intersectingWithinLoops) < 1: + return loop + loopsUnified = boolean_solid.getLoopsUnified(radius, [[loop], intersectingWithinLoops]) + if len(loopsUnified) < 1: + return loop + return euclidean.getLargestLoop(loopsUnified) + +def writeOutput(fileName, shouldAnalyze=True): + 'Widen the carving of a gcode file.' + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'widen', shouldAnalyze) + + +class WidenRepository: + 'A class to handle the widen settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.widen.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( + fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Widen', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute( + 'http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Widen') + self.activateWiden = settings.BooleanSetting().getFromValue('Activate Widen', self, False) + self.executeTitle = 'Widen' + + def execute(self): + 'Widen button has been clicked.' + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( + self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class WidenSkein: + 'A class to widen a skein of extrusions.' + def __init__(self): + self.boundary = None + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.layerCount = settings.LayerCount() + self.lineIndex = 0 + self.rotatedLoopLayer = None + + def addWiden(self, rotatedLoopLayer): + 'Add widen to the layer.' + triangle_mesh.sortLoopsInOrderOfArea(False, rotatedLoopLayer.loops) + widdershinsLoops = [] + clockwiseInsetLoops = [] + for loopIndex in xrange(len(rotatedLoopLayer.loops)): + loop = rotatedLoopLayer.loops[loopIndex] + if euclidean.isWiddershins(loop): + otherLoops = rotatedLoopLayer.loops[: loopIndex] + rotatedLoopLayer.loops[loopIndex + 1 :] + leftPoint = euclidean.getLeftPoint(loop) + if getIsPointInsideALoop(otherLoops, leftPoint): + self.distanceFeedRate.addGcodeFromLoop(loop, rotatedLoopLayer.z) + else: + widdershinsLoops.append(loop) + else: +# clockwiseInsetLoop = intercircle.getLargestInsetLoopFromLoop(loop, self.doublePerimeterWidth) +# clockwiseInsetLoop.reverse() +# clockwiseInsetLoops.append(clockwiseInsetLoop) + clockwiseInsetLoops += intercircle.getInsetLoopsFromLoop(loop, self.doublePerimeterWidth) + self.distanceFeedRate.addGcodeFromLoop(loop, rotatedLoopLayer.z) + for widdershinsLoop in widdershinsLoops: + outsetLoop = intercircle.getLargestInsetLoopFromLoop(widdershinsLoop, -self.doublePerimeterWidth) + widenedLoop = getWidenedLoop(widdershinsLoop, clockwiseInsetLoops, outsetLoop, self.perimeterWidth) + self.distanceFeedRate.addGcodeFromLoop(widenedLoop, rotatedLoopLayer.z) + + def getCraftedGcode(self, gcodeText, repository): + 'Parse gcode text and store the widen gcode.' + self.repository = repository + self.lines = archive.getTextLines(gcodeText) + self.parseInitialization() + for line in self.lines[self.lineIndex :]: + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def parseInitialization(self): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('widen') + elif firstWord == '()': + self.distanceFeedRate.addLine(line) + return + elif firstWord == '(': + self.perimeterWidth = float(splitLine[1]) + self.doublePerimeterWidth = 2.0 * self.perimeterWidth + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + 'Parse a gcode line and add it to the widen skein.' + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == '(': + location = gcodec.getLocationFromSplitLine(None, splitLine) + self.boundary.append(location.dropAxis()) + elif firstWord == '(': + self.layerCount.printProgressIncrement('widen') + self.rotatedLoopLayer = euclidean.RotatedLoopLayer(float(splitLine[1])) + self.distanceFeedRate.addLine(line) + elif firstWord == '()': + self.addWiden( self.rotatedLoopLayer ) + self.rotatedLoopLayer = None + elif firstWord == '()': + self.boundary = [] + self.rotatedLoopLayer.loops.append( self.boundary ) + if self.rotatedLoopLayer == None or firstWord == '(': + self.distanceFeedRate.addLine(line) + + +def main(): + 'Display the widen dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/widen.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/widen.pyc new file mode 100644 index 0000000..fd616dc Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/widen.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py new file mode 100644 index 0000000..518897a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.py @@ -0,0 +1,267 @@ +""" +This page is in the table of contents. +At the beginning of a layer, depending on the settings, 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 wipe path is machine specific, so you'll probably have to change all the default locations. + +The wipe manual page is at: +http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Wipe + +==Operation== +The default 'Activate Wipe' checkbox is off. When it is on, the functions described below will work, when it is off, the functions will not be called. + +==Settings== +===Location Arrival=== +====Location Arrival X==== +Default is minus seventy millimeters. + +Defines the x coordinate of the arrival location. + +====Location Arrival Y==== +Default is minus fifty millimeters. + +Defines the y coordinate of the arrival location. + +====Location Arrival Z==== +Default is fifty millimeters. + +Defines the z coordinate of the arrival location. + +===Location Departure=== +====Location Departure X==== +Default is minus seventy millimeters. + +Defines the x coordinate of the departure location. + +====Location Departure Y==== +Default is minus forty millimeters. + +Defines the y coordinate of the departure location. + +====Location Departure Z==== +Default is fifty millimeters. + +Defines the z coordinate of the departure location. + +===Location Wipe=== +====Location Wipe X==== +Default is minus seventy millimeters. + +Defines the x coordinate of the wipe location. + +====Location Wipe Y==== +Default is minus seventy millimeters. + +Defines the y coordinate of the wipe location. + +====Location Wipe Z==== +Default is fifty millimeters. + +Defines the z coordinate of the wipe location. + +===Wipe Period=== +Default is three. + +Defines the number of layers between wipes. Wipe will always wipe just before layer zero, afterwards it will wipe every "Wipe Period" layers. With the default of three, wipe will wipe just before layer zero, layer three, layer six and so on. + +==Examples== +The following examples wipe the file Screw Holder Bottom.stl. The examples are run in a terminal in the folder which contains Screw Holder Bottom.stl and wipe.py. + +> python wipe.py +This brings up the wipe dialog. + +> python wipe.py Screw Holder Bottom.stl +The wipe tool is parsing the file: +Screw Holder Bottom.stl +.. +The wipe tool has created the file: +.. Screw Holder Bottom_wipe.gcode + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities.vector3 import Vector3 +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_craft +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import math +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftedText( fileName, text, wipeRepository = None ): + "Wipe a gcode linear move text." + return getCraftedTextFromText( archive.getTextIfEmpty(fileName, text), wipeRepository ) + +def getCraftedTextFromText( gcodeText, wipeRepository = None ): + "Wipe a gcode linear move text." + if gcodec.isProcedureDoneOrFileIsEmpty( gcodeText, 'wipe'): + return gcodeText + if wipeRepository == None: + wipeRepository = settings.getReadRepository( WipeRepository() ) + if not wipeRepository.activateWipe.value: + return gcodeText + return WipeSkein().getCraftedGcode( gcodeText, wipeRepository ) + +def getNewRepository(): + 'Get new repository.' + return WipeRepository() + +def writeOutput(fileName, shouldAnalyze=True): + "Wipe a gcode linear move file." + skeinforge_craft.writeChainTextWithNounMessage(fileName, 'wipe', shouldAnalyze) + + +class WipeRepository: + "A class to handle the wipe settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.craft_plugins.wipe.html', self ) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Wipe', self, '') + self.openWikiManualHelpPage = settings.HelpPage().getOpenFromAbsolute('http://fabmetheus.crsndoo.com/wiki/index.php/Skeinforge_Wipe') + self.activateWipe = settings.BooleanSetting().getFromValue('Activate Wipe', self, False ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Location Arrival -', self ) + self.locationArrivalX = settings.FloatSpin().getFromValue( - 100.0, 'Location Arrival X (mm):', self, 100.0, - 70.0 ) + self.locationArrivalY = settings.FloatSpin().getFromValue( - 100.0, 'Location Arrival Y (mm):', self, 100.0, - 50.0 ) + self.locationArrivalZ = settings.FloatSpin().getFromValue( - 100.0, 'Location Arrival Z (mm):', self, 100.0, 50.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Location Departure -', self ) + self.locationDepartureX = settings.FloatSpin().getFromValue( - 100.0, 'Location Departure X (mm):', self, 100.0, - 70.0 ) + self.locationDepartureY = settings.FloatSpin().getFromValue( - 100.0, 'Location Departure Y (mm):', self, 100.0, - 40.0 ) + self.locationDepartureZ = settings.FloatSpin().getFromValue( - 100.0, 'Location Departure Z (mm):', self, 100.0, 50.0 ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Location Wipe -', self ) + self.locationWipeX = settings.FloatSpin().getFromValue( - 100.0, 'Location Wipe X (mm):', self, 100.0, - 70.0 ) + self.locationWipeY = settings.FloatSpin().getFromValue( - 100.0, 'Location Wipe Y (mm):', self, 100.0, - 70.0 ) + self.locationWipeZ = settings.FloatSpin().getFromValue( - 100.0, 'Location Wipe Z (mm):', self, 100.0, 50.0 ) + settings.LabelSeparator().getFromRepository(self) + self.wipePeriod = settings.IntSpin().getFromValue( 1, 'Wipe Period (layers):', self, 5, 3 ) + self.executeTitle = 'Wipe' + + def execute(self): + "Wipe button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode(self.fileNameInput.value, fabmetheus_interpret.getImportPluginFileNames(), self.fileNameInput.wasCancelled) + for fileName in fileNames: + writeOutput(fileName) + + +class WipeSkein: + "A class to wipe a skein of extrusions." + def __init__(self): + self.distanceFeedRate = gcodec.DistanceFeedRate() + self.extruderActive = False + self.highestZ = None + self.layerIndex = - 1 + self.lineIndex = 0 + self.lines = None + self.oldLocation = None + self.shouldWipe = False + self.travelFeedRateMinute = 957.0 + + def addHop( self, begin, end ): + "Add hop to highest point." + beginEndDistance = begin.distance(end) + if beginEndDistance < 3.0 * self.absolutePerimeterWidth: + return + alongWay = self.absolutePerimeterWidth / beginEndDistance + closeToOldLocation = euclidean.getIntermediateLocation( alongWay, begin, end ) + closeToOldLocation.z = self.highestZ + self.distanceFeedRate.addLine( self.getLinearMoveWithFeedRate( self.travelFeedRateMinute, closeToOldLocation ) ) + closeToOldArrival = euclidean.getIntermediateLocation( alongWay, end, begin ) + closeToOldArrival.z = self.highestZ + self.distanceFeedRate.addLine( self.getLinearMoveWithFeedRate( self.travelFeedRateMinute, closeToOldArrival ) ) + + def addWipeTravel( self, splitLine ): + "Add the wipe travel gcode." + location = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + self.highestZ = max( self.highestZ, location.z ) + if not self.shouldWipe: + return + self.shouldWipe = False + if self.extruderActive: + self.distanceFeedRate.addLine('M103') + if self.oldLocation != None: + self.addHop( self.oldLocation, self.locationArrival ) + self.distanceFeedRate.addLine( self.getLinearMoveWithFeedRate( self.travelFeedRateMinute, self.locationArrival ) ) + self.distanceFeedRate.addLine( self.getLinearMoveWithFeedRate( self.travelFeedRateMinute, self.locationWipe ) ) + self.distanceFeedRate.addLine( self.getLinearMoveWithFeedRate( self.travelFeedRateMinute, self.locationDeparture ) ) + self.addHop( self.locationDeparture, location ) + if self.extruderActive: + self.distanceFeedRate.addLine('M101') + + def getCraftedGcode( self, gcodeText, wipeRepository ): + "Parse gcode text and store the wipe gcode." + self.lines = archive.getTextLines(gcodeText) + self.wipePeriod = wipeRepository.wipePeriod.value + self.parseInitialization( wipeRepository ) + self.locationArrival = Vector3( wipeRepository.locationArrivalX.value, wipeRepository.locationArrivalY.value, wipeRepository.locationArrivalZ.value ) + self.locationDeparture = Vector3( wipeRepository.locationDepartureX.value, wipeRepository.locationDepartureY.value, wipeRepository.locationDepartureZ.value ) + self.locationWipe = Vector3( wipeRepository.locationWipeX.value, wipeRepository.locationWipeY.value, wipeRepository.locationWipeZ.value ) + for self.lineIndex in xrange(self.lineIndex, len(self.lines)): + line = self.lines[self.lineIndex] + self.parseLine(line) + return self.distanceFeedRate.output.getvalue() + + def getLinearMoveWithFeedRate( self, feedRate, location ): + "Get a linear move line with the feedRate." + return self.distanceFeedRate.getLinearGcodeMovementWithFeedRate( feedRate, location.dropAxis(), location.z ) + + def parseInitialization( self, wipeRepository ): + 'Parse gcode initialization and store the parameters.' + for self.lineIndex in xrange(len(self.lines)): + line = self.lines[self.lineIndex] + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + firstWord = gcodec.getFirstWord(splitLine) + self.distanceFeedRate.parseSplitLine(firstWord, splitLine) + if firstWord == '()': + self.distanceFeedRate.addTagBracketedProcedure('wipe') + return + elif firstWord == '(': + self.absolutePerimeterWidth = abs(float(splitLine[1])) + elif firstWord == '(': + self.travelFeedRateMinute = 60.0 * float(splitLine[1]) + self.distanceFeedRate.addLine(line) + + def parseLine(self, line): + "Parse a gcode line and add it to the bevel gcode." + splitLine = gcodec.getSplitLineBeforeBracketSemicolon(line) + if len(splitLine) < 1: + return + firstWord = splitLine[0] + if firstWord == 'G1': + self.addWipeTravel(splitLine) + self.oldLocation = gcodec.getLocationFromSplitLine(self.oldLocation, splitLine) + elif firstWord == '(': + settings.printProgress(self.layerIndex, 'wipe') + self.layerIndex += 1 + if self.layerIndex % self.wipePeriod == 0: + self.shouldWipe = True + elif firstWord == 'M101': + self.extruderActive = True + elif firstWord == 'M103': + self.extruderActive = False + self.distanceFeedRate.addLine(line) + + +def main(): + "Display the wipe dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.pyc new file mode 100644 index 0000000..946d4e7 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/craft_plugins/wipe.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/help.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/help.py new file mode 100644 index 0000000..8725328 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/help.py @@ -0,0 +1,82 @@ +""" +This page is in the table of contents. +Help has buttons and menu items to open help, blog and forum pages in your primary browser. + + +==Link Buttons== +===Announcements=== +====Fabmetheus Blog==== +The skeinforge announcements blog and the place to post questions, bugs and skeinforge requests. + +===Documentation=== +====Index of Local Documentation==== +The list of the pages in the documentation folder. + +====Wiki Manual==== +The skeinforge wiki with pictures and charts. It is the best and most readable source of skeinforge information and you are welcome to contribute. + +====Skeinforge Overview==== +A general description of skeinforge, has answers to frequently asked questions and has many links to skeinforge, fabrication and python pages. It is also the help page of the skeinforge tool. + +===Forums=== +====Bits from Bytes Printing Board==== +Board about printing questions, problems and solutions. Most of the people on that forum use the rapman, but many of the solutions apply to any reprap. + +====Bits from Bytes Software Board==== +Board about software, and has some skeinforge threads. + +====Skeinforge Contributions Thread==== +Forum thread about how to contribute to skeinforge development. + +====Skeinforge Settings Thread==== +Forum thread for people to post, download and discuss skeinforge settings. + +==Settings== +===Wiki Manual Primary=== +Default is on. + +The help menu has an item for each button on the help page. Also, at the very top, it has a link to the local documentation and if there is a separate page for that tool in the wiki manual, a link to that page on the manual. If the 'Wiki Manual Primary' checkbutton is selected and there is a separate wiki manual page, the wiki page will be the primary document page, otherwise the local page will be primary. The help button (? symbol button) on the tool page will open the primary page, as will pressing . For example, if you click the the help button from the chamber tool, which has a separate page in the wiki, and 'Wiki Manual Primary' is selected, the wiki manual chamber page will be opened. Clicking F1 will also open the wiki manual chamber page. + +""" + +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 fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_help +import os + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addToMenu( master, menu, repository, window ): + "Add a tool plugin menu." + path = settings.getPathInFabmetheusFromFileNameHelp( repository.fileNameHelp ) + capitalizedBasename = os.path.basename(path).capitalize() + helpRepository = settings.getReadRepository( skeinforge_help.HelpRepository() ) + if repository.openWikiManualHelpPage != None and helpRepository.wikiManualPrimary.value: + menu.add_command( label = 'Local ' + capitalizedBasename, command = repository.openLocalHelpPage ) + else: + settings.addAcceleratorCommand('', repository.openLocalHelpPage, master, menu, 'Local ' + capitalizedBasename ) + if repository.openWikiManualHelpPage != None: + if helpRepository.wikiManualPrimary.value: + settings.addAcceleratorCommand('', repository.openWikiManualHelpPage, master, menu, 'Wiki Manual ' + capitalizedBasename ) + else: + menu.add_command( label = 'Wiki Manual ' + capitalizedBasename, command = repository.openWikiManualHelpPage ) + menu.add_separator() + settings.addMenuEntitiesToMenu( menu, helpRepository.menuEntities ) + +def getNewRepository(): + 'Get new repository.' + return skeinforge_help.HelpRepository() + +def main(): + "Display the help dialog." + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/help.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/help.pyc new file mode 100644 index 0000000..79f1863 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/help.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta.py new file mode 100644 index 0000000..8b9ec49 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta.py @@ -0,0 +1,36 @@ +""" +This page is in the table of contents. +Meta is a script to access the plugins which handle meta information. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_meta + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addToMenu( master, menu, repository, window ): + "Add a tool plugin menu." + metaFilePath = archive.getSkeinforgePluginsPath('meta.py') + settings.addPluginsParentToMenu(skeinforge_meta.getPluginsDirectoryPath(), menu, metaFilePath, skeinforge_meta.getPluginFileNames()) + +def getNewRepository(): + 'Get new repository.' + return skeinforge_meta.MetaRepository() + + +def main(): + "Display the meta dialog." + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta.pyc new file mode 100644 index 0000000..3ba9966 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/__init__.py new file mode 100644 index 0000000..1121e8a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 3 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/description.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/description.py new file mode 100644 index 0000000..962ad37 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/description.py @@ -0,0 +1,51 @@ +""" +This page is in the table of contents. +Description is a script to store a description of the profile. + +==Settings== +===Description Text=== +Default is empty. + +The suggested format is a description, followed by a link to a profile post or web page. + +==Example== +Example of using description follows below. + +> python description.py +This brings up the description dialog. + +""" + +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 fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return DescriptionRepository() + + +class DescriptionRepository: + "A class to handle the description settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_plugins.meta_plugins.description.html', self) + description = 'Write your description of the profile here.\n\nSuggested format is a description, followed by a link to the profile post or web page.' + self.descriptionText = settings.TextSetting().getFromValue('Description Text:', self, description ) + + +def main(): + "Display the file or directory dialog." + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/polyfile.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/polyfile.py new file mode 100644 index 0000000..6d377b7 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/meta_plugins/polyfile.py @@ -0,0 +1,45 @@ +""" +This page is in the table of contents. +Polyfile is a script to choose whether the skeinforge toolchain will operate on one file or all the files in a directory. + +==Settings== +===Polyfile Choice=== +Default is 'Execute File', + +====Execute File==== +When selected, the toolchain will operate on only the chosen file. + +====Execute All Unmodified Files in a Directory'==== +When selected, the toolchain will operate on all the unmodifed files in the directory that the chosen file is in. + +==Example== +Example of using polyfile follows below. + +> python polyfile.py +This brings up the polyfile dialog. + +""" + +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_application.skeinforge_utilities import skeinforge_polyfile + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return skeinforge_polyfile.PolyfileRepository() + + +def main(): + "Display the file or directory dialog." + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile.py new file mode 100644 index 0000000..808d482 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile.py @@ -0,0 +1,116 @@ +""" +This page is in the table of contents. +Profile is a script to set the craft types setting for the skeinforge chain. + +Profile presents the user with a choice of the craft types in the profile_plugins folder. The chosen craft type is used to determine the craft type profile for the skeinforge chain. The default craft type is extrusion. + +The setting is the selection. If you hit 'Save and Close' the selection will be saved, if you hit 'Cancel' the selection will not be saved. + +To change the profile setting, in a shell in the profile folder type: +> python profile.py + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addSubmenus( craftTypeName, menu, pluginFileName, pluginPath, profileRadioVar ): + "Add a tool plugin menu." + submenu = settings.Tkinter.Menu( menu, tearoff = 0 ) + menu.add_cascade( label = pluginFileName.capitalize(), menu = submenu ) + settings.ToolDialog().addPluginToMenu( submenu, pluginPath ) + submenu.add_separator() + pluginModule = skeinforge_profile.getCraftTypePluginModule( pluginFileName ) + profilePluginSettings = settings.getReadRepository( pluginModule.getNewRepository() ) + isSelected = ( craftTypeName == pluginFileName ) + for profileName in profilePluginSettings.profileList.value: + value = isSelected and profileName == profilePluginSettings.profileListbox.value + ProfileMenuRadio( pluginFileName, submenu, profileName, profileRadioVar, value ) + +def addToMenu( master, menu, repository, window ): + "Add a tool plugin menu." + ProfileMenuSaveListener( menu, window ) + +def addToProfileMenu( menu ): + "Add a profile menu." + settings.ToolDialog().addPluginToMenu(menu, archive.getUntilDot(archive.getSkeinforgePluginsPath('profile.py'))) + menu.add_separator() + directoryPath = skeinforge_profile.getPluginsDirectoryPath() + pluginFileNames = skeinforge_profile.getPluginFileNames() + craftTypeName = skeinforge_profile.getCraftTypeName() + profileRadioVar = settings.Tkinter.StringVar() + for pluginFileName in pluginFileNames: + addSubmenus( craftTypeName, menu, pluginFileName, os.path.join( directoryPath, pluginFileName ), profileRadioVar ) + +def getNewRepository(): + 'Get new repository.' + return skeinforge_profile.ProfileRepository() + + +class ProfileMenuRadio: + "A class to display a profile menu radio button." + def __init__( self, profilePluginFileName, menu, name, radioVar, value ): + "Create a profile menu radio." + self.activate = False + self.menu = menu + self.name = name + self.profileJoinName = profilePluginFileName + '.& /' + name + self.profilePluginFileName = profilePluginFileName + self.radioVar = radioVar + menu.add_radiobutton( label = name.replace('_', ' '), command = self.clickRadio, value = self.profileJoinName, variable = self.radioVar ) + self.menuLength = menu.index( settings.Tkinter.END ) + if value: + self.radioVar.set( self.profileJoinName ) + self.menu.invoke( self.menuLength ) + self.activate = True + + def clickRadio(self): + "Workaround for Tkinter bug, invoke and set the value when clicked." + if not self.activate: + return + self.radioVar.set( self.profileJoinName ) + pluginModule = skeinforge_profile.getCraftTypePluginModule( self.profilePluginFileName ) + profilePluginSettings = settings.getReadRepository( pluginModule.getNewRepository() ) + profilePluginSettings.profileListbox.value = self.name + settings.writeSettings( profilePluginSettings ) + profileSettings = skeinforge_profile.getReadProfileRepository() + plugins = profileSettings.craftRadios + for plugin in plugins: + plugin.value = ( plugin.name == self.profilePluginFileName ) + settings.writeSettings( profileSettings ) + skeinforge_profile.updateProfileSaveListeners() + + +class ProfileMenuSaveListener: + "A class to update a profile menu." + def __init__( self, menu, window ): + "Set the menu." + self.menu = menu + addToProfileMenu( menu ) + euclidean.addElementToListDictionaryIfNotThere( self, window, settings.globalProfileSaveListenerListTable ) + + def save(self): + "Profile has been saved and profile menu should be updated." + settings.deleteMenuItems( self.menu ) + addToProfileMenu( self.menu ) + + +def main(): + "Display the profile dialog." + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile.pyc new file mode 100644 index 0000000..2d36f5d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/__init__.py new file mode 100644 index 0000000..1121e8a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 3 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/__pycache__/extrusion.cpython-32.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/__pycache__/extrusion.cpython-32.pyc new file mode 100644 index 0000000..3c62ac7 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/__pycache__/extrusion.cpython-32.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/cutting.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/cutting.py new file mode 100644 index 0000000..de1df9c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/cutting.py @@ -0,0 +1,53 @@ +""" +This page is in the table of contents. +Cutting is a script to set the cutting profile for the skeinforge chain. + +The displayed craft sequence is the sequence in which the tools craft the model and export the output. + +On the cutting dialog, clicking the 'Add Profile' button will duplicate the selected profile and give it the name in the input field. For example, if laser is selected and the name laser_10mm is in the input field, clicking the 'Add Profile' button will duplicate laser and save it as laser_10mm. The 'Delete Profile' button deletes the selected profile. + +The profile selection is the setting. If you hit 'Save and Close' the selection will be saved, if you hit 'Cancel' the selection will not be saved. However; adding and deleting a profile is a permanent action, for example 'Cancel' will not bring back any deleted profiles. + +To change the cutting profile, in a shell in the profile_plugins folder type: +> python cutting.py + +""" + + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftSequence(): + "Get the cutting craft sequence." + return 'chop preface outset multiply whittle drill lift flow feed home lash fillet limit unpause bookend export'.split() + +def getNewRepository(): + 'Get new repository.' + return CuttingRepository() + + +class CuttingRepository: + "A class to handle the cutting settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsSetCraftProfile( getCraftSequence(), 'end_mill', self, 'skeinforge_plugins.profile_plugins.cutting.html') + + +def main(): + "Display the export dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/cutting.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/cutting.pyc new file mode 100644 index 0000000..a7cb8c3 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/cutting.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py new file mode 100644 index 0000000..b959d9e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.py @@ -0,0 +1,53 @@ +""" +This page is in the table of contents. +Extrusion is a script to set the extrusion profile for the skeinforge chain. + +The displayed craft sequence is the sequence in which the tools craft the model and export the output. + +On the extrusion dialog, clicking the 'Add Profile' button will duplicate the selected profile and give it the name in the input field. For example, if ABS is selected and the name ABS_black is in the input field, clicking the 'Add Profile' button will duplicate ABS and save it as ABS_black. The 'Delete Profile' button deletes the selected profile. + +The profile selection is the setting. If you hit 'Save and Close' the selection will be saved, if you hit 'Cancel' the selection will not be saved. However; adding and deleting a profile is a permanent action, for example 'Cancel' will not bring back any deleted profiles. + +To change the extrusion profile, in a shell in the profile_plugins folder type: +> python extrusion.py + +""" + + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftSequence(): + 'Get the extrusion craft sequence.' + return 'carve scale bottom preface widen inset fill multiply speed temperature raft skirt chamber tower jitter clip stretch skin comb cool hop wipe oozebane splodge home lash fillet limit dimension unpause bookend export'.split() + +def getNewRepository(): + 'Get new repository.' + return ExtrusionRepository() + + +class ExtrusionRepository: + 'A class to handle the export settings.' + def __init__(self): + 'Set the default settings, execute title & settings fileName.' + skeinforge_profile.addListsSetCraftProfile( getCraftSequence(), 'ABS', self, 'skeinforge_plugins.profile_plugins.extrusion.html') + + +def main(): + 'Display the export dialog.' + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == '__main__': + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.pyc new file mode 100644 index 0000000..f8ab86f Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/extrusion.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/milling.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/milling.py new file mode 100644 index 0000000..3461508 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/milling.py @@ -0,0 +1,53 @@ +""" +This page is in the table of contents. +Milling is a script to set the milling profile for the skeinforge chain. + +The displayed craft sequence is the sequence in which the tools craft the model and export the output. + +On the milling dialog, clicking the 'Add Profile' button will duplicate the selected profile and give it the name in the input field. For example, if laser is selected and the name laser_10mm is in the input field, clicking the 'Add Profile' button will duplicate laser and save it as laser_10mm. The 'Delete Profile' button deletes the selected profile. + +The profile selection is the setting. If you hit 'Save and Close' the selection will be saved, if you hit 'Cancel' the selection will not be saved. However; adding and deleting a profile is a permanent action, for example 'Cancel' will not bring back any deleted profiles. + +To change the milling profile, in a shell in the profile_plugins folder type: +> python milling.py + +""" + + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftSequence(): + "Get the milling craft sequence." + return 'chop preface outset mill multiply drill lift flow feed home lash fillet limit unpause bookend export'.split() + +def getNewRepository(): + 'Get new repository.' + return MillingRepository() + + +class MillingRepository: + "A class to handle the milling settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsSetCraftProfile( getCraftSequence(), 'end_mill', self, 'skeinforge_plugins.profile_plugins.milling.html') + + +def main(): + "Display the export dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/milling.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/milling.pyc new file mode 100644 index 0000000..5a2b569 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/milling.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/winding.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/winding.py new file mode 100644 index 0000000..944ae0c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/winding.py @@ -0,0 +1,53 @@ +""" +This page is in the table of contents. +Winding is a script to set the winding profile for the skeinforge chain. + +The displayed craft sequence is the sequence in which the tools craft the model and export the output. + +On the winding dialog, clicking the 'Add Profile' button will duplicate the selected profile and give it the name in the input field. For example, if laser is selected and the name laser_10mm is in the input field, clicking the 'Add Profile' button will duplicate laser and save it as laser_10mm. The 'Delete Profile' button deletes the selected profile. + +The profile selection is the setting. If you hit 'Save and Close' the selection will be saved, if you hit 'Cancel' the selection will not be saved. However; adding and deleting a profile is a permanent action, for example 'Cancel' will not bring back any deleted profiles. + +To change the winding profile, in a shell in the profile_plugins folder type: +> python winding.py + +""" + + +from __future__ import absolute_import +import __init__ +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import sys + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getCraftSequence(): + "Get the winding craft sequence." + return 'cleave preface coil flow feed home lash fillet limit unpause bookend export'.split() + +def getNewRepository(): + 'Get new repository.' + return WindingRepository() + + +class WindingRepository: + "A class to handle the winding settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsSetCraftProfile( getCraftSequence(), 'free_wire', self, 'skeinforge_plugins.profile_plugins.winding.html') + + +def main(): + "Display the export dialog." + if len(sys.argv) > 1: + writeOutput(' '.join(sys.argv[1 :])) + else: + settings.startMainLoopFromConstructor(getNewRepository()) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/winding.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/winding.pyc new file mode 100644 index 0000000..eb1bba7 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_plugins/profile_plugins/winding.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__init__.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__init__.py new file mode 100644 index 0000000..2dc8ddc --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__init__.py @@ -0,0 +1,9 @@ +#This is required to workaround the python import bug where relative imports don't work if the module is imported as a main module. +import os +import sys +numberOfLevelsDeepInPackageHierarchy = 2 +packageFilePath = os.path.abspath(__file__) +for level in range( numberOfLevelsDeepInPackageHierarchy + 1 ): + packageFilePath = os.path.dirname( packageFilePath ) +if packageFilePath not in sys.path: + sys.path.insert( 0, packageFilePath ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__init__.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__init__.pyc new file mode 100644 index 0000000..4c4ce74 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__init__.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__pycache__/.gitignore b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__pycache__/.gitignore new file mode 100644 index 0000000..a74b07a --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/__pycache__/.gitignore @@ -0,0 +1 @@ +/*.pyc diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_analyze.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_analyze.py new file mode 100644 index 0000000..cc1456c --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_analyze.py @@ -0,0 +1,82 @@ +""" +Analyze is a script to access the plugins which analyze a gcode file. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys +import traceback + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return AnalyzeRepository() + +def getPluginFileNames(): + "Get analyze plugin fileNames." + return archive.getPluginFileNamesFromDirectoryPath( getPluginsDirectoryPath() ) + +def getPluginsDirectoryPath(): + "Get the plugins directory path." + return archive.getSkeinforgePluginsPath('analyze_plugins') + +def writeOutput(fileName, fileNamePenultimate, fileNameSuffix, filePenultimateWritten, gcodeText=''): + "Analyze a gcode file." + gcodeText = archive.getTextIfEmpty(fileName, gcodeText) + pluginFileNames = getPluginFileNames() + window = None + for pluginFileName in pluginFileNames: + analyzePluginsDirectoryPath = getPluginsDirectoryPath() + pluginModule = archive.getModuleWithDirectoryPath( analyzePluginsDirectoryPath, pluginFileName ) + if pluginModule != None: + try: + newWindow = pluginModule.writeOutput(fileName, fileNamePenultimate, fileNameSuffix, + filePenultimateWritten, gcodeText ) + if newWindow != None: + window = newWindow + except: + print('Warning, the tool %s could not analyze the output.' % pluginFileName ) + print('Exception traceback in writeOutput in skeinforge_analyze:') + traceback.print_exc(file=sys.stdout) + return window + + +class AnalyzeRepository: + "A class to handle the analyze settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_utilities.skeinforge_analyze.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( [ ('Gcode text files', '*.gcode') ], 'Open File for Analyze', self, '') + importantFileNames = ['skeiniso', 'skeinlayer', 'statistic'] + settings.getRadioPluginsAddPluginFrame( getPluginsDirectoryPath(), importantFileNames, getPluginFileNames(), self ) + self.executeTitle = 'Analyze' + + def execute(self): + "Analyze button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, [], self.fileNameInput.wasCancelled ) + for fileName in fileNames: + writeOutput( fileName, fileName ) + + +def main(): + "Write analyze output." + fileName = ' '.join(sys.argv[1 :]) + settings.startMainLoopFromWindow(writeOutput(fileName, fileName)) + + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_analyze.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_analyze.pyc new file mode 100644 index 0000000..de857a1 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_analyze.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_craft.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_craft.py new file mode 100644 index 0000000..e1ebc03 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_craft.py @@ -0,0 +1,226 @@ +""" +Craft is a script to access the plugins which craft a gcode file. + +The plugin buttons which are commonly used are bolded and the ones which are rarely used have normal font weight. + +""" + +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 fabmetheus_utilities.fabmetheus_tools import fabmetheus_interpret +from fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_analyze +from skeinforge_application.skeinforge_utilities import skeinforge_polyfile +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os +import sys +import time + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getChainText( fileName, procedure ): + "Get a crafted shape file." + text='' + if fileName.endswith('.gcode') or fileName.endswith('.svg'): + text = archive.getFileText(fileName) + procedures = getProcedures( procedure, text ) + return getChainTextFromProcedures( fileName, procedures, text ) + +def getChainTextFromProcedures(fileName, procedures, text): + 'Get a crafted shape file from a list of procedures.' + lastProcedureTime = time.time() + for procedure in procedures: + craftModule = getCraftModule(procedure) + if craftModule != None: + text = craftModule.getCraftedText(fileName, text) + if text == '': + print('Warning, the text was not recognized in getChainTextFromProcedures in skeinforge_craft for') + print(fileName) + return '' + if gcodec.isProcedureDone( text, procedure ): + print('%s procedure took %s.' % (procedure.capitalize(), euclidean.getDurationString(time.time() - lastProcedureTime))) + lastProcedureTime = time.time() + return text + +def getCraftModule(fileName): + "Get craft module." + return archive.getModuleWithDirectoryPath(getPluginsDirectoryPath(), fileName) + +def getLastModule(): + "Get the last tool." + craftSequence = getReadCraftSequence() + if len( craftSequence ) < 1: + return None + return getCraftModule( craftSequence[-1] ) + +def getNewRepository(): + 'Get new repository.' + return CraftRepository() + +def getPluginFileNames(): + "Get craft plugin fileNames." + craftSequence = getReadCraftSequence() + craftSequence.sort() + return craftSequence + +def getPluginsDirectoryPath(): + "Get the plugins directory path." + return archive.getCraftPluginsDirectoryPath() + +def getProcedures( procedure, text ): + "Get the procedures up to and including the given procedure." + craftSequence = getReadCraftSequence() + sequenceIndexPlusOneFromText = getSequenceIndexPlusOneFromText(text) + sequenceIndexFromProcedure = getSequenceIndexFromProcedure(procedure) + return craftSequence[ sequenceIndexPlusOneFromText : sequenceIndexFromProcedure + 1 ] + +def getReadCraftSequence(): + "Get profile sequence." + return skeinforge_profile.getCraftTypePluginModule().getCraftSequence() + +def getSequenceIndexFromProcedure(procedure): + "Get the profile sequence index of the procedure. Return None if the procedure is not in the sequence" + craftSequence = getReadCraftSequence() + if procedure not in craftSequence: + return 0 + return craftSequence.index(procedure) + +def getSequenceIndexPlusOneFromText(fileText): + "Get the profile sequence index of the file plus one. Return zero if the procedure is not in the file" + craftSequence = getReadCraftSequence() + for craftSequenceIndex in range( len( craftSequence ) - 1, - 1, - 1 ): + procedure = craftSequence[ craftSequenceIndex ] + if gcodec.isProcedureDone( fileText, procedure ): + return craftSequenceIndex + 1 + return 0 + +def writeChainTextWithNounMessage(fileName, procedure, shouldAnalyze=True): + 'Get and write a crafted shape file.' + print('') + print('The %s tool is parsing the file:' % procedure) + print(os.path.basename(fileName)) + print('') + startTime = time.time() + fileNameSuffix = fileName[: fileName.rfind('.')] + '_' + procedure + '.gcode' + craftText = getChainText(fileName, procedure) + if craftText == '': + print('Warning, there was no text output in writeChainTextWithNounMessage in skeinforge_craft for:') + print(fileName) + return + archive.writeFileText(fileNameSuffix, craftText) + window = None + if shouldAnalyze: + window = skeinforge_analyze.writeOutput(fileName, fileNameSuffix, fileNameSuffix, True, craftText) + print('') + print('The %s tool has created the file:' % procedure) + print(fileNameSuffix) + print('') + print('It took %s to craft the file.' % euclidean.getDurationString(time.time() - startTime)) + return window + +def writeOutput(fileName, shouldAnalyze=True): + "Craft a gcode file with the last module." + pluginModule = getLastModule() + if pluginModule != None: + return pluginModule.writeOutput(fileName, shouldAnalyze) + +def writeSVGTextWithNounMessage(fileName, repository, shouldAnalyze=True): + 'Get and write an svg text and print messages.' + print('') + print('The %s tool is parsing the file:' % repository.lowerName) + print(os.path.basename(fileName)) + print('') + startTime = time.time() + fileNameSuffix = fileName[: fileName.rfind('.')] + '_' + repository.lowerName + '.svg' + craftText = getChainText(fileName, repository.lowerName) + if craftText == '': + return + archive.writeFileText(fileNameSuffix, craftText) + print('') + print('The %s tool has created the file:' % repository.lowerName) + print(fileNameSuffix) + print('') + print('It took %s to craft the file.' % euclidean.getDurationString(time.time() - startTime)) + if shouldAnalyze: + settings.getReadRepository(repository) + settings.openSVGPage(fileNameSuffix, repository.svgViewer.value) + + +class CraftRadioButtonsSaveListener: + "A class to update the craft radio buttons." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + euclidean.addElementToListDictionaryIfNotThere( self, self.repository.repositoryDialog, settings.globalProfileSaveListenerListTable ) + self.gridPosition = gridPosition.getCopy() + self.gridPosition.row = gridPosition.rowStart + self.gridPosition.increment() + self.setRadioButtons() + + def getFromRadioPlugins( self, radioPlugins, repository ): + "Initialize." + self.name = 'CraftRadioButtonsSaveListener' + self.radioPlugins = radioPlugins + self.repository = repository + repository.displayEntities.append(self) + return self + + def save(self): + "Profile has been saved and craft radio plugins should be updated." + self.setRadioButtons() + + def setRadioButtons(self): + "Profile has been saved and craft radio plugins should be updated." + activeRadioPlugins = [] + craftSequence = skeinforge_profile.getCraftTypePluginModule().getCraftSequence() + gridPosition = self.gridPosition.getCopy() + isRadioPluginSelected = False + settings.getReadRepository(self.repository) + for radioPlugin in self.radioPlugins: + if radioPlugin.name in craftSequence: + activeRadioPlugins.append(radioPlugin) + radioPlugin.incrementGridPosition(gridPosition) + if radioPlugin.value: + radioPlugin.setSelect() + isRadioPluginSelected = True + else: + radioPlugin.radiobutton.grid_remove() + if not isRadioPluginSelected: + radioPluginNames = self.repository.importantFileNames + [activeRadioPlugins[0].name] + settings.getSelectedRadioPlugin(radioPluginNames , activeRadioPlugins).setSelect() + self.repository.pluginFrame.update() + + +class CraftRepository: + "A class to handle the craft settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_utilities.skeinforge_craft.html', self) + self.fileNameInput = settings.FileNameInput().getFromFileName( fabmetheus_interpret.getGNUTranslatorGcodeFileTypeTuples(), 'Open File for Craft', self, '') + self.importantFileNames = ['carve', 'chop', 'feed', 'flow', 'lift', 'raft', 'speed'] + allCraftNames = archive.getPluginFileNamesFromDirectoryPath(getPluginsDirectoryPath()) + self.radioPlugins = settings.getRadioPluginsAddPluginFrame(getPluginsDirectoryPath(), self.importantFileNames, allCraftNames, self) + CraftRadioButtonsSaveListener().getFromRadioPlugins(self.radioPlugins, self) + self.executeTitle = 'Craft' + + def execute(self): + "Craft button has been clicked." + fileNames = skeinforge_polyfile.getFileOrDirectoryTypesUnmodifiedGcode( self.fileNameInput.value, [], self.fileNameInput.wasCancelled ) + for fileName in fileNames: + writeOutput(fileName) + + +def main(): + "Write craft output." + writeOutput(' '.join(sys.argv[1 :]), False) + +if __name__ == "__main__": + main() diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_craft.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_craft.pyc new file mode 100644 index 0000000..a1c598a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_craft.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_help.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_help.py new file mode 100644 index 0000000..5c85467 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_help.py @@ -0,0 +1,68 @@ +""" +Help has buttons and menu items to open help, blog and forum pages in your primary browser. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return HelpRepository() + + +class HelpRepository: + "A class to handle the help settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_utilities.skeinforge_help.html', self) + settings.LabelDisplay().getFromName('- Announcements -', self ) + settings.LabelDisplay().getFromName('Fabmetheus Blog, Announcements & Questions:', self ) + settings.HelpPage().getFromNameAfterHTTP('fabmetheus.blogspot.com/', 'Fabmetheus Blog', self ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Documentation -', self ) + settings.LabelDisplay().getFromName('Local Documentation Table of Contents: ', self ) + settings.HelpPage().getFromNameSubName('Contents', self, 'contents.html') + settings.LabelDisplay().getFromName('Wiki Manual with Pictures & Charts: ', self ) + settings.HelpPage().getFromNameAfterHTTP('fabmetheus.crsndoo.com/wiki/index.php/Skeinforge', 'Wiki Manual', self ) + settings.LabelDisplay().getFromName('Skeinforge Overview: ', self ) + settings.HelpPage().getFromNameSubName('Skeinforge Overview', self, 'skeinforge_application.skeinforge.html') + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Forums -', self ) + settings.LabelDisplay().getFromName('Bits from Bytes Software Board:', self ) + settings.HelpPage().getFromNameAfterWWW('bitsfrombytes.com/fora/user/index.php?board=4.0', 'Bits from Bytes Software Board', self ) + settings.LabelDisplay().getFromName('Makerbot Operators:', self ) + settings.HelpPage().getFromNameAfterHTTP('groups.google.com/group/makerbot', 'Makerbot Operators', self ) + settings.LabelDisplay().getFromName('Skeinforge Contributions Thread:', self ) + settings.HelpPage().getFromNameAfterHTTP('dev.forums.reprap.org/read.php?12,27562', 'Skeinforge Contributions Thread', self ) + settings.LabelDisplay().getFromName('Skeinforge Settings Thread:', self ) + settings.HelpPage().getFromNameAfterHTTP('dev.forums.reprap.org/read.php?12,27434', 'Skeinforge Settings Thread', self ) + settings.LabelDisplay().getFromName('Skeinforge Troubleshooting Thread:', self ) + settings.HelpPage().getFromNameAfterHTTP('forums.reprap.org/list.php?154', 'Skeinforge Troubleshooting Thread', self ) + settings.LabelSeparator().getFromRepository(self) + settings.LabelDisplay().getFromName('- Search -', self ) + settings.LabelDisplay().getFromName('Reprap Search:', self ) + settings.HelpPage().getFromNameAfterHTTP('members.axion.net/~enrique/search_reprap.html', 'Reprap Search', self ) + settings.LabelDisplay().getFromName('Skeinforge Search:', self ) + settings.HelpPage().getFromNameAfterHTTP('members.axion.net/~enrique/search_skeinforge.html', 'Skeinforge Search', self ) + settings.LabelDisplay().getFromName('Web Search:', self ) + settings.HelpPage().getFromNameAfterHTTP('members.axion.net/~enrique/search_web.html', 'Web Search', self ) + settings.LabelSeparator().getFromRepository(self) + self.version = settings.LabelDisplay().getFromName('Version: ' + archive.getFileText(archive.getVersionFileName()), self) + self.wikiManualPrimary = settings.BooleanSetting().getFromValue('Wiki Manual Primary', self, True ) + self.wikiManualPrimary.setUpdateFunction( self.save ) + + def save(self): + "Write the entities." + settings.writeSettingsPrintMessage(self) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_help.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_help.pyc new file mode 100644 index 0000000..95a467a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_help.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_meta.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_meta.py new file mode 100644 index 0000000..b03b9f1 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_meta.py @@ -0,0 +1,41 @@ +""" +Meta is a script to access the plugins which handle meta information. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile +import os + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getNewRepository(): + 'Get new repository.' + return MetaRepository() + +def getPluginFileNames(): + "Get meta plugin file names." + return archive.getPluginFileNamesFromDirectoryPath( getPluginsDirectoryPath() ) + +def getPluginsDirectoryPath(): + "Get the plugins directory path." + return archive.getSkeinforgePluginsPath('meta_plugins') + + +class MetaRepository: + "A class to handle the meta settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_utilities.skeinforge_meta.html', self) + importantFileNames = ['polyfile'] + settings.getRadioPluginsAddPluginFrame( getPluginsDirectoryPath(), importantFileNames, getPluginFileNames(), self ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_meta.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_meta.pyc new file mode 100644 index 0000000..1f6ddd2 Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_meta.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.py new file mode 100644 index 0000000..3b96e1e --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.py @@ -0,0 +1,70 @@ +""" +Polyfile is a script to choose whether the skeinforge toolchain will operate on one file or all the files in a directory. + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import settings +from skeinforge_application.skeinforge_utilities import skeinforge_profile + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def getFileOrDirectoryTypes( fileName, fileTypes, wasCancelled ): + "Get the gcode files in the directory the file is in if directory setting is true. Otherwise, return the file in a list." + if isEmptyOrCancelled( fileName, wasCancelled ): + return [] + if isDirectorySetting(): + return archive.getFilesWithFileTypesWithoutWords( fileTypes, [], fileName ) + return [ fileName ] + +def getFileOrDirectoryTypesUnmodifiedGcode(fileName, fileTypes, wasCancelled): + "Get the gcode files in the directory the file is in if directory setting is true. Otherwise, return the file in a list." + if isEmptyOrCancelled(fileName, wasCancelled): + return [] + if isDirectorySetting(): + return archive.getFilesWithFileTypesWithoutWords(fileTypes, [], fileName) + return [fileName] + +def getFileOrGcodeDirectory( fileName, wasCancelled, words = [] ): + "Get the gcode files in the directory the file is in if directory setting is true. Otherwise, return the file in a list." + if isEmptyOrCancelled( fileName, wasCancelled ): + return [] + if isDirectorySetting(): + dotIndex = fileName.rfind('.') + if dotIndex < 0: + print('The file name should have a suffix, like myfile.xml.') + print('Since the file name does not have a suffix, nothing will be done') + suffix = fileName[ dotIndex + 1 : ] + return archive.getFilesWithFileTypeWithoutWords( suffix, words, fileName ) + return [ fileName ] + +def getNewRepository(): + 'Get new repository.' + return PolyfileRepository() + +def isDirectorySetting(): + "Determine if the directory setting is true." + return settings.getReadRepository( PolyfileRepository() ).directorySetting.value + +def isEmptyOrCancelled( fileName, wasCancelled ): + "Determine if the fileName is empty or the dialog was cancelled." + return str(fileName) == '' or str(fileName) == '()' or wasCancelled + + +class PolyfileRepository: + "A class to handle the polyfile settings." + def __init__(self): + "Set the default settings, execute title & settings fileName." + skeinforge_profile.addListsToCraftTypeRepository('skeinforge_application.skeinforge_utilities.skeinforge_plugins.polyfile.html', self) + self.directoryOrFileChoiceLabel = settings.LabelDisplay().getFromName('Directory or File Choice: ', self ) + directoryLatentStringVar = settings.LatentStringVar() + self.directorySetting = settings.Radio().getFromRadio( directoryLatentStringVar, 'Execute All Unmodified Files in a Directory', self, False ) + self.fileSetting = settings.Radio().getFromRadio( directoryLatentStringVar, 'Execute File', self, True ) diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.pyc new file mode 100644 index 0000000..032927d Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_profile.py b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_profile.py new file mode 100644 index 0000000..1469cce --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_profile.py @@ -0,0 +1,415 @@ +""" +Profile is a script to set the craft types setting for the skeinforge chain. + +Profile presents the user with a choice of the craft types in the profile_plugins folder. The chosen craft type is used to determine the craft type profile for the skeinforge chain. The default craft type is extrusion. + +The setting is the selection. If you hit 'Save and Close' the selection will be saved, if you hit 'Cancel' the selection will not be saved. + +To change the profile setting, in a shell in the profile folder type: +> python profile.py + +""" + +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 fabmetheus_utilities import archive +from fabmetheus_utilities import euclidean +from fabmetheus_utilities import gcodec +from fabmetheus_utilities import settings +import os +import shutil + + +__author__ = 'Enrique Perez (perez_enrique@yahoo.com)' +__date__ = '$Date: 2008/21/04 $' +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' + + +def addListsSetCraftProfile( craftSequence, defaultProfile, repository, fileNameHelp ): + "Set the craft profile repository." + settings.addListsToRepository(fileNameHelp, repository) + repository.craftSequenceLabel = settings.LabelDisplay().getFromName('Craft Sequence: ', repository ) + craftToolStrings = [] + for craftTool in craftSequence[ : - 1 ]: + craftToolStrings.append( settings.getEachWordCapitalized( craftTool ) + '->') + craftToolStrings.append( settings.getEachWordCapitalized( craftSequence[-1] ) ) + for craftToolStringIndex in range( 0, len( craftToolStrings ), 5 ): + craftLine = ' '.join( craftToolStrings[ craftToolStringIndex : craftToolStringIndex + 5 ] ) + settings.LabelDisplay().getFromName( craftLine, repository ) + settings.LabelDisplay().getFromName('', repository ) + repository.profileList = ProfileList().getFromName('Profile List:', repository ) + repository.profileListbox = ProfileListboxSetting().getFromListSetting( repository.profileList, 'Profile Selection:', repository, defaultProfile ) + repository.addListboxSelection = AddProfile().getFromProfileListboxSettingRepository( repository.profileListbox, repository ) + repository.deleteListboxSelection = DeleteProfile().getFromProfileListboxSettingRepository( repository.profileListbox, repository ) + directoryName = archive.getProfilesPath() + archive.makeDirectory(directoryName) + repository.windowPosition.value = '0+400' + +def addListsToCraftTypeRepository(fileNameHelp, repository): + "Add the value to the lists." + settings.addListsToRepositoryByFunction(fileNameHelp, getProfileDirectory, repository) + dotsMinusOne = fileNameHelp.count('.') - 1 + x = 0 + xAddition = 400 + for step in range(dotsMinusOne): + x += xAddition + xAddition /= 2 + repository.windowPosition.value = '%s+0' % x + +def cancelAll(): + "Cancel all the dialogs." + for globalRepositoryDialogValue in settings.getGlobalRepositoryDialogValues(): + globalRepositoryDialogValue.cancel() + +def getCraftTypeName(subName=''): + "Get the craft type from the profile." + profileSettings = getReadProfileRepository() + craftTypeName = settings.getSelectedPluginName( profileSettings.craftRadios ) + if subName == '': + return craftTypeName + return os.path.join( craftTypeName, subName ) + +def getCraftTypePluginModule( craftTypeName = ''): + "Get the craft type plugin module." + if craftTypeName == '': + craftTypeName = getCraftTypeName() + profilePluginsDirectoryPath = getPluginsDirectoryPath() + return archive.getModuleWithDirectoryPath( profilePluginsDirectoryPath, craftTypeName ) + +def getNewRepository(): + 'Get new repository.' + return ProfileRepository() + +def getPluginFileNames(): + "Get analyze plugin fileNames." + return archive.getPluginFileNamesFromDirectoryPath( getPluginsDirectoryPath() ) + +def getPluginsDirectoryPath(): + "Get the plugins directory path." + return archive.getSkeinforgePluginsPath('profile_plugins') + +def getProfileDirectory(): + "Get the profile directory." + craftTypeName = getCraftTypeName() + return os.path.join( craftTypeName, getProfileName(craftTypeName) ) + +def getProfileName(craftTypeName): + "Get the profile name from the craft type name." + craftTypeSettings = getCraftTypePluginModule(craftTypeName).getNewRepository() + settings.getReadRepository(craftTypeSettings) + return craftTypeSettings.profileListbox.value + +def getReadProfileRepository(): + "Get the read profile repository." + return settings.getReadRepository( ProfileRepository() ) + +def updateProfileSaveListeners(): + "Call the save function of all the update profile save listeners." + for globalProfileSaveListener in euclidean.getListTableElements( settings.globalProfileSaveListenerListTable ): + globalProfileSaveListener.save() + cancelAll() + + +class AddProfile: + "A class to add a profile." + def addSelection(self): + "Add the selection of a listbox setting." + entryText = self.entry.get() + if entryText == '': + print('To add to the profiles, enter the material name.') + return + self.profileListboxSetting.listSetting.setValueToFolders() + if entryText in self.profileListboxSetting.listSetting.value: + print('There is already a profile by the name of %s, so no profile will be added.' % entryText ) + return + self.entry.delete( 0, settings.Tkinter.END ) + craftTypeProfileDirectory = archive.getProfilesPath( self.profileListboxSetting.listSetting.craftTypeName ) + destinationDirectory = os.path.join( craftTypeProfileDirectory, entryText ) + shutil.copytree( self.profileListboxSetting.getSelectedFolder(), destinationDirectory ) + self.profileListboxSetting.listSetting.setValueToFolders() + self.profileListboxSetting.value = entryText + self.profileListboxSetting.setStateToValue() + + def addSelectionWithEvent(self, event): + "Add the selection of a listbox setting, given an event." + self.addSelection() + + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.entry = settings.Tkinter.Entry( gridPosition.master ) + self.entry.bind('', self.addSelectionWithEvent ) + self.entry.grid( row = gridPosition.row, column = 1, columnspan = 3, sticky = settings.Tkinter.W ) + self.addButton = settings.Tkinter.Button( gridPosition.master, activebackground = 'black', activeforeground = 'white', text = 'Add Profile', command = self.addSelection ) + self.addButton.grid( row = gridPosition.row, column = 0 ) + + def getFromProfileListboxSettingRepository( self, profileListboxSetting, repository ): + "Initialize." + self.profileListboxSetting = profileListboxSetting + self.repository = repository + repository.displayEntities.append(self) + return self + + +class DeleteProfile( AddProfile ): + "A class to delete the selection of a listbox profile." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + gridPosition.increment() + self.deleteButton = settings.Tkinter.Button( gridPosition.master, activebackground = 'black', activeforeground = 'white', text = "Delete Profile", command = self.deleteSelection ) + self.deleteButton.grid( row = gridPosition.row, column = 0 ) + + def deleteSelection(self): + "Delete the selection of a listbox setting." + DeleteProfileDialog( self.profileListboxSetting, settings.Tkinter.Tk() ) + + +class DeleteProfileDialog: + "A dialog to delete a profile." + def __init__(self, profileListboxSetting, root): + "Display a delete dialog." + self.profileListboxSetting = profileListboxSetting + self.root = root + root.title('Delete Warning') + rowIndex = 0 + self.label = settings.Tkinter.Label(self.root, text = 'Do you want to delete the profile?') + self.label.grid(row = rowIndex, column = 0, columnspan = 3, sticky = settings.Tkinter.W) + rowIndex += 1 + columnIndex = 1 + deleteButton = settings.Tkinter.Button(root, activebackground = 'black', activeforeground = 'red', command = self.delete, fg = 'red', text = 'Delete') + deleteButton.grid(row = rowIndex, column = columnIndex) + columnIndex += 1 + noButton = settings.Tkinter.Button(root, activebackground = 'black', activeforeground = 'darkgreen', command = self.no, fg = 'darkgreen', text = 'Do Nothing') + noButton.grid(row = rowIndex, column = columnIndex) + + def delete(self): + "Delete the selection of a listbox setting." + self.profileListboxSetting.setToDisplay() + self.profileListboxSetting.listSetting.setValueToFolders() + if self.profileListboxSetting.value not in self.profileListboxSetting.listSetting.value: + return + lastSelectionIndex = 0 + currentSelectionTuple = self.profileListboxSetting.listbox.curselection() + if len(currentSelectionTuple) > 0: + lastSelectionIndex = int(currentSelectionTuple[0]) + else: + print('No profile is selected, so no profile will be deleted.') + return + craftTypeName = self.profileListboxSetting.listSetting.craftTypeName + settings.deleteDirectory(archive.getProfilesPath(craftTypeName), self.profileListboxSetting.value) + settings.deleteDirectory(settings.getProfilesDirectoryInAboveDirectory(craftTypeName), self.profileListboxSetting.value) + self.profileListboxSetting.listSetting.setValueToFolders() + if len(self.profileListboxSetting.listSetting.value) < 1: + defaultSettingsDirectory = archive.getProfilesPath(os.path.join(craftTypeName, self.profileListboxSetting.defaultValue)) + archive.makeDirectory(defaultSettingsDirectory) + self.profileListboxSetting.listSetting.setValueToFolders() + lastSelectionIndex = min(lastSelectionIndex, len(self.profileListboxSetting.listSetting.value) - 1) + self.profileListboxSetting.value = self.profileListboxSetting.listSetting.value[lastSelectionIndex] + self.profileListboxSetting.setStateToValue() + self.no() + + def no(self): + "The dialog was closed." + self.root.destroy() + + +class ProfileList: + "A class to list the profiles." + def getFromName( self, name, repository ): + "Initialize." + self.craftTypeName = repository.lowerName + self.name = name + self.repository = repository + self.setValueToFolders() + return self + + def setValueToFolders(self): + "Set the value to the folders in the profiles directories." + self.value = settings.getFolders( archive.getProfilesPath( self.craftTypeName ) ) + defaultFolders = settings.getFolders( settings.getProfilesDirectoryInAboveDirectory( self.craftTypeName ) ) + for defaultFolder in defaultFolders: + if defaultFolder not in self.value: + self.value.append( defaultFolder ) + self.value.sort() + + +class ProfileListboxSetting( settings.StringSetting ): + "A class to handle the profile listbox." + def addToDialog( self, gridPosition ): + "Add this to the dialog." +#http://www.pythonware.com/library/tkinter/introduction/x5453-patterns.htm + self.root = gridPosition.master + gridPosition.increment() + from fabmetheus_utilities.hidden_scrollbar import HiddenScrollbar + scrollbar = HiddenScrollbar( gridPosition.master ) + self.listbox = settings.Tkinter.Listbox( gridPosition.master, selectmode = settings.Tkinter.SINGLE, yscrollcommand = scrollbar.set ) + self.listbox.bind('', self.buttonReleaseOne ) + gridPosition.master.bind('', self.focusIn ) + scrollbar.config( command = self.listbox.yview ) + self.listbox.grid( row = gridPosition.row, column = 0, sticky = settings.Tkinter.N + settings.Tkinter.S ) + scrollbar.grid( row = gridPosition.row, column = 1, sticky = settings.Tkinter.N + settings.Tkinter.S ) + self.setStateToValue() + self.repository.saveListenerTable['updateProfileSaveListeners'] = updateProfileSaveListeners + + def buttonReleaseOne(self, event): + "Button one released." + self.setValueToIndex( self.listbox.nearest(event.y) ) + + def focusIn(self, event): + "The root has gained focus." + settings.getReadRepository(self.repository) + self.setStateToValue() + + def getFromListSetting( self, listSetting, name, repository, value ): + "Initialize." + self.getFromValueOnly( name, repository, value ) + self.listSetting = listSetting + repository.displayEntities.append(self) + repository.preferences.append(self) + return self + + def getSelectedFolder(self): + "Get the selected folder." + settingProfileSubfolder = settings.getSubfolderWithBasename( self.value, archive.getProfilesPath( self.listSetting.craftTypeName ) ) + if settingProfileSubfolder != None: + return settingProfileSubfolder + toolProfileSubfolder = settings.getSubfolderWithBasename( self.value, settings.getProfilesDirectoryInAboveDirectory( self.listSetting.craftTypeName ) ) + return toolProfileSubfolder + + def setStateToValue(self): + "Set the listbox items to the list setting." + self.listbox.delete( 0, settings.Tkinter.END ) + for item in self.listSetting.value: + self.listbox.insert( settings.Tkinter.END, item ) + if self.value == item: + self.listbox.select_set( settings.Tkinter.END ) + + def setToDisplay(self): + "Set the selection value to the listbox selection." + currentSelectionTuple = self.listbox.curselection() + if len( currentSelectionTuple ) > 0: + self.setValueToIndex( int( currentSelectionTuple[0] ) ) + + def setValueToIndex( self, index ): + "Set the selection value to the index." + valueString = self.listbox.get( index ) + self.setValueToString( valueString ) + + def setValueToString( self, valueString ): + "Set the value to the value string." + self.value = valueString + if self.getSelectedFolder() == None: + self.value = self.defaultValue + if self.getSelectedFolder() == None: + if len( self.listSetting.value ) > 0: + self.value = self.listSetting.value[0] + + +class ProfilePluginRadioButtonsSaveListener: + "A class to update the profile radio buttons." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + euclidean.addElementToListDictionaryIfNotThere( self, self.repository.repositoryDialog, settings.globalProfileSaveListenerListTable ) + + def getFromRadioPlugins( self, radioPlugins, repository ): + "Initialize." + self.name = 'ProfilePluginRadioButtonsSaveListener' + self.radioPlugins = radioPlugins + self.repository = repository + repository.displayEntities.append(self) + return self + + def save(self): + "Profile has been saved and profile radio plugins should be updated." + craftTypeName = getCraftTypeName() + for radioPlugin in self.radioPlugins: + if radioPlugin.name == craftTypeName: + if radioPlugin.setSelect(): + self.repository.pluginFrame.update() + return + + +class ProfileRepository: + "A class to handle the profile entities." + def __init__(self): + "Set the default entities, execute title & repository fileName." + settings.addListsToRepository('skeinforge_application.skeinforge_utilities.skeinforge_profile.html', self) + importantFileNames = ['extrusion'] + self.craftRadios = settings.getRadioPluginsAddPluginFrame( getPluginsDirectoryPath(), importantFileNames, getPluginFileNames(), self ) + ProfilePluginRadioButtonsSaveListener().getFromRadioPlugins( self.craftRadios, self ) + for craftRadio in self.craftRadios: + craftRadio.updateFunction = self.updateRelay + directoryName = archive.getProfilesPath() + archive.makeDirectory(directoryName) + self.windowPosition.value = '0+200' + + def updateRelay(self): + "Update the plugin frame then the ProfileSaveListeners." + self.pluginFrame.update() + updateProfileSaveListeners() + + +class ProfileSelectionMenuRadio: + "A class to display a profile selection menu radio button." + def addToDialog( self, gridPosition ): + "Add this to the dialog." + self.activate = False + self.menuButtonDisplay.setToNameAddToDialog( self.valueName, gridPosition ) + self.menuButtonDisplay.menu.add_radiobutton( label = self.valueName, command = self.clickRadio, value = self.valueName, variable = self.menuButtonDisplay.radioVar ) + self.menuLength = self.menuButtonDisplay.menu.index( settings.Tkinter.END ) + if self.value: + self.menuButtonDisplay.radioVar.set( self.valueName ) + self.menuButtonDisplay.menu.invoke( self.menuLength ) + euclidean.addElementToListDictionaryIfNotThere( self.repository, self.repository.repositoryDialog, settings.globalProfileSaveListenerListTable ) + self.activate = True + + def clickRadio(self): + "Workaround for Tkinter bug, invoke and set the value when clicked." + if not self.activate: + return + settings.saveAll() + self.menuButtonDisplay.radioVar.set( self.valueName ) + pluginModule = getCraftTypePluginModule() + profilePluginSettings = settings.getReadRepository( pluginModule.getNewRepository() ) + profilePluginSettings.profileListbox.value = self.name + settings.writeSettings( profilePluginSettings ) + updateProfileSaveListeners() + + def getFromMenuButtonDisplay( self, menuButtonDisplay, name, repository, value ): + "Initialize." + self.setToMenuButtonDisplay( menuButtonDisplay, name, repository, value ) + self.valueName = name.replace('_', ' ') + return self + + def setToMenuButtonDisplay( self, menuButtonDisplay, name, repository, value ): + "Initialize." + self.menuButtonDisplay = menuButtonDisplay + self.menuButtonDisplay.menuRadios.append(self) + self.name = name + self.repository = repository + self.value = value + repository.displayEntities.append(self) + + +class ProfileTypeMenuRadio( ProfileSelectionMenuRadio ): + "A class to display a profile type menu radio button." + def clickRadio(self): + "Workaround for Tkinter bug, invoke and set the value when clicked." + if not self.activate: + return + settings.saveAll() + self.menuButtonDisplay.radioVar.set( self.valueName ) + profileSettings = getReadProfileRepository() + plugins = profileSettings.craftRadios + for plugin in plugins: + plugin.value = ( plugin.name == self.name ) + settings.writeSettings( profileSettings ) + updateProfileSaveListeners() + + def getFromMenuButtonDisplay( self, menuButtonDisplay, name, repository, value ): + "Initialize." + self.setToMenuButtonDisplay( menuButtonDisplay, name, repository, value ) + self.valueName = settings.getEachWordCapitalized( name ) + return self diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_profile.pyc b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_profile.pyc new file mode 100644 index 0000000..275d81a Binary files /dev/null and b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/skeinforge_utilities/skeinforge_profile.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/terminal.sh b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/terminal.sh new file mode 100644 index 0000000..3826bf6 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/terminal.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Script to open the bash terminal in this directory. +# +# Usage: set the executable property to true if it isn't already. Then double click the file. +# +echo 'Directory listing:' +echo '' +ls +echo '' +echo 'To run a python script (.py) listed above, try typing something like:' +echo 'python filename' +echo '' +echo 'For example, in the skeinforge_application directory you could run skeinforge by typing:' +echo 'python skeinforge.py' +echo '' +echo 'To skeinforge the test.stl file from the command line, in the skeinforge_application directory you could type:' +echo 'python skeinforge.py test.stl' +echo '' +echo 'To run a script in a subdirectory, append the directory path. For example, to run skeinforge from the top directory you could type:' +echo 'python skeinforge_application/skeinforge.py' +echo '' +bash + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/test.stl b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/test.stl new file mode 100644 index 0000000..f372a18 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/skeinforge_application/test.stl @@ -0,0 +1,2886 @@ +solid "Screw_Holder_Bottom"; Produced by Art of Illusion 2.4, Fri Oct 16 16:42:04 PDT 2009 +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 24.730643081307 0 + vertex 14.883210818105 25.830303993361 0 + vertex 15.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 23 0 + vertex 54.002309837942 24.730643081307 0 + vertex 60 40 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 48.011309837942 15.269356918694 0 + vertex 54.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 15.830303993361 11.883210818105 0 + vertex 16.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 43.737436867076 27.737436867076 0 + vertex 43.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 43.169696006639 15.116789181895 0 + vertex 42.5 15.25 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 54.002309837942 24.730643081307 0 + vertex 48.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 43.169696006639 28.116789181895 0 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 40 0 + vertex 52 30 0 + vertex 52 40 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 14.169696006639 0 + vertex 14.75 13.5 0 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 27.169696006639 0 + vertex 14.042553191489 30 0 + vertex 15.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 16.5 11.75 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 17.169696006639 28.116789181895 0 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 14.75 13.5 0 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 17 0 + vertex 60 17 0 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 42.5 11.75 0 + vertex 43.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 15.262563132924 14.737436867076 0 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 14.464705848856 10 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 15.830303993361 28.116789181895 0 + vertex 15.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 15.262563132924 12.262563132924 0 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 16.5 28.25 0 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 60 23 0 + vertex 54.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 23 0 + vertex 16.5 24.75 0 + vertex 17.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.75 26.5 0 + vertex 12.002309837942 24.730643081307 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 60 40 0 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.422110817733 17 0 + vertex 48.011309837942 17 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 13.5 0 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 6.011309837942 17 0 + vertex 6.011309837942 15.269356918694 0 + vertex 0 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.422110817733 17 0 + vertex 41.830303993361 15.116789181895 0 + vertex 41.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 17.737436867076 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 0 10 0 + vertex 0 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 25.830303993361 0 + vertex 12.002309837942 24.730643081307 0 + vertex 14.75 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 52 30 0 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 17 0 + vertex 43.737436867076 14.737436867076 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 15.25 0 + vertex 41.830303993361 15.116789181895 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 14.883210818105 12.830303993361 0 + vertex 6.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 23 0 + vertex 0 30 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 6.011309837942 15.269356918694 0 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 60 17 0 + vertex 52 10 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 23 0 + vertex 0 23 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 48.011309837942 15.269356918694 0 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 27.169696006639 0 + vertex 41.262563132924 25.262563132924 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 25.830303993361 0 + vertex 18.25 26.5 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 14.737436867076 0 + vertex 41.262563132924 14.737436867076 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 25.262563132924 0 + vertex 18.116789181895 25.830303993361 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 18.116789181895 12.830303993361 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 41.262563132924 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0 + vertex 41.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 11.75 0 + vertex 14.464705848856 10 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.25 26.5 0 + vertex 44.116789181895 27.169696006639 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 12.830303993361 0 + vertex 41.262563132924 12.262563132924 0 + vertex 17.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 17.737436867076 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 12.830303993361 0 + vertex 44.25 13.5 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 12.830303993361 0 + vertex 40.75 13.5 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.25 13.5 0 + vertex 18.116789181895 14.169696006639 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 14.737436867076 0 + vertex 17.737436867076 14.737436867076 0 + vertex 17.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 14.169696006639 0 + vertex 17.737436867076 14.737436867076 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 44.25 26.5 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 14.75 13.5 0.77775 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.75 13.5 0.77775 + vertex 14.75 13.5 0 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 41.830303993361 28.116789181895 0 + vertex 42.5 28.25 0.77775 + vertex 41.830303993361 28.116789181895 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.830303993361 24.883210818105 0.77775 + vertex 15.830303993361 24.883210818105 0 + vertex 15.262563132924 25.262563132924 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 28.25 0 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 16.5 28.25 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 43.169696006639 24.883210818105 0 + vertex 42.5 24.75 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 28.25 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 15.830303993361 28.116789181895 0.77775 + vertex 15.830303993361 28.116789181895 0 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 23 0 + vertex 6.011309837942 23 0.77775 + vertex 0 23 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 60 0 0.77775 + vertex 52 10 0.77775 + vertex 52 0 0.77775 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.75 26.5 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.169696006639 24.883210818105 0 + vertex 16.5 24.75 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 0 0 + vertex 52 0 0.77775 + vertex 52 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.883210818105 12.830303993361 0.77775 + vertex 40.75 13.5 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 24.75 0 + vertex 41.830303993361 24.883210818105 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 0 0 + vertex 60 0 0.77775 + vertex 52 0 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 28.116789181895 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.262563132924 27.737436867076 0 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 17 0 + vertex 0 17 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 17 0 + vertex 48.011309837942 17 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 18.25 26.5 0 + vertex 18.25 26.5 0.77775 + vertex 18.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.455907969142 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 44.25 26.5 0 + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 10 0 + vertex 15.306548743796 10 0.77775 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 25.830303993361 0 + vertex 40.75 26.5 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 43.737436867076 27.737436867076 0.77775 + vertex 44.116789181895 27.169696006639 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 43.737436867076 27.737436867076 0 + vertex 44.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 10 0 + vertex 52 10 0.77775 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 23 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 26.5 0 + vertex 14.883210818105 25.830303993361 0.77775 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 6.011309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 18.116789181895 14.169696006639 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 17.737436867076 14.737436867076 0 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 42.5 15.25 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 41.830303993361 15.116789181895 0.77775 + vertex 41.830303993361 15.116789181895 0 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 14.883210818105 14.169696006639 0.77775 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 14.883210818105 14.169696006639 0 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 43.169696006639 15.116789181895 0 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 13.5 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.75 13.5 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 11.75 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 43.169696006639 11.883210818105 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 17.169696006639 15.116789181895 0 + vertex 17.737436867076 14.737436867076 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.730643081307 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 0 23 0 + vertex 6.011309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 48.011309837942 23 0 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 10 0 + vertex 6.011309837942 15.269356918694 0 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 -0 + outer loop + vertex 17.169696006639 28.116789181895 0.77775 + vertex 16.5 28.25 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 44.116789181895 27.169696006639 0 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.25 26.5 0 + vertex 44.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.75 26.5 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 40.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 17.169696006639 11.883210818105 0 + vertex 16.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 52 30 0.77775 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 15.063011877768 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.75 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 24.883210818105 0.77775 + vertex 42.5 24.75 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 24.730643081307 0 + vertex 14.883210818105 27.169696006639 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.169696006639 15.116789181895 0 + vertex 43.737436867076 14.737436867076 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 43.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 42.5 15.25 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 23 0.77775 + vertex 0 30 0 + vertex 0 23 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 30 0 + vertex 0 23 0.77775 + vertex 0 30 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 10 0 + vertex 52 0 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 17.169696006639 11.883210818105 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.169696006639 28.116789181895 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 42.5 28.25 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 14.042553191489 30 0 + vertex 41.866228156844 30 0.77775 + vertex 52 30 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 42.5 11.75 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.830303993361 11.883210818105 0 + vertex 15.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 27.169696006639 0 + vertex 40.883210818105 25.830303993361 0 + vertex 41.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 17.169696006639 28.116789181895 0 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 25.830303993361 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 15.262563132924 25.262563132924 0.77775 + vertex 15.262563132924 25.262563132924 0 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 43.737436867076 27.737436867076 0 + vertex 52 30 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 25.830303993361 0 + vertex 18.116789181895 25.830303993361 0.77775 + vertex 18.25 26.5 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 15.063011877768 0.77775 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 15.116789181895 0 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 43.169696006639 28.116789181895 0.77775 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.169696006639 28.116789181895 0.77775 + vertex 43.169696006639 28.116789181895 0 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 42.5 11.75 0.77775 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 41.262563132924 14.737436867076 0 + vertex 41.830303993361 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 17 0 + vertex 60 0 0 + vertex 52 0 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 23 0 + vertex 17.379510917074 23 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 41.830303993361 11.883210818105 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 14.042553191489 30 0 + vertex 52 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 18.116789181895 27.169696006639 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.75 26.5 0 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.75 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 0 30 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 11.75 0.77775 + vertex 43.169696006639 11.883210818105 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + vertex 16.5 28.25 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 30 0.77775 + vertex 52 30 0 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 17 0 + vertex 52 0 0 + vertex 52 10 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 0 + outer loop + vertex 44.116789181895 14.169696006639 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.737436867076 14.737436867076 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 17 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 16.5 24.75 0 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 0 17 0 + vertex 0 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 16.5 28.25 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 17.737436867076 25.262563132924 0 + vertex 17.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 24.75 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 17.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 44.116789181895 27.169696006639 0 + vertex 44.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.75 13.5 0 + vertex 18.25 13.5 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 48.011309837942 24.730643081307 0 + vertex 48.011309837942 23 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 10 0.77775 + vertex 0 10 0 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.306548743796 10 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 28.116789181895 0 + vertex 43.169696006639 28.116789181895 0.77775 + vertex 42.5 28.25 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 16.5 11.75 0 + vertex 16.5 11.75 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.737436867076 25.262563132924 0 + vertex 17.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 10 0.77775 + vertex 14.464705848856 10 0 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 17.737436867076 14.737436867076 0 + vertex 17.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.830303993361 11.883210818105 0 + vertex 15.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.75 26.5 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 44.116789181895 14.169696006639 0.77775 + vertex 43.737436867076 14.737436867076 0 + vertex 44.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 60 17 0.77775 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.830303993361 24.883210818105 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.25 26.5 0.77775 + vertex 18.25 26.5 0 + vertex 18.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 25.262563132924 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 17.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 15.455907969142 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.306548743796 10 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.737436867076 25.262563132924 0.77775 + vertex 17.737436867076 25.262563132924 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 42.5 28.25 0.77775 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.25 13.5 0.77775 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 60 17 0.77775 + vertex 60 17 0 + vertex 54.002309837942 17 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 12.002309837942 17 0 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 11.883210818105 0 + vertex 43.737436867076 12.262563132924 0.77775 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 11.883210818105 0 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 14.169696006639 0 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 41.830303993361 28.116789181895 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 23 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 16.5 15.25 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 17.737436867076 12.262563132924 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 40 0.77775 + vertex 60 23 0.77775 + vertex 60 40 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.75 13.5 0 + vertex 18.116789181895 12.830303993361 0 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 28.116789181895 0 + vertex 42.5 28.25 0.77775 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 12.002309837942 23 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 23 0.77775 + vertex 60 23 0.77775 + vertex 54.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 24.730643081307 0 + vertex 6.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 17.169696006639 15.116789181895 0 + vertex 16.5 15.25 0.77775 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 17 0.77775 + vertex 60 0 0 + vertex 60 17 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 0 0.77775 + vertex 60 0 0 + vertex 60 17 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 17.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 42.5 28.25 0.77775 + vertex 41.830303993361 28.116789181895 0 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 17 0 + vertex 6.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 25.830303993361 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 41.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.25 13.5 0 + vertex 18.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 25.262563132924 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 18.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 30 0.77775 + vertex 6.011309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 37.474084379442 23 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 40.883210818105 14.169696006639 0 + vertex 41.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 43.169696006639 24.883210818105 0 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 25.830303993361 0 + vertex 44.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 60 17 0.77775 + vertex 54.002309837942 17 0 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 42.5 24.75 0 + vertex 43.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 44.116789181895 27.169696006639 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 18.116789181895 25.830303993361 0 + vertex 17.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 17 0.77775 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.75 26.5 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 0 0.77775 + vertex 52 0 0 + vertex 60 0 0.77775 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.75 26.5 0.77775 + vertex 14.75 26.5 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 54.002309837942 17 0.77775 + vertex 54.002309837942 17 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 17.169696006639 11.883210818105 0.77775 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 17.169696006639 15.116789181895 0 + vertex 17.169696006639 15.116789181895 0.77775 + vertex 16.5 15.25 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 16.5 11.75 0.77775 + vertex 16.5 11.75 0 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.269356918694 0 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 52 30 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 24.75 0.77775 + vertex 43.169696006639 24.883210818105 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 26.5 0 + vertex 14.75 26.5 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 43.737436867076 14.737436867076 0 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 48.011309837942 17 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 41.830303993361 24.883210818105 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 42.5 24.75 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 40 0 + vertex 52 40 0.77775 + vertex 60 40 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 40 0 + vertex 60 40 0.77775 + vertex 60 40 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 15.830303993361 24.883210818105 0.77775 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 16.5 24.75 0.77775 + vertex 16.5 24.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 24.936988122232 0.77775 + vertex 12.002309837942 23 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 24.936988122232 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 40 0.77775 + vertex 60 23 0.77775 + vertex 60 23 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 40 0.77775 + vertex 60 23 0 + vertex 60 40 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 27.737436867076 0 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 27.737436867076 0 + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 37.474084379442 23 0.77775 + vertex 48.011309837942 23 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 37.474084379442 23 0.77775 + vertex 42.5 24.75 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 14.737436867076 0 + vertex 12.002309837942 17 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 15.116789181895 0.77775 + vertex 42.5 15.25 0.77775 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 -0 + outer loop + vertex 43.169696006639 15.116789181895 0.77775 + vertex 42.5 15.25 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 52 10 0.77775 + vertex 60 0 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 60 0 0.77775 + vertex 60 17 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 12.830303993361 0.77775 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 12.830303993361 0 + vertex 40.75 13.5 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.737436867076 27.737436867076 0 + vertex 17.737436867076 27.737436867076 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.737436867076 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 0 30 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 14.75 26.5 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 12.262563132924 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 12.262563132924 0.77775 + vertex 44.116789181895 12.830303993361 0 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 48.011309837942 23 0.77775 + vertex 37.474084379442 23 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.830303993361 15.116789181895 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.830303993361 15.116789181895 0 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 41.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 41.262563132924 12.262563132924 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 16.5 15.25 0 + vertex 15.830303993361 15.116789181895 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 25.262563132924 0 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 44.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 25.262563132924 0 + vertex 44.116789181895 25.830303993361 0.77775 + vertex 44.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.75 13.5 0.77775 + vertex 40.75 13.5 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.75 13.5 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 23 0 + vertex 60 23 0.77775 + vertex 54.002309837942 23 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 23 0 + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 30 0 + vertex 14.042553191489 30 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 30 0 + vertex 14.883210818105 27.169696006639 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.262563132924 25.262563132924 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0.77775 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + vertex 41.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.262563132924 27.737436867076 0 + vertex 41.830303993361 28.116789181895 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 24.883210818105 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 24.883210818105 0.77775 + vertex 43.737436867076 25.262563132924 0 + vertex 43.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 43.169696006639 11.883210818105 0 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 43.737436867076 12.262563132924 0 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 60 23 0.77775 + vertex 52 40 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 52 40 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 41.422110817733 17 0 + vertex 12.002309837942 17 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.730643081307 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 12.002309837942 17 0.77775 + vertex 14.883210818105 14.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 25.830303993361 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 17 0.77775 + vertex 0 10 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 17 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + vertex 6.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 42.5 15.25 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 42.5 15.25 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 14.75 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 0 30 0.77775 + vertex 0 23 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 0 23 0.77775 + vertex 6.011309837942 23 0.77775 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 40.75 26.5 0 + vertex 40.883210818105 25.830303993361 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 44.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 14.169696006639 0 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 17.737436867076 12.262563132924 0.77775 + vertex 18.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 10 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 54.002309837942 24.936988122232 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 48.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 43.737436867076 12.262563132924 0 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 44.116789181895 12.830303993361 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 0 30 0 + vertex 0 30 0.77775 + vertex 14.607403236621 30 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 0 30 0 + vertex 14.607403236621 30 0.77775 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 12.262563132924 0 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 41.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0.77775 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 10 0 + vertex 0 10 0.77775 + vertex 0 17 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 10 0 + vertex 0 17 0.77775 + vertex 0 17 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.25 13.5 0.77775 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.25 13.5 0 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 41.422110817733 17 0 + vertex 34.416922535211 17 0.77775 + vertex 48.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 41.422110817733 17 0 + vertex 48.011309837942 17 0.77775 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 30 0.77775 + vertex 52 40 0.77775 + vertex 52 40 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 30 0.77775 + vertex 52 40 0 + vertex 52 30 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 16.5 24.75 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 40.883210818105 27.169696006639 0 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 17.737436867076 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 0 10 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 15.830303993361 24.883210818105 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 12.002309837942 23 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 25.830303993361 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 40.75 26.5 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 18.116789181895 27.169696006639 0 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 41.262563132924 14.737436867076 0 + vertex 17.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 17.169696006639 15.116789181895 0 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 15.116789181895 0 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 15.116789181895 0 + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0 + vertex 41.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 37.474084379442 23 0.77775 + vertex 17.379510917074 23 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 17.379510917074 23 0.77775 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 15.830303993361 15.116789181895 0 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 15.262563132924 14.737436867076 0 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 40.883210818105 25.830303993361 0.77775 + vertex 41.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 41.262563132924 25.262563132924 0.77775 + vertex 41.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 15.262563132924 12.262563132924 0 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 14.464705848856 10 0 + vertex 0 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 44.25 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 44.25 26.5 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 24.936988122232 0.77775 + vertex 54.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 14.607403236621 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 14.607403236621 30 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 14.169696006639 0.77775 + vertex 18.25 13.5 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.25 26.5 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 18.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 54.002309837942 23 0 + vertex 54.002309837942 23 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 18.25 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 42.5 11.75 0.77775 + vertex 41.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 52 10 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.25 26.5 0.77775 + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 40.75 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 40.75 26.5 0.77775 + vertex 18.25 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + endloop +endfacet +endsolid diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/terminal.sh b/ReplicatorG/skein_engines/skeinforge-44-Python3/terminal.sh new file mode 100644 index 0000000..bc7d246 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/terminal.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# +# Script to open the bash terminal in this directory. +# +# Usage: set the executable property to true if it isn't already. Then double click the file. +# +echo 'Directory listing:' +echo '' +ls +echo '' +echo 'To run a python script (.py) listed above, try typing something like:' +echo 'python filename' +echo '' +echo 'For example, in the skeinforge directory you could run skeinforge.py by typing:' +echo 'python skeinforge.py' +echo '' +echo 'To skeinforge the test.stl file from the command line, in the skeinforge directory you could type:' +echo 'python skeinforge.py test.stl' +echo '' +bash + diff --git a/ReplicatorG/skein_engines/skeinforge-44-Python3/test.stl b/ReplicatorG/skein_engines/skeinforge-44-Python3/test.stl new file mode 100644 index 0000000..f372a18 --- /dev/null +++ b/ReplicatorG/skein_engines/skeinforge-44-Python3/test.stl @@ -0,0 +1,2886 @@ +solid "Screw_Holder_Bottom"; Produced by Art of Illusion 2.4, Fri Oct 16 16:42:04 PDT 2009 +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 24.730643081307 0 + vertex 14.883210818105 25.830303993361 0 + vertex 15.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 23 0 + vertex 54.002309837942 24.730643081307 0 + vertex 60 40 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 48.011309837942 15.269356918694 0 + vertex 54.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 15.830303993361 11.883210818105 0 + vertex 16.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 43.737436867076 27.737436867076 0 + vertex 43.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 43.169696006639 15.116789181895 0 + vertex 42.5 15.25 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 54.002309837942 24.730643081307 0 + vertex 48.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 43.169696006639 28.116789181895 0 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 40 0 + vertex 52 30 0 + vertex 52 40 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 14.169696006639 0 + vertex 14.75 13.5 0 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 27.169696006639 0 + vertex 14.042553191489 30 0 + vertex 15.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 16.5 11.75 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 17.169696006639 28.116789181895 0 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 14.75 13.5 0 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 17 0 + vertex 60 17 0 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 42.5 11.75 0 + vertex 43.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 15.262563132924 14.737436867076 0 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 14.464705848856 10 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 15.830303993361 28.116789181895 0 + vertex 15.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.464705848856 10 0 + vertex 15.262563132924 12.262563132924 0 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.042553191489 30 0 + vertex 16.5 28.25 0 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 60 23 0 + vertex 54.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 23 0 + vertex 16.5 24.75 0 + vertex 17.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.75 26.5 0 + vertex 12.002309837942 24.730643081307 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 30 0 + vertex 60 40 0 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.422110817733 17 0 + vertex 48.011309837942 17 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 13.5 0 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 6.011309837942 17 0 + vertex 6.011309837942 15.269356918694 0 + vertex 0 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.422110817733 17 0 + vertex 41.830303993361 15.116789181895 0 + vertex 41.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 17.737436867076 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 0 10 0 + vertex 0 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 25.830303993361 0 + vertex 12.002309837942 24.730643081307 0 + vertex 14.75 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 52 30 0 + vertex 54.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 17 0 + vertex 43.737436867076 14.737436867076 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 15.25 0 + vertex 41.830303993361 15.116789181895 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 14.883210818105 12.830303993361 0 + vertex 6.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 23 0 + vertex 0 30 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0.831469612301 0.555570233022 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 6.011309837942 15.269356918694 0 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 60 17 0 + vertex 52 10 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 23 0 + vertex 0 23 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 48.011309837942 15.269356918694 0 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 27.169696006639 0 + vertex 41.262563132924 25.262563132924 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 25.830303993361 0 + vertex 18.25 26.5 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 14.737436867076 0 + vertex 41.262563132924 14.737436867076 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 25.262563132924 0 + vertex 18.116789181895 25.830303993361 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 18.116789181895 12.830303993361 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 41.262563132924 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0 + vertex 41.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 11.75 0 + vertex 14.464705848856 10 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.25 26.5 0 + vertex 44.116789181895 27.169696006639 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 12.830303993361 0 + vertex 41.262563132924 12.262563132924 0 + vertex 17.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 17.737436867076 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 12.830303993361 0 + vertex 44.25 13.5 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 12.830303993361 0 + vertex 40.75 13.5 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.25 13.5 0 + vertex 18.116789181895 14.169696006639 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 14.737436867076 0 + vertex 17.737436867076 14.737436867076 0 + vertex 17.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 14.169696006639 0 + vertex 17.737436867076 14.737436867076 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 44.25 26.5 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 14.75 13.5 0.77775 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.75 13.5 0.77775 + vertex 14.75 13.5 0 + vertex 14.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 41.830303993361 28.116789181895 0 + vertex 42.5 28.25 0.77775 + vertex 41.830303993361 28.116789181895 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.830303993361 24.883210818105 0.77775 + vertex 15.830303993361 24.883210818105 0 + vertex 15.262563132924 25.262563132924 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 28.25 0 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 16.5 28.25 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 43.169696006639 24.883210818105 0 + vertex 42.5 24.75 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 28.25 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 15.830303993361 28.116789181895 0.77775 + vertex 15.830303993361 28.116789181895 0 + vertex 16.5 28.25 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 23 0 + vertex 6.011309837942 23 0.77775 + vertex 0 23 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 60 0 0.77775 + vertex 52 10 0.77775 + vertex 52 0 0.77775 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.75 26.5 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.169696006639 24.883210818105 0 + vertex 16.5 24.75 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 0 0 + vertex 52 0 0.77775 + vertex 52 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.883210818105 12.830303993361 0.77775 + vertex 40.75 13.5 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 24.75 0 + vertex 41.830303993361 24.883210818105 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 0 0 + vertex 60 0 0.77775 + vertex 52 0 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 28.116789181895 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.262563132924 27.737436867076 0 + vertex 15.830303993361 28.116789181895 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 17 0 + vertex 0 17 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 17 0 + vertex 48.011309837942 17 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 18.25 26.5 0 + vertex 18.25 26.5 0.77775 + vertex 18.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.455907969142 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 44.25 26.5 0 + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 10 0 + vertex 15.306548743796 10 0.77775 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 25.830303993361 0 + vertex 40.75 26.5 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 43.737436867076 27.737436867076 0.77775 + vertex 44.116789181895 27.169696006639 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 43.737436867076 27.737436867076 0 + vertex 44.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 10 0 + vertex 52 10 0.77775 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 23 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 26.5 0 + vertex 14.883210818105 25.830303993361 0.77775 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 6.011309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 18.116789181895 14.169696006639 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 17.737436867076 14.737436867076 0 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 42.5 15.25 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 41.830303993361 15.116789181895 0.77775 + vertex 41.830303993361 15.116789181895 0 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 14.883210818105 14.169696006639 0.77775 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 14.883210818105 14.169696006639 0 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 43.169696006639 15.116789181895 0 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 13.5 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.75 13.5 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 11.75 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 43.169696006639 11.883210818105 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 17.169696006639 15.116789181895 0 + vertex 17.737436867076 14.737436867076 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.730643081307 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 0 23 0 + vertex 6.011309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 48.011309837942 23 0 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 10 0 + vertex 6.011309837942 15.269356918694 0 + vertex 14.883210818105 12.830303993361 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 -0 + outer loop + vertex 17.169696006639 28.116789181895 0.77775 + vertex 16.5 28.25 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 44.116789181895 27.169696006639 0 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.25 26.5 0 + vertex 44.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.75 26.5 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 40.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 14.169696006639 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 17.169696006639 11.883210818105 0 + vertex 16.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 52 30 0.77775 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 15.063011877768 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 14.75 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 24.883210818105 0.77775 + vertex 42.5 24.75 0 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 6.011309837942 24.730643081307 0 + vertex 14.883210818105 27.169696006639 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.169696006639 15.116789181895 0 + vertex 43.737436867076 14.737436867076 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 43.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 42.5 15.25 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 23 0.77775 + vertex 0 30 0 + vertex 0 23 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 30 0 + vertex 0 23 0.77775 + vertex 0 30 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 10 0 + vertex 52 0 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 17.169696006639 11.883210818105 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.169696006639 28.116789181895 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 42.5 28.25 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 14.042553191489 30 0 + vertex 41.866228156844 30 0.77775 + vertex 52 30 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 42.5 11.75 0 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.830303993361 11.883210818105 0 + vertex 15.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 18.116789181895 27.169696006639 0 + vertex 40.883210818105 25.830303993361 0 + vertex 41.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 17.169696006639 28.116789181895 0 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 25.830303993361 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 15.262563132924 25.262563132924 0.77775 + vertex 15.262563132924 25.262563132924 0 + vertex 14.883210818105 25.830303993361 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 24.730643081307 0 + vertex 43.737436867076 27.737436867076 0 + vertex 52 30 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 25.830303993361 0 + vertex 18.116789181895 25.830303993361 0.77775 + vertex 18.25 26.5 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 15.063011877768 0.77775 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 15.116789181895 0 + vertex 41.830303993361 15.116789181895 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 43.169696006639 28.116789181895 0.77775 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 -0 + outer loop + vertex 43.169696006639 28.116789181895 0.77775 + vertex 43.169696006639 28.116789181895 0 + vertex 43.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 42.5 11.75 0.77775 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 41.262563132924 14.737436867076 0 + vertex 41.830303993361 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 17 0 + vertex 60 0 0 + vertex 52 0 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 23 0 + vertex 17.379510917074 23 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 11.883210818105 0 + vertex 41.830303993361 11.883210818105 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 14.042553191489 30 0 + vertex 52 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 18.116789181895 27.169696006639 0 + vertex 18.25 26.5 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.75 26.5 0 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.75 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 0 30 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 11.75 0.77775 + vertex 43.169696006639 11.883210818105 0 + vertex 42.5 11.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 15.830303993361 28.116789181895 0.77775 + vertex 16.5 28.25 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 30 0.77775 + vertex 52 30 0 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 60 17 0 + vertex 52 0 0 + vertex 52 10 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 0 + outer loop + vertex 44.116789181895 14.169696006639 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 43.737436867076 14.737436867076 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.269356918694 0 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 17 0 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 16.5 24.75 0 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 0 17 0 + vertex 0 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 16.5 28.25 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 17.737436867076 25.262563132924 0 + vertex 17.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 24.75 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 17.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 44.116789181895 27.169696006639 0 + vertex 44.25 26.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.75 13.5 0 + vertex 18.25 13.5 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 25.830303993361 0 + vertex 48.011309837942 24.730643081307 0 + vertex 48.011309837942 23 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 10 0.77775 + vertex 0 10 0 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.306548743796 10 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 28.116789181895 0 + vertex 43.169696006639 28.116789181895 0.77775 + vertex 42.5 28.25 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 17.169696006639 11.883210818105 0.77775 + vertex 16.5 11.75 0 + vertex 16.5 11.75 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + vertex 18.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.737436867076 25.262563132924 0 + vertex 17.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 0 10 0.77775 + vertex 14.464705848856 10 0 + vertex 15.306548743796 10 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 17.737436867076 14.737436867076 0 + vertex 17.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.830303993361 11.883210818105 0 + vertex 15.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.75 26.5 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 44.116789181895 14.169696006639 0.77775 + vertex 43.737436867076 14.737436867076 0 + vertex 44.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 60 17 0.77775 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 23 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 15.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.830303993361 24.883210818105 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.25 26.5 0.77775 + vertex 18.25 26.5 0 + vertex 18.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 25.262563132924 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.607403236621 30 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + vertex 15.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 17.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 14.737436867076 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 15.455907969142 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.306548743796 10 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.737436867076 25.262563132924 0.77775 + vertex 17.737436867076 25.262563132924 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 42.5 28.25 0.77775 + vertex 41.866228156844 30 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.25 13.5 0.77775 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 60 17 0.77775 + vertex 60 17 0 + vertex 54.002309837942 17 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 12.002309837942 17 0 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 11.883210818105 0 + vertex 43.737436867076 12.262563132924 0.77775 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 11.883210818105 0 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 14.169696006639 0 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 42.5 28.25 0 + vertex 41.830303993361 28.116789181895 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 23 0 + vertex 48.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 15.116789181895 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 16.5 15.25 0.77775 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 17.737436867076 12.262563132924 0 + vertex 17.169696006639 11.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 40 0.77775 + vertex 60 23 0.77775 + vertex 60 40 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.75 13.5 0 + vertex 18.116789181895 12.830303993361 0 + vertex 18.25 13.5 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 28.116789181895 0 + vertex 42.5 28.25 0.77775 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 12.002309837942 23 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 23 0.77775 + vertex 60 23 0.77775 + vertex 54.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 23 0.77775 + vertex 6.011309837942 24.730643081307 0 + vertex 6.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 17.169696006639 15.116789181895 0 + vertex 16.5 15.25 0.77775 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 17 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + vertex 6.011309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 17 0.77775 + vertex 60 0 0 + vertex 60 17 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 0 0.77775 + vertex 60 0 0 + vertex 60 17 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.830303993361 11.883210818105 0.77775 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 12.002309837942 15.195826430941 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.169696006639 24.883210818105 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 17.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 43.737436867076 12.262563132924 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 42.5 28.25 0.77775 + vertex 41.830303993361 28.116789181895 0 + vertex 42.5 28.25 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 6.011309837942 15.269356918694 0 + vertex 6.011309837942 17 0 + vertex 6.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 25.830303993361 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 41.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.25 13.5 0 + vertex 18.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 25.262563132924 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 18.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 34.416922535211 17 0.77775 + vertex 41.262563132924 14.737436867076 0.77775 + vertex 41.830303993361 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 30 0.77775 + vertex 6.011309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 17.379510917074 23 0.77775 + vertex 37.474084379442 23 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 52 10 0.77775 + vertex 43.169696006639 11.883210818105 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 14.737436867076 0.77775 + vertex 40.883210818105 14.169696006639 0 + vertex 41.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 43.169696006639 24.883210818105 0 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 25.830303993361 0 + vertex 44.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 60 17 0.77775 + vertex 54.002309837942 17 0 + vertex 54.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 48.011309837942 23 0 + vertex 42.5 24.75 0 + vertex 43.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 43.737436867076 27.737436867076 0.77775 + vertex 44.116789181895 27.169696006639 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 18.116789181895 25.830303993361 0 + vertex 17.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.195826430941 0.110046151702 + vertex 54.002309837942 17 0.77775 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.75 26.5 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 52 0 0.77775 + vertex 52 0 0 + vertex 60 0 0.77775 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.75 26.5 0.77775 + vertex 14.75 26.5 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 54.002309837942 17 0.77775 + vertex 54.002309837942 17 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 16.5 11.75 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 17.169696006639 11.883210818105 0.77775 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 17.169696006639 15.116789181895 0 + vertex 17.169696006639 15.116789181895 0.77775 + vertex 16.5 15.25 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 12.002309837942 15.195826430941 0.110046151702 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.195826430941 0.110046151702 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 16.5 11.75 0.77775 + vertex 16.5 11.75 0 + vertex 15.830303993361 11.883210818105 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 48.011309837942 15.269356918694 0 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 52 30 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal -0.195090322016 0.980785280403 0 + outer loop + vertex 42.5 24.75 0.77775 + vertex 43.169696006639 24.883210818105 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 14.75 26.5 0 + vertex 14.75 26.5 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 43.737436867076 14.737436867076 0 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 44.116789181895 14.169696006639 0 + vertex 48.011309837942 17 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 41.830303993361 24.883210818105 0 + vertex 42.5 24.75 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 17.169696006639 24.883210818105 0 + vertex 42.5 24.75 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 40 0 + vertex 52 40 0.77775 + vertex 60 40 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 52 40 0 + vertex 60 40 0.77775 + vertex 60 40 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal -0.831469612302 -0.555570233021 -0 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 15.830303993361 24.883210818105 0.77775 + vertex 16.5 24.75 0.77775 + endloop +endfacet +facet normal 0.195090322016 0.980785280403 0 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 16.5 24.75 0.77775 + vertex 16.5 24.75 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 24.936988122232 0.77775 + vertex 12.002309837942 23 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 12.002309837942 24.936988122232 0.77775 + vertex 15.262563132924 25.262563132924 0.77775 + vertex 14.883210818105 25.830303993361 0.77775 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 40 0.77775 + vertex 60 23 0.77775 + vertex 60 23 0 + endloop +endfacet +facet normal 1 0 0 + outer loop + vertex 60 40 0.77775 + vertex 60 23 0 + vertex 60 40 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 27.737436867076 0 + vertex 15.262563132924 27.737436867076 0.77775 + vertex 14.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 15.262563132924 27.737436867076 0 + vertex 14.883210818105 27.169696006639 0.77775 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 37.474084379442 23 0.77775 + vertex 48.011309837942 23 0.77775 + vertex 42.5 24.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 37.474084379442 23 0.77775 + vertex 42.5 24.75 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 14.737436867076 0 + vertex 12.002309837942 17 0 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 0 + outer loop + vertex 43.169696006639 15.116789181895 0.77775 + vertex 42.5 15.25 0.77775 + vertex 42.5 15.25 0 + endloop +endfacet +facet normal -0.195090322016 -0.980785280403 -0 + outer loop + vertex 43.169696006639 15.116789181895 0.77775 + vertex 42.5 15.25 0 + vertex 43.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 52 10 0.77775 + vertex 60 0 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 15.063011877768 0.77775 + vertex 60 0 0.77775 + vertex 60 17 0.77775 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 12.830303993361 0.77775 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0.980785280403 0.195090322016 0 + outer loop + vertex 40.75 13.5 0.77775 + vertex 40.883210818105 12.830303993361 0 + vertex 40.75 13.5 0 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.737436867076 27.737436867076 0 + vertex 17.737436867076 27.737436867076 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal -0.555570233021 -0.831469612302 0 + outer loop + vertex 17.737436867076 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 0 30 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 27.169696006639 0.77775 + vertex 12.002309837942 24.936988122232 0.77775 + vertex 14.75 26.5 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 12.262563132924 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 12.262563132924 0.77775 + vertex 44.116789181895 12.830303993361 0 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 48.011309837942 23 0.77775 + vertex 37.474084379442 23 0.77775 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.830303993361 15.116789181895 0 + endloop +endfacet +facet normal 0.195090322016 -0.980785280403 0 + outer loop + vertex 16.5 15.25 0.77775 + vertex 15.830303993361 15.116789181895 0 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 41.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 41.262563132924 12.262563132924 0 + vertex 40.883210818105 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 16.5 15.25 0 + vertex 15.830303993361 15.116789181895 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 25.262563132924 0 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 44.116789181895 25.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 43.737436867076 25.262563132924 0 + vertex 44.116789181895 25.830303993361 0.77775 + vertex 44.116789181895 25.830303993361 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.75 13.5 0.77775 + vertex 40.75 13.5 0 + endloop +endfacet +facet normal 0.980785280403 -0.195090322016 0 + outer loop + vertex 40.883210818105 14.169696006639 0.77775 + vertex 40.75 13.5 0 + vertex 40.883210818105 14.169696006639 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 23 0 + vertex 60 23 0.77775 + vertex 54.002309837942 23 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 60 23 0 + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 30 0 + vertex 14.042553191489 30 0 + vertex 14.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 0 30 0 + vertex 14.883210818105 27.169696006639 0 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.262563132924 25.262563132924 0.77775 + vertex 41.830303993361 24.883210818105 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 25.262563132924 0 + vertex 41.830303993361 24.883210818105 0.77775 + vertex 41.830303993361 24.883210818105 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + vertex 41.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 41.830303993361 28.116789181895 0.77775 + vertex 41.262563132924 27.737436867076 0 + vertex 41.830303993361 28.116789181895 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 24.883210818105 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 43.737436867076 25.262563132924 0 + endloop +endfacet +facet normal -0.555570233021 0.831469612302 0 + outer loop + vertex 43.169696006639 24.883210818105 0.77775 + vertex 43.737436867076 25.262563132924 0 + vertex 43.169696006639 24.883210818105 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 43.169696006639 11.883210818105 0 + vertex 43.737436867076 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 52 10 0 + vertex 43.737436867076 12.262563132924 0 + vertex 54.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 60 23 0.77775 + vertex 52 40 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 54.002309837942 24.936988122232 0.77775 + vertex 52 40 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 41.422110817733 17 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 15.455907969142 17 0.77775 + vertex 41.422110817733 17 0 + vertex 12.002309837942 17 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 -0.831469612304 0.555570233017 + outer loop + vertex 12.002309837942 24.804173569059 0.110046151702 + vertex 6.011309837942 24.730643081307 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.455907969142 17 0.77775 + vertex 12.002309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 15.262563132924 14.737436867076 0.77775 + vertex 12.002309837942 17 0.77775 + vertex 14.883210818105 14.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 25.830303993361 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 17 0.77775 + vertex 0 10 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 17 0.77775 + vertex 6.011309837942 15.063011877768 0.77775 + vertex 6.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 42.5 15.25 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 42.5 15.25 0.77775 + vertex 43.169696006639 15.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 12.002309837942 17 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 14.883210818105 14.169696006639 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + vertex 14.75 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 0 30 0.77775 + vertex 0 23 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 24.936988122232 0.77775 + vertex 0 23 0.77775 + vertex 6.011309837942 23 0.77775 + endloop +endfacet +facet normal -0 -0 -1 + outer loop + vertex 40.75 26.5 0 + vertex 40.883210818105 25.830303993361 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 0 + outer loop + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 44.116789181895 14.169696006639 0 + endloop +endfacet +facet normal -0.980785280403 -0.195090322016 -0 + outer loop + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 14.169696006639 0 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 17.737436867076 12.262563132924 0.77775 + vertex 18.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal -0.831469612302 0.555570233021 0 + outer loop + vertex 17.737436867076 12.262563132924 0 + vertex 18.116789181895 12.830303993361 0.77775 + vertex 18.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 0 10 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 54.002309837942 24.936988122232 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 -0.980785280403 0.195090322015 + outer loop + vertex 54.002309837942 24.804173569059 0.110046151702 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 48.011309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 15.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 15.262563132924 12.262563132924 0.77775 + vertex 15.262563132924 12.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 43.737436867076 12.262563132924 0 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 54.002309837942 15.269356918694 0 + vertex 44.116789181895 12.830303993361 0 + vertex 48.011309837942 15.269356918694 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 0 30 0 + vertex 0 30 0.77775 + vertex 14.607403236621 30 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 0 30 0 + vertex 14.607403236621 30 0.77775 + vertex 14.042553191489 30 0 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 12.262563132924 0 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 41.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0.555570233021 0.831469612302 0 + outer loop + vertex 41.262563132924 12.262563132924 0 + vertex 41.830303993361 11.883210818105 0.77775 + vertex 41.830303993361 11.883210818105 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 10 0 + vertex 0 10 0.77775 + vertex 0 17 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 0 10 0 + vertex 0 17 0.77775 + vertex 0 17 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.25 13.5 0.77775 + vertex 44.25 13.5 0 + endloop +endfacet +facet normal -0.980785280403 0.195090322016 0 + outer loop + vertex 44.116789181895 12.830303993361 0.77775 + vertex 44.25 13.5 0 + vertex 44.116789181895 12.830303993361 0 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 41.422110817733 17 0 + vertex 34.416922535211 17 0.77775 + vertex 48.011309837942 17 0.77775 + endloop +endfacet +facet normal 0 1 0 + outer loop + vertex 41.422110817733 17 0 + vertex 48.011309837942 17 0.77775 + vertex 48.011309837942 17 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 30 0.77775 + vertex 52 40 0.77775 + vertex 52 40 0 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 52 30 0.77775 + vertex 52 40 0 + vertex 52 30 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.830303993361 24.883210818105 0 + vertex 16.5 24.75 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 40.883210818105 27.169696006639 0 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 41.262563132924 27.737436867076 0 + vertex 17.737436867076 27.737436867076 0 + vertex 17.169696006639 28.116789181895 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 0 10 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 6.011309837942 15.063011877768 0.77775 + vertex 14.883210818105 12.830303993361 0.77775 + vertex 12.002309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 43.737436867076 14.737436867076 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 17 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 48.011309837942 15.063011877768 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 15.830303993361 24.883210818105 0 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 15.262563132924 25.262563132924 0 + vertex 12.002309837942 23 0 + vertex 12.002309837942 24.730643081307 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.25 26.5 0.77775 + vertex 44.116789181895 25.830303993361 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 40.75 26.5 0 + vertex 18.116789181895 27.169696006639 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 40.883210818105 27.169696006639 0 + vertex 18.116789181895 27.169696006639 0 + vertex 17.737436867076 27.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 41.262563132924 14.737436867076 0 + vertex 17.169696006639 15.116789181895 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 17.169696006639 15.116789181895 0 + vertex 16.5 15.25 0 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 15.116789181895 0 + vertex 15.830303993361 15.116789181895 0.77775 + vertex 15.262563132924 14.737436867076 0.77775 + endloop +endfacet +facet normal 0.555570233021 -0.831469612302 0 + outer loop + vertex 15.830303993361 15.116789181895 0 + vertex 15.262563132924 14.737436867076 0.77775 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 40.883210818105 27.169696006639 0 + endloop +endfacet +facet normal 0.831469612302 -0.555570233021 0 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0 + vertex 41.262563132924 27.737436867076 0 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 37.474084379442 23 0.77775 + vertex 17.379510917074 23 0.77775 + endloop +endfacet +facet normal 0 -1 0 + outer loop + vertex 48.011309837942 23 0 + vertex 17.379510917074 23 0.77775 + vertex 12.002309837942 23 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 15.830303993361 15.116789181895 0 + vertex 15.262563132924 14.737436867076 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 12.002309837942 17 0 + vertex 15.262563132924 14.737436867076 0 + vertex 12.002309837942 15.269356918694 0 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 40.883210818105 25.830303993361 0.77775 + vertex 41.262563132924 25.262563132924 0.77775 + endloop +endfacet +facet normal 0.831469612302 0.555570233021 0 + outer loop + vertex 40.883210818105 25.830303993361 0 + vertex 41.262563132924 25.262563132924 0.77775 + vertex 41.262563132924 25.262563132924 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 15.262563132924 12.262563132924 0 + vertex 14.464705848856 10 0 + endloop +endfacet +facet normal 0 0 -1 + outer loop + vertex 14.883210818105 12.830303993361 0 + vertex 14.464705848856 10 0 + vertex 0 10 0 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 27.737436867076 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 41.262563132924 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 23 0.77775 + vertex 43.737436867076 25.262563132924 0.77775 + vertex 43.169696006639 24.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.116789181895 14.169696006639 0.77775 + vertex 44.25 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 44.25 26.5 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 44.116789181895 27.169696006639 0.77775 + vertex 48.011309837942 24.936988122232 0.77775 + vertex 52 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 27.169696006639 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 17.737436867076 27.737436867076 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 24.936988122232 0.77775 + vertex 54.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 41.866228156844 30 0.77775 + vertex 14.607403236621 30 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.262563132924 27.737436867076 0.77775 + vertex 14.607403236621 30 0.77775 + vertex 17.169696006639 28.116789181895 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.25 13.5 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 48.011309837942 15.063011877768 0.77775 + vertex 44.116789181895 12.830303993361 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 14.169696006639 0.77775 + vertex 18.25 13.5 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.25 26.5 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + vertex 18.116789181895 27.169696006639 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 54.002309837942 23 0 + vertex 54.002309837942 23 0.77775 + endloop +endfacet +facet normal -1 0 0 + outer loop + vertex 54.002309837942 24.730643081307 0 + vertex 54.002309837942 23 0.77775 + vertex 54.002309837942 24.804173569059 0.110046151702 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + vertex 18.25 13.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 41.830303993361 11.883210818105 0.77775 + vertex 18.25 13.5 0.77775 + vertex 18.116789181895 12.830303993361 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 17.737436867076 12.262563132924 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 12.830303993361 0.77775 + vertex 42.5 11.75 0.77775 + vertex 41.830303993361 11.883210818105 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 15.306548743796 10 0.77775 + vertex 52 10 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 17.737436867076 12.262563132924 0.77775 + vertex 52 10 0.77775 + vertex 42.5 11.75 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + vertex 41.262563132924 12.262563132924 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.25 26.5 0.77775 + vertex 40.75 26.5 0.77775 + vertex 40.883210818105 27.169696006639 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 37.474084379442 23 0.77775 + vertex 40.75 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 18.116789181895 25.830303993361 0.77775 + vertex 40.75 26.5 0.77775 + vertex 18.25 26.5 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 34.416922535211 17 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + endloop +endfacet +facet normal 0 0 1 + outer loop + vertex 40.883210818105 12.830303993361 0.77775 + vertex 17.737436867076 14.737436867076 0.77775 + vertex 18.116789181895 14.169696006639 0.77775 + endloop +endfacet +endsolid diff --git a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_analyze.pyc b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_analyze.pyc index de857a1..d515f63 100644 Binary files a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_analyze.pyc and b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_analyze.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_craft.pyc b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_craft.pyc index a1c598a..7e66b41 100644 Binary files a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_craft.pyc and b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_craft.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.pyc b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.pyc index 032927d..72d2c79 100644 Binary files a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.pyc and b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_polyfile.pyc differ diff --git a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_profile.pyc b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_profile.pyc index 275d81a..0824330 100644 Binary files a/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_profile.pyc and b/ReplicatorG/skein_engines/skeinforge-44/skeinforge_application/skeinforge_utilities/skeinforge_profile.pyc differ diff --git a/ReplicatorG/src/replicatorg/app/ui/MainWindow.java b/ReplicatorG/src/replicatorg/app/ui/MainWindow.java index c2086bc..17688ef 100644 --- a/ReplicatorG/src/replicatorg/app/ui/MainWindow.java +++ b/ReplicatorG/src/replicatorg/app/ui/MainWindow.java @@ -2621,11 +2621,21 @@ protected void handleOpen2(String path) { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); // loading may take a few moments for large files - build = new Build(this, path); + build = new Build(this, path); setCode(build.getCode()); - setModel(build.getModel()); + setModel(build.getModel()); + updateBuild(); + + if (getPreviewPanel().getModel() != null) { + // Center and place object on Platform upon load + getPreviewPanel().getModel().center(); + getPreviewPanel().getModel().layFlat(); + getPreviewPanel().getModel().putOnPlatform(); + } + buttons.updateFromMachine(machineLoader.getMachine()); + if (null != path) { handleOpenPath = path; mruList.update(path); diff --git a/ReplicatorG/src/replicatorg/app/ui/PreferencesWindow.java b/ReplicatorG/src/replicatorg/app/ui/PreferencesWindow.java index 0a7f3c8..f812db7 100644 --- a/ReplicatorG/src/replicatorg/app/ui/PreferencesWindow.java +++ b/ReplicatorG/src/replicatorg/app/ui/PreferencesWindow.java @@ -60,7 +60,7 @@ public class PreferencesWindow extends JFrame implements GuiConstants { JTextField logPathField; private void showCurrentSettings() { - Font editorFont = Base.getFontPref("editor.font","Monospaced,plain,12"); + Font editorFont = Base.getFontPref("editor.font","Monospaced,plain,14"); fontSizeField.setText(String.valueOf(editorFont.getSize())); String firmwareUrl = Base.preferences.get("replicatorg.updates.url", FirmwareUploader.DEFAULT_UPDATES_URL); firmwareUpdateUrlField.setText(firmwareUrl); @@ -163,6 +163,7 @@ public PreferencesWindow() { addCheckboxForPref(content,"Review GCode for potential toolhead problems before building","build.safetyChecks",true); addCheckboxForPref(content,"Break Z motion into seperate moves (normally false)","replicatorg.parser.breakzmoves",false); addCheckboxForPref(content,"Show starfield in model preview window","ui.show_starfield",false); + addCheckboxForPref(content,"Show axes","ui.show_axes",false); addCheckboxForPref(content,"Notifications in System tray","ui.preferSystemTrayNotifications",false); JPanel advanced = new JPanel(); @@ -206,6 +207,23 @@ public void actionPerformed(ActionEvent e) { backgroundColorButton.setVisible(true); content.add(backgroundColorButton,"wrap"); + JButton heatbedColorButton; + heatbedColorButton = new JButton("Choose heatbed color"); + heatbedColorButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // Note that this color is also defined in EditingModel.java + Color heatbedColor = new Color(Base.preferences.getInt("ui.heatbedcolor", 0)); + heatbedColor = JColorChooser.showDialog( + null, + "Choose Heatbed Color", + heatbedColor); + + Base.preferences.putInt("ui.heatbedcolor", heatbedColor.getRGB()); + Base.getEditor().refreshPreviewPanel(); + } + }); + heatbedColorButton.setVisible(true); + content.add(heatbedColorButton,"wrap"); content.add(new JLabel("Firmware update URL: "),"split"); firmwareUpdateUrlField = new JTextField(34); diff --git a/ReplicatorG/src/replicatorg/app/ui/modeling/EditingModel.java b/ReplicatorG/src/replicatorg/app/ui/modeling/EditingModel.java index 8d8c378..2e46d3a 100644 --- a/ReplicatorG/src/replicatorg/app/ui/modeling/EditingModel.java +++ b/ReplicatorG/src/replicatorg/app/ui/modeling/EditingModel.java @@ -39,7 +39,7 @@ public class ReferenceFrame { public Vector3d zAxis; public ReferenceFrame() { - origin = new Point3d(); + origin = new Point3d(0,0,0); zAxis = new Vector3d(0d,0d,1d); } } @@ -403,7 +403,7 @@ public void center() { //translateObject(xoff, yoff, zoff); translateObject((xoff + buildVol.getX()/2), (yoff + buildVol.getY()/2), zoff); } - + /** * Raise the object's lowest point to Z=0. */ diff --git a/ReplicatorG/src/replicatorg/app/ui/modeling/PreviewPanel.java b/ReplicatorG/src/replicatorg/app/ui/modeling/PreviewPanel.java index de08756..d40aed8 100644 --- a/ReplicatorG/src/replicatorg/app/ui/modeling/PreviewPanel.java +++ b/ReplicatorG/src/replicatorg/app/ui/modeling/PreviewPanel.java @@ -76,7 +76,7 @@ public class PreviewPanel extends JPanel { public void setModel(BuildModel buildModel) { if (model == null || buildModel != model.getBuildModel()) { - if (buildModel != null) { + if (buildModel != null) { model = new EditingModel(buildModel, mainWindow); setScene(model); } else { @@ -104,9 +104,13 @@ public void rebuildScene(){ } scene.detach(); scene = createSTLScene(); - objectBranch = model.getGroup(); - model.updateModelColor(); - sceneGroup.addChild(objectBranch); + + if (model != null) { + objectBranch = model.getGroup(); + model.updateModelColor(); + sceneGroup.addChild(objectBranch); + } + univ.addBranchGraph(scene); } @@ -117,7 +121,7 @@ private void getBuildVolume(){ if(mc instanceof Machine){ MachineModel mm = mc.getModel(); buildVol = mm.getBuildVolume(); - Base.logger.fine("Dimensions:" + buildVol.getX() +','+ buildVol.getY() + ',' + buildVol.getZ()); + Base.logger.fine("Dimensions:" + buildVol.getX() +','+ buildVol.getY() + ',' + buildVol.getZ()); } } @@ -266,7 +270,7 @@ public Node makeDirectedLight2() { public Shape3D makeBoxFrame(Point3d ll, Vector3d dim) { Appearance edges = new Appearance(); - edges.setLineAttributes(new LineAttributes(3,LineAttributes.PATTERN_SOLID,true)); + edges.setLineAttributes(new LineAttributes(1,LineAttributes.PATTERN_SOLID,true)); edges.setColoringAttributes(new ColoringAttributes(.9f,1f,1f,ColoringAttributes.NICEST)); double[] coords = new double[wireBoxCoordinates.length]; for (int i = 0; i < wireBoxCoordinates.length;) { @@ -315,9 +319,12 @@ private void loadPoint(Point3d point, double[] array, int idx) { } private Shape3D makePlatform(Point3d lower, Point3d upper) { - Color3f color = new Color3f(.05f,.35f,.70f); + //Color heatbedColor = new Color(0.5f, 0.5f, 0.5f); + Color heatbedColor = new Color(Base.preferences.getInt("ui.heatbedcolor", 0)); + Color3f heatbedColor3f = new Color3f(heatbedColor.getRed()/255f, heatbedColor.getGreen()/255f, heatbedColor.getBlue()/255f); + ColoringAttributes ca = new ColoringAttributes(); - ca.setColor(color); + ca.setColor(heatbedColor3f); Appearance solid = new Appearance(); solid.setTransparencyAttributes(new TransparencyAttributes(TransparencyAttributes.NICEST,0.13f)); //solid.setMaterial(m); @@ -345,7 +352,7 @@ private Shape3D makePlatform(Point3d lower, Point3d upper) { public Node makeBoundingBox() { Group boxGroup = new Group(); - // TODO: Change these dimensions if \it has a custom buid-volume! Display cut-outs?! + // TODO: Change these dimensions if \it has a custom build-volume! Display cut-outs?! // Same for the platform if(buildVol == null) { @@ -392,12 +399,12 @@ public Node makeBackground() { public Node makeBaseGrid() { if(buildVol instanceof BuildVolume) - { + { Group baseGroup = new Group(); double gridSpacing = 10.0; // Dim grid has hash marks at 10mm intervals. // Set up the appearance object for the central crosshairs. Appearance crosshairAppearance = new Appearance(); - crosshairAppearance.setLineAttributes(new LineAttributes(3,LineAttributes.PATTERN_SOLID,true)); + crosshairAppearance.setLineAttributes(new LineAttributes(1,LineAttributes.PATTERN_SOLID,true)); crosshairAppearance.setColoringAttributes(new ColoringAttributes(.9f,1f,1f,ColoringAttributes.NICEST)); // Set up the crosshair lines LineArray crosshairLines = new LineArray(2*2,GeometryArray.COORDINATES); @@ -515,6 +522,8 @@ public void align() { } + final static Point3d origin = new Point3d(0,0,0); + public BranchGroup createSTLScene() { getBuildVolume(); // Create the root of the branch graph @@ -531,6 +540,10 @@ public BranchGroup createSTLScene() { sceneGroup.addChild(makeBackground()); sceneGroup.addChild(makeBaseGrid()); + if(Base.preferences.getBoolean("ui.show_axes", false)) { + sceneGroup.addChild(makeAxes(origin)); + } + if(Base.preferences.getBoolean("ui.show_starfield", false)) { sceneGroup.addChild(makeStarField(400, 2)); } @@ -554,15 +567,18 @@ public BranchGroup createSTLScene() { return objRoot; } - + + // These values were determined experimentally to look pretty dang good. final static Vector3d CAMERA_TRANSLATION_DEFAULT = new Vector3d(0,0,290); + final static Vector3d ROTATION_CENTER_DEFAULT = new Vector3d(30,30,30); final static double ELEVATION_ANGLE_DEFAULT = 1.278; final static double TURNTABLE_ANGLE_DEFAULT = 0.214; final static double CAMERA_DISTANCE_DEFAULT = 300d; // 30cm + Vector3d rotationCenter = new Vector3d(ROTATION_CENTER_DEFAULT); Vector3d cameraTranslation = new Vector3d(CAMERA_TRANSLATION_DEFAULT); double elevationAngle = ELEVATION_ANGLE_DEFAULT; double turntableAngle = TURNTABLE_ANGLE_DEFAULT; @@ -575,6 +591,12 @@ Transform3D getViewTransform() { } // double VIEW_SCALE = 100d; + + private void updateVP(Vector3d v3d) { + rotationCenter = v3d; + updateVP(); + } + private void updateVP() { TransformGroup viewTG = univ.getViewingPlatform().getViewPlatformTransform(); Transform3D t3d = new Transform3D(); @@ -584,7 +606,7 @@ private void updateVP() { trans.setTranslation(cameraTranslation); Transform3D drop = new Transform3D(); Transform3D raise = new Transform3D(); - drop.setTranslation(new Vector3d(0,0,50)); + drop.setTranslation(rotationCenter); raise.invert(drop); rotX.rotX(elevationAngle); rotZ.rotZ(turntableAngle); @@ -596,8 +618,8 @@ private void updateVP() { viewTG.setTransform(t3d); if (Base.logger.isLoggable(Level.FINE)) { - Base.logger.fine("Camera Translation: "+cameraTranslation.toString()); - Base.logger.fine("Elevation "+Double.toString(elevationAngle)+", turntable "+Double.toString(turntableAngle)); + Base.logger.fine("Camera Translation: "+ cameraTranslation.toString()); + Base.logger.fine("Elevation "+ Double.toString(elevationAngle)+", turntable "+Double.toString(turntableAngle)); } } @@ -653,6 +675,14 @@ public void viewXZ() { public void usePerspective(boolean perspective) { univ.getViewer().getView().setProjectionPolicy(perspective?View.PERSPECTIVE_PROJECTION:View.PARALLEL_PROJECTION); } - - + + public void setCenterRotation() + { + updateVP(new Vector3d(buildVol.getX() / 2, buildVol.getY() / 2, buildVol.getZ() / 2)); + } + + public void setOriginRotation() + { + updateVP(new Vector3d(0,0,0)); + } } diff --git a/ReplicatorG/src/replicatorg/app/ui/modeling/Tool.java b/ReplicatorG/src/replicatorg/app/ui/modeling/Tool.java index aec55bf..cb113bb 100644 --- a/ReplicatorG/src/replicatorg/app/ui/modeling/Tool.java +++ b/ReplicatorG/src/replicatorg/app/ui/modeling/Tool.java @@ -73,24 +73,21 @@ public void update() { abstract JPanel getControls(); final protected ToolPanel parent; + + protected DragMode mode; + public Tool(ToolPanel parent) { + mode = DragMode.ROTATE_VIEW; this.parent = parent; } protected Point startPoint = null; protected int button = 0; + public void mouseDragged(MouseEvent e) { if (startPoint == null) return; Point p = e.getPoint(); - DragMode mode = DragMode.ROTATE_VIEW; - if (Base.isMacOS()) { - if (button == MouseEvent.BUTTON1 && !e.isShiftDown()) { mode = DragMode.ROTATE_VIEW; } - else if (button == MouseEvent.BUTTON1 && e.isShiftDown()) { mode = DragMode.ROTATE_VIEW; } - } else { - if (button == MouseEvent.BUTTON1) { mode = DragMode.ROTATE_VIEW; } - else if (button == MouseEvent.BUTTON3) { mode = DragMode.ROTATE_VIEW; } - } double xd = (double)(p.x - startPoint.x); double yd = (double)(p.y - startPoint.y); switch (mode) { @@ -108,6 +105,17 @@ public void mouseDragged(MouseEvent e) { public void mouseMoved(MouseEvent e) { } public void mouseClicked(MouseEvent e) { + + button = e.getButton(); + + if (button == MouseEvent.BUTTON1) { + if (mode == DragMode.ROTATE_VIEW) { + mode = DragMode.TRANSLATE_VIEW; + } else { + mode = DragMode.ROTATE_VIEW; + } + } + } public void mouseEntered(MouseEvent e) { } diff --git a/ReplicatorG/src/replicatorg/app/ui/modeling/ViewTool.java b/ReplicatorG/src/replicatorg/app/ui/modeling/ViewTool.java index 42c787b..7b3fe17 100644 --- a/ReplicatorG/src/replicatorg/app/ui/modeling/ViewTool.java +++ b/ReplicatorG/src/replicatorg/app/ui/modeling/ViewTool.java @@ -5,6 +5,7 @@ import javax.swing.Icon; import javax.swing.JButton; +import javax.swing.JCheckBox; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; @@ -22,6 +23,8 @@ public String getButtonName() { return "View"; } + JCheckBox perspectiveView; + public JPanel getControls() { JPanel p = new JPanel(new MigLayout("fillx,gap 0,wrap 2","[50%]0[50%]")); JButton b; @@ -57,11 +60,38 @@ public void actionPerformed(ActionEvent arg0) { }); p.add(b,"growx,growy"); + b = createToolButton("Origin View","images/center-object.png"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + parent.preview.setOriginRotation(); + } + }); + p.add(b,"growx,growy"); + + b = createToolButton("Center View","images/center-object.png"); + b.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + parent.preview.setCenterRotation(); + } + }); + p.add(b,"growx,growy"); + +/* It is lacking the Perspective code to allow smooth transition from Perspective to Non Perspective view */ +/* + perspectiveView = new JCheckBox("Perspective View", true); + perspectiveView.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + parent.preview.usePerspective(perspectiveView.isSelected()); + } + }); + p.add(perspectiveView,"growx,wrap"); +*/ + return p; } public String getInstructions() { - return "Drag to rotate
Mouse wheel to zoom"; + return "Click mouse button to switch between camera mode (rotate, translate)
Drag to move camera
Mouse wheel to zoom"; } public String getTitle() { diff --git a/ReplicatorG/src/replicatorg/app/util/PythonUtils.java b/ReplicatorG/src/replicatorg/app/util/PythonUtils.java index 7ed4eb8..ddc19d8 100644 --- a/ReplicatorG/src/replicatorg/app/util/PythonUtils.java +++ b/ReplicatorG/src/replicatorg/app/util/PythonUtils.java @@ -26,7 +26,7 @@ public class PythonUtils { /** * Preference name for preferred Python path. */ - final static String PYTON_PATH_PREF = "python.default_path"; + final static String PYTHON_PATH_PREF = "python.default_path"; /** * Callback for Python selector method. @@ -96,17 +96,19 @@ public static String getPythonPath() { */ public static String getPythonPath(Version minVersion, Version maxVersion) { // First, check if our cached python path, if any, meets the version requirements. - boolean versionOk = false; + boolean versionOk = false; + if (pythonVersion != null) { + versionOk = true; if (minVersion != null && pythonVersion.compareTo(minVersion) < 0) { versionOk = false; } - if (maxVersion != null && maxVersion.compareTo(pythonVersion) < 0) { + if (maxVersion != null && pythonVersion.compareTo(maxVersion) > 0) { versionOk = false; } } - if (versionOk && pythonPath != null) { + if (versionOk && pythonPath != null) { return pythonPath; } else { pythonPath = null; @@ -119,7 +121,8 @@ public static String getPythonPath(Version minVersion, Version maxVersion) { // Assemble a list of candidate paths. // First, check if the user has explicitly set the Python path. { - String path = Base.preferences.get(PYTON_PATH_PREF, null); + String path = Base.preferences.get(PYTHON_PATH_PREF, null); + if (path != null) { File candidate = new File(path); if (candidate.exists()) { @@ -127,6 +130,7 @@ public static String getPythonPath(Version minVersion, Version maxVersion) { } } } + // Second, look in the system path. This is the default solution for // all platforms. String paths[] = System.getenv("PATH").split(File.pathSeparator); @@ -159,24 +163,27 @@ public static String getPythonPath(Version minVersion, Version maxVersion) { } } + /* run thru candidates and find min/max version for (String c : candidates) { @SuppressWarnings("unused") Version v = checkVersion(c,minVersion,maxVersion); } - + */ + + // Filter candidates by version Vector viableCandidates = new Vector(); - for (String candidate : candidates) { - Version v = checkVersion(candidate, minVersion, maxVersion); + for (String c : candidates) { + Version v = checkVersion(c, minVersion, maxVersion); if (v != null) { - viableCandidates.add(candidate); + viableCandidates.add(c); } } if (selector != null && viableCandidates.size() > 1) { String path = selector.selectPythonPath(viableCandidates); if (path != null) { - Base.preferences.put(PYTON_PATH_PREF, path); + Base.preferences.put(PYTHON_PATH_PREF, path); pythonPath = path; pythonVersion = checkVersion(pythonPath); } @@ -228,7 +235,6 @@ public static Version checkVersion(String path) { BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); int returnCode = p.waitFor(); if (returnCode != 0) { return null; } - String line = reader.readLine(); Pattern pattern = Pattern.compile("Python ([0-9]+)\\.([0-9]+)(?:\\.([0-9]+))?"); while (line != null) { @@ -242,7 +248,7 @@ public static Version checkVersion(String path) { line = reader.readLine(); } } catch (Exception e) { - Base.logger.log(Level.SEVERE,"Error attempting to detect python",e); + Base.logger.log(Level.INFO,"Error attempting to detect python.",e); } return null; } @@ -254,7 +260,20 @@ public static Version checkVersion(String path) { */ public static boolean checkTkInter() { if (getPythonPath() == null) { return false; } - ProcessBuilder pb = new ProcessBuilder(getPythonPath(),"-c","import Tkinter"); + + // http://tkinter.unpythonic.net/wiki/ + // Note: As of Python 3.0, Tkinter and related modules were replaced by the tkinter package. + + String Tkinter_command; + + if (pythonVersion.compareTo(new Version(3,0,0)) > 0) { + Tkinter_command = "import tkinter"; + } else { + Tkinter_command = "import Tkinter"; + } + + ProcessBuilder pb = new ProcessBuilder(getPythonPath(),"-c",Tkinter_command); + try { Process p = pb.start(); int returnCode = p.waitFor(); @@ -295,6 +314,11 @@ public static boolean interactiveCheckTkInter(final Frame parent, String procedu public static boolean interactiveCheckVersion(Frame parent, String procedureName, Version min, Version max) { getPythonPath(min,max); Version v = pythonVersion; + + if (v == null) { + Base.logger.log(Level.INFO,"You may have Python installed but it isn't within the required version range: " + min.toString() + " until " + max.toString()); + } + if (procedureName == null) { procedureName = "This operation"; } if (v != null) { if (min != null && min.compareTo(v) == 1) { @@ -311,7 +335,7 @@ public static boolean interactiveCheckVersion(Frame parent, String procedureName } return true; } - displayPythonErrorDialog(parent,procedureName+" requires that a Python interpreter be installed."); + displayPythonErrorDialog(parent,procedureName+" requires that a Python interpreter be installed. (Version " + min.toString() + " until " + max.toString() + ")"); return false; } @@ -343,7 +367,7 @@ public void run() { * Sets the new preferred place to find python */ public static void setPythonPath(String path) { - Base.preferences.put(PythonUtils.PYTON_PATH_PREF, path); + Base.preferences.put(PythonUtils.PYTHON_PATH_PREF, path); pythonPath = path; } } diff --git a/ReplicatorG/src/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator.java b/ReplicatorG/src/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator.java index 0b7a86b..1195194 100644 --- a/ReplicatorG/src/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator.java +++ b/ReplicatorG/src/replicatorg/plugin/toolpath/skeinforge/SkeinforgeGenerator.java @@ -294,8 +294,9 @@ public boolean visualConfigure(Frame parent, int x, int y, String name) { // First check for Python. boolean hasPython = PythonUtils.interactiveCheckVersion(parent, - name, new PythonUtils.Version(2, 5, 0), - new PythonUtils.Version(3, 0, 0)); + name, + new PythonUtils.Version(2, 5, 0), // 2.5.0 + new PythonUtils.Version(3, 0, 0)); // 3.0.0 if (!hasPython) { return false; }